어노테이션이란
코드에 메타데이터를 추가하는 방법. 메타데이터는 프로그램의 동작에 영향을 주지 않지만, 컴파일러나 런타임 환경에서 코드를 처리하는 방법에 영향을 줄 수 있다. JAVA에서 어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수 등 다양한 코드 요소에 적용할 수 있다.
어노테이션 용도
- 코드 문서화 : 어노테이션을 통해 코드의 의미를 명확하게 설명할 수 있다.
- 컴파일러 지시 : 컴파일러에게 특정 행동을 지시할 수 있다.
- 런타임 처리 : 런타임 환경에서 어노테이션을 읽어 특정 동작을 수행할 수 있다.
- 프레임워크 지원 : 프레임워크가 어노테이션을 통해 특정 기능을 제공할 수 있다.
Spring Boot에서 많이 사용하는 어노테이션
@SpringBootApplication
Spring Boot 애플리케이션의 진입점을 정의하는 어노테이션. 이는 세 가지 어노테이션(@Configuration, @EnableAutoConfiguration, @ComponentScan을 결합한 복합 어노테이션이다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
RESTful 웹 서비스의 컨트롤러임을 명시. @Controller와 @ResponseBody를 결합한 어노테이션으로, JSON/XML 응답을 직접 반환한다.
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@RequestMapping
특정 URL 패턴에 대한 요청을 처리하는 메서드 또는 클래스에 사용된다.
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
@Service
서비스 레이엉에서 비즈니스 로직을 처리하는 클래스에 사용. 스프링 컨텍스트에서 서비스 빈으로 등록된다.
@Service
public class UserService {
public List<User> getAllUsers() {
// 비즈니스 로직
}
public User createUser(User user) {
// 비즈니스 로직
}
}
@Repository
데이터베이스와의 상호작용을 처리하며, 스프링 컨텍스트에서 리포지토리 빈으로 등록된다.
@Repository
public interface UserRepository {
// 데이터베이스 상호작용 메서드
}
@Component
개발자가 직접 정의한 클래스들을 스프링 컨텍스트의 빈으로 등록한다. @Service, @Repository, @Controller 등의 특정 역할이 아닌 포괄적인 빈으로 사용된다.
@Component
public class MyComponent {
public void performTask() {
// 작업 로직
}
}
@Autowired
의존성 주입을 자동으로 처리. 스프링 컨텍스트에서 해당 타입의 빈을 찾아 주입한다.
@Service
public class OrderService {
@Autowired
private UserRepository userRepository;
public void createOrder(Order order) {
User user = userRepository.findById(order.getUserId()).orElse(null);
// 비즈니스 로직
}
}
@Configuration
스프링 설정 클래스에 사용. 스프링 컨텍스트에서 빈을 정의하고 설정하는 데 사용된다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@Bean
메서드 레벨에서 사용되며, 해당 메서드가 반환하는 객체를 스프링 컨텍스트의 빈으로 등록한다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@Value
스프링의 환경 설정 값 또는 프로퍼티 값을 주입하는 데 사용된다.
@Component
public class AppProperties {
@Value("${app.name}")
private String appName;
public String getAppName() {
return appName;
}
}
@Controller
웹 애플리케이션에서 클라이언트 요청을 처리하는 컨트롤러 클래스에 사용된다. @RestController와 달리, 주로 view를 반환하는 데 사용된다.
@Controller
public class WebController {
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Welcome to the home page!");
return "home";
}
}
@EnableAutoConfiguration
Spring Boot의 자동 구성 기능을 활성화한다. Spring Boot가 Class path 설정, 다른 빈 및 다양한 설정을 기반으로 애플리케이션을 자동으로 구성하도록 한다.
@SpringBootApplication
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@ComponentScan
Spring이 @Component, @Service, @Repository 등의 어노테이션이 붙은 class를 스캔하여 빈ㅇ으로 등록하도록 한다.
@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Profile
특정 profile에서만 빈을 활성화하거나 설정을 적용할 때 사용된다.
@Configuration
@Profile("development")
public class DevConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@EnableScheduling
스프링의 스케줄링 기능을 활성화한다.
@Configuration
@EnableScheduling
public class SchedulingConfig {
}
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("The time is now " + new Date());
}
}
@EnableAsync
스프링의 비동기 메서드 실행 기능을 활성화한다.
@Configuration
@EnableAsync
public class AsyncConfig {
}
@Service
public class AsyncService {
@Async
public void asyncMethod() {
// 비동기 작업
}
}
@RestControllerAdvice
모든 @RestControllerAdivce에서 발생하는 예외를 전역으로 처리한다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
}
@RequiredArgsConstructor
class의 final 필드 또는 @NonNull 필드에 대한 생성자를 자동으로 생성. 이를 통해 명시적으로 생성자를 작성하지 않아도 의존성 주입을 받을 수 있다.
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
// UserService(UserRepository userRepository) 생성자가 자동으로 생성됩니다.
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
// UserController(UserService userService) 생성자가 자동으로 생성됩니다.
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findUserById(id);
}
}
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 예외처리 방법 (0) | 2024.07.25 |
---|---|
[Spring Boot] 암호화/복호화(AES, RSA, BCrypt) (2) | 2024.07.24 |
[Spring Boot] 필터(Filter) (2) | 2024.07.24 |
[Spring Boot] 트랜잭션(Transaction) (0) | 2024.07.19 |
[Spring Boot] Controller, Service, Mapper, DTO (0) | 2024.07.18 |