Spring 애플리케이션을 개발하다 보면 @Component
, @Service
, @Repository
같은 어노테이션을 자주 접하게 됩니다. 이들 모두 Spring Bean으로 등록된다는 공통점이 있지만, 의미와 역할, 그리고 내부 처리 방식에서 차이가 존재합니다.
이 세 어노테이션의 차이를 정확하게 짚고, 언제 어떤 것을 써야 하는지 실무 관점에서 정리합니다.
1. 공통점 – 모두 Component 스캔 대상
먼저 이 세 가지 어노테이션은 모두 Spring의 Component 스캔 대상입니다. 즉, @Component
를 기반으로 확장된 특수 목적의 세부 어노테이션들입니다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component ← 이게 핵심!
public @interface Service { ... }
public @interface Repository { ... }
따라서, @Service
나 @Repository
도 결국 @Component로 인식되어 Bean으로 등록됩니다.
2. @Component – 가장 일반적인 Bean 등록용
@Component
는 가장 기본적인 Bean 등록 어노테이션입니다. 명확한 역할이 없는 단순 유틸리티 클래스, 설정 클래스, 공통 모듈 등을 등록할 때 사용됩니다.
@Component
public class FileNameGenerator {
...
}
- 사용 시기: 특별한 역할 구분이 필요 없을 때
- Spring이 특별한 추가 처리를 하지 않음
3. @Service – 비즈니스 로직 계층
@Service
는 서비스 계층(비즈니스 로직을 처리하는 클래스)에 사용됩니다. @Component
와 기능적으로는 동일하지만, 의도를 명확히 표현해줍니다.
@Service
public class OrderService {
public void processOrder(Order order) {
...
}
}
- 사용 시기: 비즈니스 로직을 수행하는 서비스 클래스
- 장점: 명확한 역할 구분, AOP 적용 시 클래스 구분 가능
실제로 Spring AOP에서 @Service
클래스를 기반으로 트랜잭션 적용 범위를 구분할 수 있기 때문에 역할을 드러내는 데 있어 의미가 큽니다.
4. @Repository – 데이터 액세스 계층
@Repository
는 DAO 또는 JPA Repository 등 데이터 액세스를 담당하는 클래스에 사용됩니다. Spring은 이 어노테이션이 붙은 클래스에 대해 예외 변환 기능(예외 감싸기)을 자동으로 수행합니다.
@Repository
public class UserRepository {
public User findById(Long id) {
...
}
}
- 사용 시기: DB 또는 외부 저장소에 직접 접근하는 계층
- 기능:
PersistenceException
→DataAccessException
변환
즉, JPA나 JDBC에서 발생하는 로우 레벨 예외를 Spring의 통일된 예외 계층으로 추상화해줍니다. 이 덕분에 DAO 계층에서 예외 처리 로직이 더 깔끔해지고 테스트가 용이해집니다.
5. 어떤 걸 언제 써야 하나?
어노테이션 | 역할 | 기능 | 사용 예 |
---|---|---|---|
@Component | 기본 Bean 등록 | 없음 | 공통 유틸, 설정 클래스 |
@Service | 비즈니스 로직 | AOP 적용 대상 | OrderService, UserService |
@Repository | 데이터 접근 | 예외 변환 | JpaUserRepository, JdbcProductDao |
6. 어노테이션은 의도 표현 도구
@Component
, @Service
, @Repository
는 결국 모두 Bean으로 등록된다는 점에서는 동일합니다. 하지만 실무에서는 각 계층의 역할을 명확히 드러내고, Spring이 제공하는 추가 기능(AOP, 예외 처리)을 받기 위해 적절한 어노테이션을 사용하는 것이 중요합니다.
역할이 명확한 어노테이션을 쓰면, 팀원이나 미래의 내가 코드를 봤을 때 “이 클래스는 어디에 속한 것인지” 명확하게 알 수 있습니다.
'개발 > JAVA' 카테고리의 다른 글
Spring Profile로 환경별 설정 관리하기 – 개발자라면 꼭 알아야 할 환경 분리 전략 (0) | 2025.09.22 |
---|---|
@Autowired vs 생성자 주입 – 스프링 DI에서 가장 많이 묻는 질문 (0) | 2025.09.21 |
Spring Bean과 IoC/DI 개념 이해 – 스프링의 핵심 철학 (0) | 2025.09.19 |
@RestController vs @Controller – Spring MVC에서의 핵심 차이점 정리 (0) | 2025.09.18 |
Spring에서 Controller, Service, Repository 계층 구조란? (0) | 2025.09.17 |