주요 어노테이션 정리
•
의존성 어노테이션
◦
@Component
◦
@Autowired
◦
@Controller
◦
@RestController
◦
@Service
◦
@Repository
•
요청 경로 매핑 어노테이션
◦
@Controller or @RestController
◦
@RequestMapping
▪
@GetMapping
▪
@PostMapping
▪
@PutMapping
▪
@DeleteMapping
•
요청 파라미터 어노테이션
◦
@RequestParam
◦
@PathVaiable
◦
@RequestBody
◦
@ModelAttribute
@Component
스프링 컨테이너에게 해당 클래스가 컴포넌트임을 알려줍니다. 보통 일반적인 클래스에 사용되며, 자동으로 검색하여 Bean으로 등록합니다.
@Data
@Component
public class User {
private String username;
private String password;
public User() {
this.username = "ALOHA";
this.password = "123456";
}
}
Java
복사
@Autowired
스프링에서 의존성 주입(Dependency Injection)을 위해 사용됩니다. 해당 어노테이션이 있는 필드나 메소드에 해당하는 Bean을 자동으로 주입합니다.
public class Test {
@Autowired
private User user;
}
Java
복사
@Controller
MVC 구조에서 컨트롤러 클래스임을 지정하는 어노테이션
@Controller 어노테이션을 사용해야 @RequestMapping이나 @GetMapping, @PostMapping 같은 어노테이션을 사용할 수 있습니다.
Spring Boot에서 @Controller는 스프링 MVC에서 이 클래스가 웹 요청을 처리하는 컨트롤러 역할을 한다는 것을 명시합니다. 따라서 @Controller를 선언해야 스프링이 해당 클래스를 요청 처리용 빈(Bean)으로 인식하고, @RequestMapping 등으로 지정한 요청 매핑을 처리할 수 있게 됩니다.
활성화되는 어노테이션
어노테이션 | 설명 |
@RequestMapping | 클래스나 메서드에 URL 패턴을 매핑하여 특정 요청을 처리합니다. |
@GetMapping | GET 요청을 처리하며 URL 경로를 매핑합니다. |
@PostMapping | POST 요청을 처리하며 URL 경로를 매핑합니다. |
@PutMapping | PUT 요청을 처리하며 URL 경로를 매핑합니다. |
@DeleteMapping | DELETE 요청을 처리하며 URL 경로를 매핑합니다. |
@PatchMapping | PATCH 요청을 처리하며 URL 경로를 매핑합니다. |
@ResponseBody | 메서드 반환 값을 JSON 또는 XML로 변환해 HTTP 응답 본문으로 반환합니다. |
@PathVariable | URL 경로에서 변수를 추출하여 메서드 매개변수로 전달합니다. |
@RequestParam | 요청 URL의 쿼리 파라미터를 메서드의 매개변수로 바인딩합니다. |
@RequestBody | HTTP 요청 본문을 자바 객체로 변환하여 메서드 매개변수로 전달합니다. |
@ModelAttribute | 요청 파라미터를 객체에 바인딩하고, 해당 객체를 모델에 추가합니다. |
@RequestHeader | HTTP 요청 헤더 값을 메서드 매개변수로 바인딩합니다. |
@CookieValue | 특정 쿠키 값을 메서드 매개변수로 바인딩합니다. |
@SessionAttributes | 세션에 특정 속성 값을 저장하거나 불러오는 데 사용합니다. |
@InitBinder | 커스텀 데이터 바인더를 설정하여 컨트롤러의 데이터 바인딩 방식을 조정합니다. |
@Controller
public class HomeController {
@GetMapping({"/", ""})
public String home() {
return "index";
}
}
Java
복사
@RestController
@Controller와 유사하지만, 해당 컨트롤러가 JSON 또는 XML과 같은 데이터를 반환하는 RESTful 웹 서비스에서 사용됩니다.
= @Controller + @ResponseBody
해당 컨트롤러 하위의 컨트롤러 메소드 들은 @ResponseBody 를 붙이지 않아도, 기본적으로 뷰 페이지가 아니라 데이터(JSON, XML)를 응답한다.@RestController에만 활성화되는 어노테이션 목록
어노테이션 | 설명 |
@ResponseBody | @RestController는 기본적으로 모든 메서드에 이 어노테이션이 자동 적용되어, 메서드 반환 값을 HTTP 응답 본문으로 직렬화하여 반환합니다. @Controller에서는 별도로 @ResponseBody를 명시해야 하지만, @RestController에서는 이를 자동으로 처리합니다. |
@RestControllerAdvice | @ControllerAdvice와 동일하지만, @RestController에 특화된 예외 처리 및 전역 설정을 제공하는 어노테이션입니다. 주로 REST API의 예외 처리를 중앙에서 관리할 때 사용됩니다. (@ExceptionHandler와 함께 사용됨) |
@ResponseStatus | @RestController에서 HTTP 상태 코드와 응답 본문을 함께 처리할 때 유용합니다. 예외 클래스에서 이 어노테이션을 사용하면, 발생한 예외에 대해 상태 코드를 직접 지정할 수 있습니다. 예를 들어, 예외 발생 시 자동으로 404 상태 코드를 반환하도록 설정할 수 있습니다. |
@JsonView | 특정 뷰(View)를 정의하여 JSON 응답 시 반환할 필드를 동적으로 제어할 수 있습니다. REST API에서 필요한 필드만 응답하고 싶을 때 유용하게 사용됩니다. |
@Slf4j
@RestController
@RequestMapping("/rest")
public class TestRestController {
/**
* ⭐ @RestController = @Controller + @ResponseBody
* - @ResponseBody 가 없어도, 데이터를 응답 본문(body)에 담아서 전송한다.
* @return
*/
@GetMapping("/body")
public String restBody() {
return "REST";
}
}
Java
복사
@RestController
public class TestRestController {
@Autowired
private User user;
@GetMapping("/user")
public User user() {
return user;
}
}
Java
복사
User 클래스의 필드가 private 접근 제어자로 되어 있어, 이를 JSON 형식으로 반환하려면 getter 메서드가 필요합니다. Spring은 User 객체를 JSON으로 직렬화할 때 Jackson 라이브러리를 사용하는데, Jackson은 기본적으로 getter 메서드가 있을 때 해당 필드를 직렬화합니다.
@Service
비즈니스 로직을 처리하는 서비스 클래스임을 표시합니다.
활성화되는 어노테이션
어노테이션 | 설명 |
@Autowired | 의존성 주입을 위해 사용됩니다. @Service 클래스 내에서 다른 빈(예: 리포지토리 또는 다른 서비스)을 자동으로 주입받을 수 있습니다. |
@Transactional | 서비스 메서드에 트랜잭션 처리를 자동으로 적용합니다. 데이터베이스 관련 작업에서 트랜잭션을 시작하고 종료하는 기능을 제공합니다. |
@PostConstruct | 서비스 클래스가 생성된 후 초기화 작업을 수행할 수 있도록 해줍니다. 객체 생성 및 의존성 주입 후 실행됩니다. |
@PreDestroy | 서비스 클래스가 소멸되기 전에 호출됩니다. 리소스를 정리하거나 종료 작업을 할 때 사용됩니다. |
@Value | Spring 설정 파일에서 값을 주입받을 때 사용됩니다. 예를 들어 application.properties에서 설정한 값을 주입받을 수 있습니다. |
@Qualifier | 동일한 타입의 빈이 여러 개 있을 때, 특정 빈을 선택하여 주입받기 위해 사용됩니다. @Autowired와 함께 사용됩니다. |
@Async | 메서드를 비동기적으로 실행하도록 설정합니다. 비동기 작업을 할 때 유용하게 사용됩니다. |
@Bean | @Service 클래스 내에서 @Bean을 사용하여 다른 빈을 생성할 수 있습니다. 주로 서비스 내에서 특정 객체를 빈으로 등록할 때 사용됩니다. |
@Scope | 빈의 범위를 지정하는 데 사용됩니다. 기본값은 싱글톤(singleton)이며, 요청(request), 세션(session) 등 다양한 범위를 설정할 수 있습니다. |
@Profile | 특정 환경(예: 개발, 배포)에 따라 빈을 활성화하거나 비활성화할 수 있습니다. 여러 환경에 따라 다른 서비스를 제공할 때 사용됩니다. |
UserService.java
public interface UserService {
public void test(User user) throws Exception;
}
Java
복사
UserServiceImpl.java
@Slf4j
@Service
public class UserServiceImpl implements UserService {
@Override
public void test(User user) throws Exception {
log.info("UserServceImpl - test()");
}
}
Java
복사
@Repository
데이터 액세스 계층의 DAO(Data Access Object) 클래스임을 표시합니다.
활성화 되는 어노테이션
어노테이션 | 설명 |
@Autowired | 의존성 주입을 위해 사용됩니다. @Repository 클래스 내에서 다른 빈(예: 서비스 클래스 또는 다른 리포지토리)을 자동으로 주입받을 수 있습니다. |
@PersistenceContext | EntityManager를 주입받을 때 사용합니다. JPA를 사용할 때 @Repository 클래스에서 데이터베이스와의 상호작용을 처리하는 데 필요합니다. |
@Transactional | 데이터베이스 트랜잭션을 처리하기 위해 사용됩니다. @Repository 클래스 내에서 데이터베이스 관련 작업을 트랜잭션으로 감싸는 데 사용됩니다. |
@Query | 쿼리 메서드를 정의할 때 사용됩니다. @Repository에서 JPQL, 네이티브 쿼리 등을 정의하여 직접 쿼리를 작성할 수 있습니다. |
@Modifying | @Query와 함께 사용되며, 데이터베이스의 상태를 수정하는 쿼리를 나타냅니다. 예를 들어, UPDATE나 DELETE 쿼리에서 사용됩니다. |
@Transactional
(readOnly=true) | 트랜잭션을 읽기 전용으로 설정하여 데이터베이스 성능을 최적화하고, 데이터 수정 없이 조회만 할 때 사용합니다. |
@EnableJpaRepositories | @Repository를 사용하여 JPA 리포지토리 기능을 활성화하는 데 필요한 어노테이션입니다. JPA 설정을 자동으로 구성합니다. |
@QueryHints | JPA 쿼리에서 추가적인 힌트를 지정할 때 사용됩니다. 성능을 최적화하거나 쿼리 실행 방식을 제어할 때 유용합니다. |
@RequestMapping
요청 매핑을 지정하는 데 사용됩니다. 클래스 레벨에서는 기본 경로를 지정하고, 메소드 레벨에서는 경로와 HTTP 메소드를 지정합니다.
•
속성
◦
value
◦
method
◦
headers
◦
consumes
◦
produces
◦
name
속성을 명시하지 않고 생략해서 쓰면, 기본 URL 경로만 매핑할 수 있다.@RequestMapping("/path/sub")
Java
복사
속성 | 설명 | 예시 |
value 또는 path | 요청을 처리할 경로를 지정합니다. | @RequestMapping(value = "/example") |
method | 요청을 처리할 HTTP 메소드를 지정합니다. | @RequestMapping(value = "/example", method = RequestMethod.GET) |
params | 요청 파라미터의 존재 여부 및 값에 따라 매핑을 제한합니다. | @RequestMapping(value = "/example", params = "id=1") |
headers | 요청 헤더의 속성에 따라 매핑을 제한합니다. | @RequestMapping(value = "/example", headers = "content-type=application/json") |
consumes | 소비할 미디어 타입을 지정합니다. | @RequestMapping(value = "/example", consumes = MediaType.APPLICATION_JSON_VALUE) |
produces | 생성할 미디어 타입을 지정합니다. | @RequestMapping(value = "/example", produces = MediaType.APPLICATION_JSON_VALUE) |
name | 매핑의 이름을 지정합니다. | @RequestMapping(value = "/example", name = "exampleMapping") |
@GetMapping, @PostMapping @PutMapping, @DeleteMapping
각각 GET, POST, PUT, DELETE HTTP 요청에 대한 매핑을 지정합니다.
@RequsetMapping 의 속성들을 동일하게 사용할 수 있다. (method 제외)@RequestParam
HTTP 요청 파라미터를 메소드의 파라미터로 전달합니다.
•
요청 URL
http://localhost:8080/example?A=100&B=200
Java
복사
@RequsetMapping("/test")
public void method( @RequestParam("A") String a, @RequestParam("B") String b ) {
...
}
Java
복사
요청 파라미터 이름과 메소드 매개변수 이름 같은 경우@RequsetMapping("/test")
public void method( @RequestParam String A, @RequestParam String B ) {
...
}
Java
복사
@RequsetMapping("/test")
public void method( String A, String B ) {
...
}
Java
복사
@PathVariable
URI 템플릿 변수 값을 메소드의 파라미터로 전달합니다.
http://localhost:8080/example/{A}/{B}
Java
복사
@RequsetMapping("/test")
public void method(@PathVariable("A") String a, @PathVariable("B") String b ) {
...
}
Java
복사
@RequestBody
HTTP 요청 본문을 메소드의 파라미터로 매핑합니다.
클라이언트가 POST 방식으로 요청할 때, 요청 메시지의 body 담긴 데이터를 객체 또는 컬렉션에 매핑해줍니다.
JSON, XML [POST]
@RequestBody
form-data [POST]
@ReqeustParam
form 의 POST 방식으로 요청해도 역시 요청 메시지의 body에 데이터가 담기는데, 스프링이 폼 데이터를 변환하여 요청 파라미터에 담아줍니다. 그래서 @RequestParam 으로 객체나 컬렉션에 매핑할 수 있습니다.
직접 정의한 클래스의 경우. 요청 파라미터 이름과 객체의 변수명이 일치하면 @RequestParam 을 쓰지 않아도 자동 매핑합니다.@Slf4j
@Controller
@RequestMapping("/test")
public class TestController {
/**
* [POST] - /test/json
* data : (BODY) > (JSON) > { "data1" : "value1", "data2" : "value2" }
* @param map
* @return
* ⭐ @RequestBody
* : HTTP 요청 메시지의 본문(BODY) 를 메소드의 파라미터로 매핑하는 어노테이션
* ✅ 주로 JSON, XML 데이터를 파라미터로 매핑하는 데 사용
* ❌ FORM[POST] 요청일 때는 사용하지 않는다.
* - FORM 요청일 때는, 객체나 컬렉션으로 자동 매핑된다.
*/
@PostMapping("/json")
public String jsonTest(@RequestBody Map<String, String> map) {
log.info("[POST] - /test");
log.info("map : " + map);
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
log.info("key : "+ key + ", value : " + value);
}
return "test";
}
/**
* /test/form
* data : (BODY) > (FORM) > formData
* ✅
* 💌(요청)[POST]/test/form
* body : formData
* - POST 로 요청 시, formData 도 body 에 담겨져서 보내진다.
* 🍃(Spring)
* - 폼으로 전송된 요청 body에 데이터가 있지만,
* 스프링🍃이 데이터를 처리하기 위해,
* 내부적으로 body에 있는 데이터를 요청 파라미터에 매핑합니다.
* ➡ 그래서, 폼 요청 데이터는 @RequestParam 으로 매핑 가능합니다.
* @param map
* @return
*/
@PostMapping("/form")
public String formTest(@RequestParam Map<String, String> map) {
log.info("[POST] - /test");
log.info("map : " + map);
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
log.info("key : "+ key + ", value : " + value);
}
return "test";
}
/**
* /test/form/user
* data : (BODY) > (FORM) > formData
* ✅ ( @RequestParam ) User user
* - @RequestParam 생략 가능 - 스프링이 객체의 변수를 분석해서
* 요청 파라미터명과 일치하는 변수에 자동 매핑한다.
* @param user
* @return
*/
@PostMapping("/form/user")
public String user(User user) {
log.info("[POST] - /test/user");
log.info("user : " + user);
return "test";
}
/**
* /test/json/user
* data : (BODY) > (JSON) > { "name" : "joeun", "age" : "20" }
* ⭐ @RequestBody
* - 요청 본문의 데이터를 객체로 매핑한다.
* ✅ 생략하면 자동 매핑해주지 않는다.
* @param user
* @return
*/
@PostMapping("/json/user")
public String jsonUser(@RequestBody User user) {
log.info("[POST] - /test/json/user");
log.info("user : " + user);
return "test";
}
}
Java
복사
@ModelAttribute
컨트롤러 메소드의 파라미터를 자동으로 모델에 등록해주는 어노테이션
/**
* ⭐ @ModelAttribute
* 컨트롤러 메소드의 파라미터를 자동으로 모델에 등록해주는 어노테이션
* ✅ name 을 지정하지 않으면, 변수명을 name으로 지정한다.
* @param user
* @return
*/
@GetMapping("/model")
public String testModel(@ModelAttribute User user) {
user.setName("김조은");
user.setAge(30);
return "user";
}
Java
복사
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>user</title>
</head>
<body>
<h1>user</h1>
<h3 th:text="${ user.name }" ></h3>
<h3 th:text="${ user.age }" ></h3>
</body>
</html>
HTML
복사
@ResponseBody
응답 메시지의 본문(body)에 데이터를 매핑하는 어노테이션
템플릿 엔진(thymeleaf, jsp)를 사용한다면, String 반환타입으로 “뷰파일 경로” 를 지정하면, 해당 뷰 파일을 html 로 렌더링하여 응답한다.
컨트롤러 메소드에 @ResponseBody 를 붙이면, 템플릿 엔진을 통해서 뷰 페이지를 사용 않고, 지정한 문자열을 응답 메시지 본문에 담아서 전송한다./**
* ⭐ @ResponseBody
* : 응답 메시지 본문에 데이터를 담아서 전송해주는 어노테이션
* ✅ 뷰 페이지를 응답하지 않고, 텍스트 데이터를 그대로 응답한다.
* @return
*/
@ResponseBody
@GetMapping("/body")
public String testBody() {
return "TEST";
}
Java
복사











