1. Annotation이란?
JAVA에서 Annotation 이라는 기능이 있습니다. 사전상으로는 주석의 의미이지만 Java 에서는 주석 이상의 기능을 가지고 있습니다. Annotation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다. 소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있습니다.
@Bean
@Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용합니다.
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array(){
return new ArrayList<String>();
}
}
@Configuration
@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.
@Autowired
Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 아래의 3가지가 있습니다. Bean을 주입받기 위하여 @Autowired 를 사용합니다. Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name 확인) Bean을 주입합니다.
- @Autowired
- 생성자 (@AllArgsConstructor 사용)
- setter
@Component
개발자가 작성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다.
@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으로 등록해줍니다.
@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 요청을 처리
}
}
@RestController
@ResponseBody 역할을 자동적으로 해주는 Annotation 이다.
-> Controller와 다르게 View로 응답하지 않고, JSON 으로 응답하게 하는 Annotation 이다.
@Service
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도.
@Repository
DAO class에서 쓰인다.
DB에 접근하는 method를 가지고 있는 Class에서 쓰인다.
@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 요청을 처리
}
}
@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;
}
}
@GetMapping
RequestMapping(Method=RequestMethod.GET)과 똑같은 역할을 하며, 아래와 같이 사용합니다.
@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 요청을 처리
}
}
@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
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC#componentscan
'Programing > Spring Boot' 카테고리의 다른 글
| Spring boot Data JPA 엔티티를 DTO로 조회하는 방법 (0) | 2023.06.28 |
|---|---|
| JPA 컬렉션을 페치조인하면 페이징이 불가능하다 (0) | 2023.06.28 |
| 코틀린 스프링부트 @RequestBody, @RequestParam, @PathVariable 사용법 (0) | 2023.06.21 |
| 스프링부트, 리액트 파일 업로드 (0) | 2023.06.21 |
| 코틀린으로 크롤링 하기 Jsoup 사용 (0) | 2023.05.27 |