@Component, @Service, @Repository 차이 – 스프링 개발자를 위한 실전 가이드

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 또는 외부 저장소에 직접 접근하는 계층
  • 기능: PersistenceExceptionDataAccessException 변환

즉, JPA나 JDBC에서 발생하는 로우 레벨 예외를 Spring의 통일된 예외 계층으로 추상화해줍니다. 이 덕분에 DAO 계층에서 예외 처리 로직이 더 깔끔해지고 테스트가 용이해집니다.

 


5. 어떤 걸 언제 써야 하나?

어노테이션 역할 기능 사용 예
@Component 기본 Bean 등록 없음 공통 유틸, 설정 클래스
@Service 비즈니스 로직 AOP 적용 대상 OrderService, UserService
@Repository 데이터 접근 예외 변환 JpaUserRepository, JdbcProductDao

 

 


6. 어노테이션은 의도 표현 도구

@Component, @Service, @Repository는 결국 모두 Bean으로 등록된다는 점에서는 동일합니다. 하지만 실무에서는 각 계층의 역할을 명확히 드러내고, Spring이 제공하는 추가 기능(AOP, 예외 처리)을 받기 위해 적절한 어노테이션을 사용하는 것이 중요합니다.

역할이 명확한 어노테이션을 쓰면, 팀원이나 미래의 내가 코드를 봤을 때 “이 클래스는 어디에 속한 것인지” 명확하게 알 수 있습니다.