Search
moon
sun

주요 어노테이션 정리

주요 어노테이션 정리

의존성 어노테이션
@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
복사