본문 바로가기
JAVA/Spring & SpringBoot

Spring 어노테이션 @Component, @Service, @Repository 차이점

by Caffein not null 2025. 6. 23.

@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는 예외 자동 전환이라는 기능적 차이를 가집니다.
  • 실무에서는 명확한 목적과 역할에 따라 어노테이션을 구분해 사용하는 것이 가독성과 유지보수에 좋습니다.