Spring Boot

[Spring Boot] 어노테이션(Annotation)

Tech박조롱 2024. 7. 24. 15:17

 

어노테이션이란 

코드에 메타데이터를 추가하는 방법. 메타데이터는 프로그램의 동작에 영향을 주지 않지만, 컴파일러나 런타임 환경에서 코드를 처리하는 방법에 영향을 줄 수 있다. JAVA에서 어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수 등 다양한 코드 요소에 적용할 수 있다.

 

어노테이션 용도

  1. 코드 문서화 : 어노테이션을 통해 코드의 의미를 명확하게 설명할 수 있다.
  2. 컴파일러 지시 : 컴파일러에게 특정 행동을 지시할 수 있다.
  3. 런타임 처리 : 런타임 환경에서 어노테이션을 읽어 특정 동작을 수행할 수 있다.
  4. 프레임워크 지원 : 프레임워크가 어노테이션을 통해 특정 기능을 제공할 수 있다.

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);
    }
}