
@Component, @Service, @Repository
Spring에서는 클래스에 특정 어노테이션을 붙이면 자동으로 Bean으로 등록되어 DI 대상이 됩니다.
그 대표적인 어노테이션이 @Component, @Service, @Repository입니다.
✅이 어노테이션들은 클래스의 역할을 명확히 구분하고, Spring이 적절하게 처리할 수 있도록 도와줍니다.
공통점 - 모두 Bean으로 등록됨
이 세 어노테이션은 모두 @Component의 확장 버전입니다.
결국 모두 Component로 인식되고 자동 주입 대상이 됩니다.
| 어노테이션 | 역할 | Component 관계 |
|---|---|---|
| @Component | 일반 컴포넌트 | 기본 어노테이션 |
| @Service | 비즈니스 로직 | @Component의 확장 |
| @Repository | DB 접근 계층 | @Component의 확장 + 예외 처리 기능 추가 |
차이점
✅ @Component
- 가장 기본적인 어노테이션
- 특정 역할 구분 없이 범용적으로 사용
@Component
public class FileUploader { }
✅ @Service
- 비즈니스 로직 처리용 클래스에 명시
- 기능적으로 @Component와 동일하지만, 역할을 명확하게 표현
@Service
public class OrderService {
public void processOrder() { ... }
}
✅ @Repository
- DAO, 데이터 접근 계층에 사용
- 추가로 데이터 접근 예외를 Spring의 DataAccessException으로 전환하는 기능 제공
@Repository
public class UserRepository {
public User findById(Long id) { ... }
}
내부 동작 차이
| 어노테이션 | 기능 | 예외 처리 |
|---|---|---|
| @Component | 기본 등록 | 없음 |
| @Service | AOP 대상 역할 구분 | 없음 |
| @Repository | DB 예외 전환 | 있음 |
예시
@Repository
public class ProductRepository {
public List<Product> findAll() { ... }
}
@Service
public class ProductService {
private final ProductRepository repo;
public ProductService(ProductRepository repo) {
this.repo = repo;
}
public void displayAll() {
List<Product> products = repo.findAll();
}
}
@RestController
public class ProductController {
private final ProductService service;
public ProductController(ProductService service) {
this.service = service;
}
@GetMapping("/products")
public List<Product> getAll() {
return service.getAll();
}
}
정리
@Component계열 어노테이션은 역할에 따라 구분되어 사용되어야 합니다.@Repository는 예외 자동 전환이라는 기능적 차이를 가집니다.- 실무에서는 명확한 목적과 역할에 따라 어노테이션을 구분해 사용하는 것이 가독성과 유지보수에 좋습니다.
'JAVA > Spring & SpringBoot' 카테고리의 다른 글
| Spring AOP란? 관점 지향 프로그래밍? (0) | 2025.06.24 |
|---|---|
| Spring Bean이란? 생성과 생명주기 정리 (0) | 2025.06.22 |
| 의존성 주입이란? DI(Dependency Injection)에 대하여 (0) | 2025.06.22 |
| [Spring] @Value 어노테이션 (0) | 2024.11.07 |