이번주부터 스프링 부트를 배우기 시작했다.
배우면 서 Annotation을 많이 사용해서 어떤 어노테이션이 많이 쓰이는지 그리고 무슨 역할을 하는지 알아보자.
Annotation??
Java에서 Annotation 이라는 기능이 있다. 사전상으로는 주석의 의미지만 Java에서는 주석 이상의 기능을 가지고 있다.
Annotation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다.
Annotation의 자세한 내용은 이 글을 참고하자.
https://lala9663.tistory.com/99
Annotation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다. Annotation을 활용하여 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 한다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있다.
이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.
Spring의 대표적인 Annotation
@Component
개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation이다. Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록한다.
@Component(value="myman")
public class Man {
public Man() {
System.out.println("hi");
}
}
@ComponentScan
Spring FrameWork는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록한다. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록될 클래스들을 스캔하여 Bean으로 등록해준다.
@Bean
@Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러라와 같은 것들을 Bean으로 만들 때 사용한다.
@Autowired
Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 3가지가 있다. Bean을 주입받기 위하여 @Autowired를 사용한다.
Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name확인) Bean을 주입한다.
- @Autowired
- 생성자(@AllArgsConstructor 사용)
- setter
@Controller
Spring에게 해당 Class 가 Controller의 역할을한다고 명시하기 위해 사용하는 Annotation이다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
}
@RequestHeader
Request의 header 값을 가져울 수 있으며, 해당 Annotation을 쓴 메소드의 파라미터에 사용한다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestHeader(value="Accept-Language") String acceptLanguage) {
// GET method, /user 요청을 처리
}
}
@RequestMapping
@RequestMapping(value="")와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행된다. Controller 객체 안의 메서드와 클래스에 적용 가능하며, 아래와 같이 사용한다.
- 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 요청을 처리
}
}
@GetMapping
RequestMapping(Method=RequestMethodGET)과 똑같은 역할을 하며, 아래와 같이 사용한다.
@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 요청을 처리
}
}
@PostMapping
RequestMapping(Method=RequestMethod.POST)과 똑같은 역할을 하며, 아래와 같이 사용한다.
@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 요청을 처리
}
}
@RequestParam
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;
...
}
}
@RequestBody
Body에 전달되는 데이터를 메소드의 인자와 매칭 시켜, 데이터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용한다.
클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환한다.
클라이언트가 body에 json or xml 과 같은 형태로 값(주로 객체)을 전송하면, 해당 내용을 Java Object로 변환한다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(@RequestBody User user) {
// POST method, /user 요청을 처리
String sub_name = user.name;
String sub_old = user.old;
}
}
@ModelAttribute
클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결한다.
RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구한다. @RequestBody가 json을 받는 것과 달리 @ModenAttribute의 경우에는 json을 받아 처리할 수 없다.
@ResponseBody
@ResponseBody는 메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 쓰이게 된다. return 시 json, xml과 같은 데이터를 return 한다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user 요청을 처리
// https://naver.com?nickname=dog&old=10
User user = new User();
user.setName(nickname);
user.setAge(age);
return user;
}
}
@SpringBootTest
Spring Boot Test에 필요한 의존성을 제공해준다.
// DemoApplicationTests.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
@Test
JUnit에서 테스트할 대상을 표시한다.
참고: https://melonicedlatte.com/2021/07/18/182600.html#responsebody
다음에는 롬복에 대해 공부해보자.
'Spring' 카테고리의 다른 글
동기와 비동기 방식 (0) | 2022.11.28 |
---|---|
Ajax (0) | 2022.11.28 |
[Spring] MVC 구조 이해 (0) | 2022.11.01 |
[JSP] EL 과 JSTL 정리 (0) | 2022.10.26 |
[JSP] 기초 문법 (0) | 2022.10.25 |