1. Annotation 사용 이유
Annotation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 합니다. Annotation을 활용하여 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 합니다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있습니다.
이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가됩니다. Spring에서 사용하는 많은 Annotation에 대하여 정리해보려고 합니다.
2. 주요 어노테이션
| 어노테이션 | 설명 |
|---|---|
| @Controller | 해당 클래스가 Controller임을 나타내기 위한 어노테이션 |
| @RequestMapping | 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션 |
| @RequestParam | Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션 |
| @ModelAttribute | Controller 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션 |
| @Autowired | Spring Framework에서 Bean 객체를 주입받기 위한 방법 |
| @GetMapping | RequestMapping(Method=RequestMethod.GET)과 똑같은 역할을 함 (Get 방식) |
| @PostMapping | RequestMapping(Method=RequestMethod.POST)과 똑같은 역할을 함(POST방식) |
| @SessionAttributes Model | 객체를 세션에 저장하고 사용하기 위한 어노테이션 |
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
}
특정 url로부터 요청을 받으면 어떤 Controller에서 처리할 지 알아야 한다.
이 때, 특정 url을 요청을 수행할 Controller과 매핑하여 지정하는 어노테이션이 @RequestMapping이다.
@RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행됩니다.
Class 단위에 사용하면 하위 메소드에 모두 적용됩니다.
메소드에 적용되면 해당 메소드에서 지정한 방식으로 URI를 처리합니다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user 요청을 처리
}
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String addUser(Model model) {
// GET method, /user/info 요청을 처리
}
}
특정 url로부터 요청을 받으면 어떤 Controller에서 처리할 지 알아야 한다.
이 때, 특정 url을 요청을 수행할 Controller과 매핑하여 지정하는 어노테이션이 @RequestMapping이다.
@RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행됩니다.
Class 단위에 사용하면 하위 메소드에 모두 적용됩니다.
메소드에 적용되면 해당 메소드에서 지정한 방식으로 URI를 처리합니다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user 요청을 처리
}
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String addUser(Model model) {
// GET method, /user/info 요청을 처리
}
}
URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용합니다.
Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킵니다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user 요청을 처리
// https://naver.com?nickname=dog&old=10
String sub = nickname + "_" + age;
...
}
}
클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결(바인딩)합니다.
RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구합니다. @RequestBody가 json을 받는 것과 달리 @ModenAttribute 의 경우에는 json을 받아 처리할 수 없습니다.
Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 아래의 3가지가 있습니다.
Bean을 주입받기 위하여 @Autowired 를 사용합니다.
Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name 확인) Bean을 주입합니다.
@Autowired
생성자 (@AllArgsConstructor 사용)
setter
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@GetMapping("/")
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
////////////////////////////////////
// 위와 아래 메소드는 동일하게 동작합니다. //
////////////////////////////////////
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
}
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user 요청을 처리
}
////////////////////////////////////
// 위와 아래 메소드는 동일하게 동작합니다. //
////////////////////////////////////
@PostMapping('/')
public String addUser(Model model) {
// POST method, /user 요청을 처리
}
}
모델(Model) 정보를 HTTP 세션에 저장해주는 애노테이션입니다.
HttpSession을 직접 사용할 수도 있지만
이 어노테이션에 설정한 이름에 해당하는 모델 정보를 자동으로 세션에 넣어줍니다.
@ModelAttribute는 세션에 있는 데이터도 바인딩합니다.
여러 화면(또는 요청)에서 사용해야 하는 객체를 공유할 때 사용합니다.
ex) 장바구니, 여러 화면에 걸쳐 나눠진 회원가입 등
@Controller
@SesstionAttributes("test") //SessionAttribute 사용 보통 sessionStatus와 함께 사용한다
public class ExampleController {
@GetMapping("/events")
//SessionStatus를 활용
public String createEvent(@Validated @ModelAttribute Person person,SessionStatus sessionStatus){
Persion person = new Persoon();
person.setName = ("gd");
model.addAttribute("person",person);
sessionStatus.setComplete(); //해당 페이지에서 저장된 세션 값 초기화(완성)
return "/person/form";
}
}
3. 롬북 어노테이션
| 어노테이션 | 설명 |
|---|---|
| @Setter | Class 모든 필드의 Setter method를 생성해줌 |
| @Getter | Class 모든 필드의 Getter method를 생성해줍니다. |
| @AllArgsConstructor | Class 모든 필드 값을 파라미터로 받는 생성자를 추가합니다. |
| @NoArgsConstructor | Class 기본 생성자를 자동으로 추가해줍니다. |
| @ToString | Class 모든 필드의 toString method를 생성한다. |