Annotation은 Java5부터 새롭게 추가된 문법요소이다.
어노테이션(Annotation)이라는 용어는 원래 '주석'이라는 뜻이며, 자바 코드에 @를 이용해 주석처럼 달아 특수한 의미를 부여해 준다.
컴퓨터 과학에서는 어노테이션이 프로그래밍 언어의 일부로서, 코드의 특정 부분에 메타데이터를 추가하는 데 사용되며, 컴파일러 또는 실행 시간에 코드를 어떻게 처리할지 결정하는 데 도움을 준다.
예를 들어, 자바에서는 @Override와 같은 어노테이션을 사용해 특정 메소드가 상위 클래스의 메소드를 재정의한다는 것을 명시한다.
메타 데이터?
데이터에 대한 데이터 , ‘어떤 목적을 가지고 만들어진 데이터’ 라고도 정의
@Controller
, @Service
, @Repository
등의 어노테이션을 통해 해당 클래스의 역할을 명확히 할 수 있다. @Autowired
어노테이션을 통해 의존성 주입을 자동으로 처리하거나, @Getter
/@Setter
어노테이션을 통해 getter, setter 메서드를 자동으로 생성할 수 있다.@Override
어노테이션은 메서드가 상위 클래스의 메서드를 올바르게 재정의하였는지 컴파일러에게 확인하게 한다.@Data
어노테이션을 사용하면 getter, setter, toString, equals 등의 메서드를 자동으로 생성할 수 있다.@Test
어노테이션은 해당 메서드가 테스트를 수행하는 메서드임을 알려준다.@Data
어노테이션을 사용하면 수많은 줄의 코드를 간결하게 줄일 수 있다.주요 Annotaion은 아래 표와 같다.
Spring Annotation | 설명 |
---|---|
@SpringBootApplication | @Configuration, @EnableAutoConfiguration, @ComponentScan 세 가지 어노테이션을 모아놓은 것으로, 스프링 부트의 주요 어노테이션이다. |
@Configuration | 스프링 설정 클래스를 선언하는 데 사용되는 어노테이션이다. |
@Bean | @Configuration 어노테이션과 함께 사용되며, 메소드가 생성한 객체를 Spring 컨테이너가 관리하도록 하는 데 사용되는 어노테이션이다. |
@Component | Spring에서 빈(Bean)으로 관리할 클래스를 정의하는 데 사용된다. |
@Autowired | Spring에서 의존성 주입을 위해 사용되는 어노테이션이다. 의존성 주입 대상이 되는 필드, 생성자, 메소드에 사용된다. |
@Qualifier | 같은 타입의 여러 빈이 존재할 경우, 어떤 빈을 주입해야 하는지 명시하는 데 사용되는 어노테이션이다. Autowired와 함께 사용된다. |
@Value | 프로퍼티 값을 주입받기 위해 사용하는 어노테이션이다. |
@Controller | @Component와 동일하게 동작하지만, 웹 요청을 처리하는 컨트롤러 계층(Controller Layer)을 나타내기 위해 사용된다. |
@RestController | @Controller와 @ResponseBody가 합쳐진 어노테이션으로, RESTful 웹 서비스를 만드는 데 사용된다. |
@ResponseBody | 메소드의 반환값을 HTTP 응답 본문(Response Body)으로 사용하게 한다. |
@Service | @Component와 동일하게 동작하지만, 서비스 계층(Service Layer)을 나타내기 위해 사용된다. |
@Repository | @Component와 동일하게 동작하지만, 데이터 액세스 계층(Data Access Layer)을 나타내기 위해 사용된다. |
@RequestMapping | 요청 URL을 어떤 메소드가 처리할지 매핑하기 위해 사용되는 어노테이션이다. |
@GetMapping | @RequestMapping의 한 종류로, HTTP GET 요청을 처리하는 메소드를 매핑하는 데 사용된다. |
@PostMapping | @RequestMapping의 한 종류로, HTTP POST 요청을 처리하는 메소드를 매핑하는 데 사용된다. |
@PutMapping | @RequestMapping의 한 종류로, HTTP PUT 요청을 처리하는 메소드를 매핑하는 데 사용된다. |
@DeleteMapping | @RequestMapping의 한 종류로, HTTP DELETE 요청을 처리하는 메소드를 매핑하는 데 사용된다. |
@PatchMapping | @RequestMapping의 한 종류로, HTTP PATCH 요청을 처리하는 메소드를 매핑하는 데 사용된다. |
@PathVariable | URL 경로에 있는 변수를 메소드 매개변수로 사용하게 한다. |
@RequestParam | 요청 파라미터를 메소드 매개변수로 사용하게 한다. |
@Profile | 특정 프로파일에서만 유효한 빈을 정의할 때 사용되는 어노테이션이다. |
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration 어노테이션은 클래스 위에 위치하며, 해당 클래스를 스프링 설정 클래스로 선언한다.
이 클래스에서는 @Bean 어노테이션을 이용하여 스프링 빈을 정의하고, 이 빈들을 스프링 컨테이너가 관리하도록 할 수 있다.
@Bean 어노테이션은 @Configuration 어노테이션과 함께 사용되며, 메소드가 생성한 객체를 Spring 컨테이너가 관리하도록 한다.
@Bean 어노테이션이 붙은 메소드가 반환하는 객체는 스프링 빈이 되어 스프링 컨테이너에 의해 관리된다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Component
public class MyComponent {
// ...
}
@Component
public class MyComponent {
private final MyBean myBean;
@Autowired
public MyComponent(MyBean myBean) {
this.myBean = myBean;
}
// ...
}
@Component
public class MyComponent {
@Autowired
private MyBean myBean;
// ...
}
@Autowired
어노테이션을 생략할 수 있다.@Component
public class MyComponent {
private final MyBean myBean;
@Autowired
public MyComponent(MyBean myBean) {
this.myBean = myBean;
}
// ...
}
@Autowired
어노테이션과 함께 setter 메소드를 사용하여 구현된다.@Component
public class MyComponent {
private MyBean myBean;
@Autowired
public void setMyBean(MyBean myBean) {
this.myBean = myBean;
}
// ...
}
@Component
public class MyComponent {
private final MyBean myBean;
@Autowired
public MyComponent(@Qualifier("myBean1") MyBean myBean) {
this.myBean = myBean;
}
// ...
}
@Component
public class MyComponent {
@Value("${my.property}")
private String myProperty;
// ...
}
주로 View를 반환하기 위해 사용
@Controller
public class MyController {
@RequestMapping("/")
public String index() {
return "index";
}
}
Json 형태로 객체 데이터를 반환하기 위해 사용
@RestController
public class MyRestController {
@RequestMapping("/")
public String index() {
return "Hello, World!";
}
}
@ResponseBody 어노테이션은 메소드의 반환값을 HTTP 응답 본문(Response Body)으로 사용하게 한다.
이 어노테이션을 사용하면 웹 클라이언트에게 직접 응답을 보낼 수 있다.
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@Service
public class MyService {
// ...
}
@Repository
public class MyRepository {
// ...
}
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@RestController
public class MyRestController {
@PostMapping("/users")
public User addUser(User user) {
// 사용자 추가 로직
return user;
}
}
@RestController
public class MyRestController {
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, User user) {
// 사용자 업데이트 로직
return user;
}
}
@RestController
public class MyRestController {
@DeleteMapping("/users/{id}")
public String deleteUser(@PathVariable Long id) {
// 사용자 삭제 로직
return "User is deleted.";
}
}
@RestController
public class MyRestController {
@PatchMapping("/users/{id}")
public User updateUser(@PathVariable Long id, User user) {
// 사용자 부분 업데이트 로직
return user;
}
}
@RestController
public class MyRestController {
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
// 사용자 조회 로직
}
}
@RestController
public class MyRestController {
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String keyword) {
// 사용자 검색 로직
}
}
@Configuration
public class AppConfig {
@Bean
@Profile("dev")
public MyBean devMyBean() {
return new DevMyBean();
}
@Bean
@Profile("prod")
public MyBean prodMyBean() {
return new ProdMyBean();
}
}
참고: https://seungh1024.tistory.com/47
참고: https://mangkyu.tistory.com/49