개발을 하면서 스프링부트의 다양한 어노테이션을 사용해왔다. 처음에는 단순히 정해진 방식대로 `@RestController`,`@Autowired` 같은 기본적인 어노테이션들만 사용했었다. 하지만 프로젝트가 복잡해지고 기능이 다양해질수록 내가 알고 있는 어노테이션들만으로는 부족하다는 것을 깨달았다. 그래서 이 글을 통해 스프링부트에서 제공하는 다양한 어노테이션들을 체계적으로 정리해보기로 했다.
어노테이션(Annotation)이란?
어노테이션은 코드에 추가적인 정보와 의미를 부여하는 주석과 같은 특별한 표기 방식이다. 단순한 주석과는 달리, 어노테이션은 컴파일러나 프레임워크에 특정한 동작이나 처리 방식을 알려주는 역할을 한다.
어노테이션을 사용하는 주요 이유
1. 코드의 추가 정보 제공
- 클래스, 메서드, 변수 등에 대한 부가적인 정보를 표현할 수 있다.
- 개발자의 의도를 명확하게 전달할 수 있다.
2. 자동화된 작업 지원
- 컴파일러에게 특정 동작을 지시할 수 있다.
- 프레임워크가 코드를 자동으로 처리하거나 특별한 기능을 수행하도록 한다.
3. 코드의 가독성 향상
- 복잡한 설정 파일 대신 코드 바로 위에 간단히 작성할 수 있다.
- 코드의 의미와 목적을 더 명확하게 표현할 수 있다.
1. 컴포넌트 및 빈 관리 어노테이션
@Component
스프링에서 관리하는 일반 컴포넌트를 정의한다. 스프링이 해당 클래스의 인스턴스를 자동으로 생성하고 관리한다.
@Component
public class GeneralComponent {
// 일반적인 스프링 관리 컴포넌트
}
@Service
비즈니스 로직을 처리하는 서비스 계층의 클래스임을 나타낸다. @Component의 특수한 형태로, 의미론적으로 더 명확하다.
@Service
public class UserService {
// 비즈니스 로직 구현
}
@Repository
데이터 접근 계층(DAO)의 클래스임을 나타낸다. 데이터베이스 관련 예외를 스프링의 데이터 접근 예외로 변환해준다.
@Repository
public class UserRepository {
// 데이터베이스 접근 로직
}
@Configuration
스프링 설정 클래스임을 나타낸다. 빈(Bean) 정의 및 애플리케이션 설정에 사용된다.
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// 데이터소스 빈 생성
}
}
2. 웹 계층 어노테이션
@Controller
전통적인 MVC 패턴의 컨트롤러를 정의한다. 주로 뷰를 반환하는 웹 애플리케이션에서 사용된다.
@Controller
public class PageController {
@GetMapping("/home")
public String homePage() {
return "home"; // 뷰 이름 반환
}
}
@RestController
RESTful 웹 서비스의 컨트롤러를 정의한다. @Controller와 @ResponseBody의 조합이다.
@RestController
@RequestMapping("/api/users")
public class UserController {
// REST API 엔드포인트
}
요청 매핑 어노테이션
- @GetMapping: GET 요청 처리
- @PostMapping: POST 요청 처리
- @PutMapping: PUT 요청 처리
- @DeleteMapping: DELETE 요청 처리
- @PatchMapping: PATCH 요청 처리
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getUsers() { }
@PostMapping("/users")
public User createUser(@RequestBody User user) { }
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) { }
}
3. 요청 파라미터 바인딩 어노테이션
@RequestParam
쿼리 파라미터나 폼 데이터를 메서드 파라미터로 바인딩한다.
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String keyword) { }
@PathVariable
URL 경로의 변수를 메서드 파라미터로 바인딩한다.
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) { }
@RequestBody
HTTP 요청 본문을 자바 객체로 변환한다.
@PostMapping("/users")
public User createUser(@RequestBody UserDto userDto) { }
4. 의존성 주입 어노테이션
@Autowired
의존성을 자동으로 주입한다. 생성자, 세터, 필드에 사용 가능하다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Qualifier
동일한 타입의 빈이 여러 개일 때 특정 빈을 지정하여 주입한다.
@Autowired
@Qualifier("mainDataSource")
private DataSource dataSource;
5. 데이터 영속성 관련 어노테이션
@Entity
JPA에서 해당 클래스가 데이터베이스 테이블과 매핑됨을 나타낸다.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String email;
}
@Column
엔티티의 필드를 데이터베이스 컬럼과 매핑한다.
@Transactional
메서드나 클래스에 트랜잭션 경계를 설정한다.
@Service
public class UserService {
@Transactional
public void registerUser(User user) {
// 트랜잭션 처리
}
}
6. 스케줄링 및 비동기 처리 어노테이션
@Scheduled
주기적인 작업을 실행한다.
@Component
public class NotificationScheduler {
@Scheduled(cron = "0 0 9 * * *") // 매일 오전 9시
public void sendDailyNotifications() { }
}
@Async
비동기 메서드 실행을 지원한다.
@Service
public class EmailService {
@Async
public void sendEmail(String to, String subject) { }
}
7. 예외 처리 어노테이션
@ControllerAdvice
전역적인 예외 처리를 담당한다.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFound(ResourceNotFoundException ex) {
// 예외 처리 로직
}
}
8. 보안 관련 어노테이션
@PreAuthorize
메서드 실행 전 권한을 검사한다.
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) { }
마무리
스프링부트의 어노테이션은 개발자가 더 간결하고 효율적인 코드를 작성할 수 있도록 돕는다. 각 어노테이션의 목적과 사용 방법을 잘 이해하고 적절히 활용하는 것이 중요하다.
어노테이션은 코드의 가독성을 높이고 반복적인 작업을 줄여주지만, 무분별한 사용은 오히려 코드를 복잡하게 만들 수 있으므로 주의가 필요하다.
'SpringBoot' 카테고리의 다른 글
[SpringBoot] 일관된 API 응답을 위한 JsonResult 구현 및 활용 (0) | 2025.03.07 |
---|---|
[SpringBoot] JWT 토큰 구현 및 활용 (0) | 2025.03.06 |
[SpringBoot]AWS S3를 활용한 파일 업로드 구현하기 (0) | 2025.02.28 |
[SpringBoot] Twilio를 활용한 기념일 알림 기능 개발 (0) | 2025.02.23 |
[SpringBoot] Twilio를 활용한 React & Spring Boot 휴대폰 인증 기능 개발 (0) | 2025.02.21 |