JAVA/spring
[Annotation] @란?
24시간이모자란
2023. 2. 8. 17:48
Annotation 이란
- 스프링 부트 코드를 보면 @ 기호가 보이는데 Annotation 이라 불린다.
- Annotation 은 영어 뜻으로 주석 이지만, Java 에서는 단순한 주석이 아니다.
- 프로그램에 데이타를 제공하는 메타데이타이다.
- Annotation으로 Bean을 주입하기도 하고 , getter 와 setter을 자동으로 생성
- 장점 : 코드량이 감소하고 생산성 향상
스프링 프레임워크 어노테이션 종류
- Spring Core Annotations
- Spring Web Annotations
- Spring Boot Annotations
- Spring Scheduling Annotations
- Spring Data Annotations
- Spring Bean Annotations
참고
https://www.geeksforgeeks.org/spring-core-annotations/
Spring Core Annotations - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
Annotation과 역할
자주 보이는 Annotatoin 을 간략히 설명하겠다.
@Component
- Component 어노테이션 가진 클래스를 스프링 프레임워크의 "컴포넌트"임을 명시한다.
- 클래스를 스프링의 Bean으로 등록할 때 사용하는 Annotation이다.
- classpath 스캐닝과, annotation-based configuration 을 사용할 때 감지된다.
- classpath scanning : 스프링이 관리할 클래스들을 스캔하는것.
- annotation-based configuration : 자바 빈 컴포넌트들을 xml에 등록하지 않고 Annotation을 사용하여 등록하는 것.
- 문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/stereotype/Component.html
- 코드 예시
@Component(value="star")//id = star로 세팅된 bean 등록
public class Man {
public Man() {
System.out.println("hi");
}
}
@ComponentScan
- 스프링 빈(Bean)으로 등록될 준비가 된 클래스들을 스캔해 빈으로 등록해 주는 과정
- 스캔대상 : @Compoenent 가 붙은 모든 annotation. 또는 xml component-scan 태그를 찾아, application context에
- @Configuration, @Service, @Repository, @Controller과 같 @Component가 포함된 어노테이션 모두 다 스캔 대상이다.
- XML <context:component-scan base-package=""/> 태그도 스캔대상.
- 문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html
@Bean
- 스프링 IOC 컨테이너가 관리할 빈으로 등록
- Bean의 name 속성을 적어주면 bean id로 등록된다.
- 개발자가 제어가 불가능한 외부 라이브러리 같은 것들을 Bean으로 만들 때 사용
- 문서 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html
- 코드 예시
@Bean({"b1", "b2"}) // b1 또는 b2로 빈 액세스 가능. 근데 myBean으론 빈 액세스 불가능
public MyBean myBean() {
// instantiate and configure MyBean obj
return obj;
}
@RequestHeader
- Request의 header값을 가져오며, 해당 Annotaion을 사용한 메서드의 파라미터에 사용
@ModelAttribute
- 클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결(바인딩)합니다.
- RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형식이다
- @RequestBody가 json을 받는 것과 달리 @ModenAttribute의 경우에는 json을 받아 처리할 수 없다
@RequestMapping
- @RequestMapping(value=”“) 포맷으로 작성하며, URI 요청과 value 값이 일치하면 해당 클래스나 메서드가 실행된다.
- Controller 객체 안의 메서드와 클래스에 적용 가능.
- Class에 사용되면 하위 메서드에 모두 적용
- 메소드에 적용되면 해당 메서드에서 지정한 방식으로 URI를 처리합니다
@Controller
- 컨트롤러를 가진 클래스는 컨트롤러 역할을 수행하도록 지시한다.
- 클래스에만 사용 가능.
- 스테레오타입 어노테이션
- 디스패처가 컨트롤러 어노테이션 같은 스테레오타입 어노테이션을 스캔하고, @RequestMapping을 감지한다.
- 예시 코드
@Controller //이 클래스는 컨트롤러 역할을 합니다.
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
/*
field dependency injection 입니다.
개발자가 userService 인스턴스를 생성하지 않고
스프링이 자동으로 생성하고 관리합니다.(의존성 주입)
*/
@Autowired
private UserService userService;
@RequestMapping(value = "/users", method = RequestMethod.GET)//URI 가 users로 끝나는get request를 받습니다.
public String list(Model model) {
model.addAttribute("users", userService.findAll());
return "user-list";
}
@RequestMapping(value = "/users", method = RequestMethod.POST)//URI 가 users로 끝나는post request를 받습니다.
public String create(@ModelAttribute User user) {
userService.create(user);
return "redirect:/users";
}
}
@SpringBootApplication
- 컴포넌트 스캐닝, autoconfiguration , property 지원을 가져오는 메타 어노테이션
@GetMapping
- RequestMapping(Method=RequestMethod.GET)과 같다.
@PostMapping
- RequestMapping(Method=RequestMethod.POST)과 같다.
@RestController //@controller + @ResponseBody 합친 annotation입니다.
@RequestMapping("/api") //api로 끝나는 경로를 받습니다.
public class GetController {
...
@GetMapping("/hi") //api/hi 경로를 받습니다.
public String getParameter() {
return "Hello Spring";
}
@PostMapping("/postMethod") //post 통신을 받습니다.
public String postMethod() {
return "OK";
}
}
참고
https://melonicedlatte.com/2021/07/18/182600.html
스프링(Spring)에서 자주 사용하는 Annotation 개념 및 예제 정리 - Easy is Perfect
melonicedlatte.com