스프링을 사용해서 프로그래밍할 때 어노테이션이 정말 많이 사용됩니다. 이런 어노테이션들은 클래스나 메소드 앞에 사용되어 해당 클래스, 메소드에 특별한 기능이나 의미를 더하게 됩니다.
Annotation은 사전적으로는 주석을 의미하지만, 자바에서는 코드의 메타 데이터 역할을 수행합니다. 기본적인 내용은 자바 어노테이션 포스트를 참조해주세요.
스프링에서 사용되는 어노테이션들은 엄청 많은 종류들이 존재합니다. 그렇기 때문에 우선적으로는 자주 등장하는 어노테이션들부터 정리하고 차차 추가해나가볼까 합니다.
@Autowired
는 의존성 주입에 사용됩니다. 의존성 주입은 3가지 방식을 사용합니다.
@Autowired
어노테이션을 붙인다.@Autowired
어노테이션을 붙인다.@Autowired
어노테이션을 붙인다.@Component
는 컴포넌트 스캔을 통해 자동으로 빈으로 등록되고자 하는 클래스를 나타냅니다. 스프링은 @Component
가 붙은 클래스를 자동으로 빈에 등록합니다.
@ComponentScan
은 @Component, @Controller, @Configuration, @Repository, @Service
로 등록된 클래스를 찾아 빈으로 등록합니다. 이때 @ComponentScan
이 사용된 위치의 패키지와 그 하위 패키지들의 클래스들을 찾습니다.
@Bean
은 빈을 등록합니다.
@Configuration
은 @Bean
어노테이션이 붙은 메소드들을 빈으로 정의(등록)합니다.
@Controller
는 스프링에게 클래스가 Controller(요청, 응답 처리)임을 알립니다.
@Service
는 스프링에게 비즈니스 로직(서비스)를 처리하는 클래스임을 알립니다.
@Repository
는 스프링에게 DB 로직(외부 IO)을 처리하는 클래스임을 알립니다.
@RequestMapping
은 요청에 대해 URL을 매핑합니다.
파라미터에 따라서 동작이 조금씩 달라지는데 각 동작은 예제 코드를 통해 설명합니다.
@Controller
@RequestMapping
class MemberController1 {
//모든 요청을 받아들임
//class 레벨에 @RequestMapping을 사용하면 하위 메소드들에 모두 적용이됩니다.
}
@Controller
@RequestMapping("/newmember")
class MemberController2 {
@RequestMapping(method = RequestMethod.POST)
public void addMember() {
// /newmember로 들어오는 요청에 대해서만 처리
// POST method 요청에 대해서만 처리
//즉, 이 메소드는 POST로 들어온 /newmember 요청만을 처리합니다.
}
}
@Controller
@RequestMapping("/newmember")
class MemberController3 {
@RequestMapping("/post")
public void addMember() {
//이 메소드의 실제 URL은 /newmember/post
}
}
MemberController2
에서 @RequestMapping(method = RequestMethod.POST)
로 요청 메소드를 표현했는데요. 이 경우에는 위와같이 표현하는 것보다 각 요청 메소드에 대응되는 @GetMapping, @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping
를 사용하는 것이 권장됩니다.
@RequestParam
은 URL의 파라미러를 메소드의 파마리터와 매칭시켜서 파라미터를 처리할 수 있께 해줍니다.
@Controller
class MemberController {
@GetMapping("/member")
public String getMember(@RequestParam String name) {
//https://xxx.com?name=apple라는 URL GET 요청이 들어오면,
String membername = name; //membername = apple
}
}
@RequestHeader
요청의 헤더를 가져옵니다. 가져온 헤더는 @RequestHeader
가 사용된 메소드의 파라미터로 사용될 수 있습니다.
@RequestBody
는 Body에 대한 요청을 처리합니다. 주로 JSON을 객체로 만들어주는 작업을 하게 됩니다.
스프링에 Jackson이라는 JSON 데이터 처리 라이브러리가 내장되어있기 때문에 JSON 요청을 기본적으로 받습니다. 필요하다면 다른 데이터 타입을 받을 수 있는 라이브러리를 설치해서 이용하면 다른 데이터 타입을 받아들일 수도 있습니다.
@Controller
class MemberController {
@GetMapping("/member")
public String getMember(@RequestBody Member member) {
//https://xxx.com?name=apple라는 URL GET 요청이 들어오면,
String membername = member.name; //membername = apple
}
}
@ModelAttribute
는 폼(form) 형태의 Body, 파라미터를 setter를 통해 객체에 1:1 바인딩합니다. JSON 데이터를 요구했던 @RequestBody
과는 다르게 multipart/form-data
형식을 받습니다.
multipart/form-data가 무엇인지는 이 포스트를 참조해주세요.
@RequestPart
는 요청 Body에 multipart/form-data
를 받을 때 사용합니다.
@ModelAttribute
과@RequestPart
의 비교는 이 포스트를 참조해주세요.
@PathVariable
은 URL에서 변수를 사용할 수 있게 해줍니다. 중괄호 {}
로 감싼 부분을 변수로 사용할 수 있게 해줍니다.
@GetMapping("/members/{name}")
public void getMember(@PathVariable String name) { }
@ResponseBody
는 응답 Body에 JSON 또는 xml의 형태로 데이터를 담아 요청에 대해 응답합니다.
@ResponseStatus
는 HTTP 응답 코드를 반환할 수 있게 해줍니다. 주로 응답 코드를 반환해야하는 예외 처리 상황에서 사용합니다.