Java

Spring Boot @Component, @Service, @Repository 차이점 정리

ZZJJing 2025. 6. 17. 15:52
반응형
  • 기능적으로는 동일함 - 모두 스프링 컨테이너에 Bean 등록
  • 의미적 차이가 핵심 - 코드 가독성과 유지보수성
  • 예외 처리에서 차이 - @Repository만 특별한 기능 있음

[어노테이션별 특징]

@Component

  • 가장 기본적인 어노테이션
  • 범용적으로 사용
  • 다른 세 개 어노테이션의 부모격
@Component
public class UtilComponent {
    // 유틸리티성 클래스
}

@Service

  • 비즈니스 로직 처리
  • Service 계층에서 사용
  • @Component를 상속받음
@Service
public class UserService {
    // 비즈니스 로직
}

@Repository

  • 데이터 접근 계층
  • DAO 클래스에 사용
  • 예외 변환 기능 추가 (중요!)
@Repository
public class UserRepository {
    // 데이터베이스 접근 로직
}

[실제 차이점]

1. 예외 처리

  • @Repository: SQLException → DataAccessException 자동 변환
  • 나머지: 예외 변환 없음

2. 코드 가독성

  • 어노테이션만 봐도 역할 파악 가능
  • 팀 개발 시 협업 효율성 증가

3. AOP 적용

  • 각 계층별로 다른 AOP 적용 가능
  • @Repository는 트랜잭션 관리에 특화

🔧 언제 어떤 걸 써야 할까?

@Component 사용 시기

✅ 유틸리티 클래스
✅ 설정 관련 클래스  
✅ 특정 계층에 속하지 않는 클래스

@Service 사용 시기

✅ 비즈니스 로직 처리
✅ 여러 Repository 조합
✅ 트랜잭션 경계 설정

@Repository 사용 시기

✅ 데이터베이스 접근
✅ 외부 API 호출
✅ 파일 시스템 접근

 

잘못된 사용 예시

// ❌ Service 로직을 Component로
@Component  
public class UserBusinessLogic { } 

// ❌ Repository를 Service로
@Service
public class UserDataAccess { }

올바른 사용 예시

// ✅ 계층별 명확한 구분
@Repository
public class UserRepository { }

@Service  
public class UserService {
    private final UserRepository userRepository;
}

@Component
public class DateUtil { }

[주의사항]

Spring Data JPA 사용 시

  • 인터페이스에는 @Repository 생략 가능
  • Spring이 자동으로 구현체 생성
// @Repository 생략 가능
public interface UserJpaRepository extends JpaRepository<User, Long> {
}

테스트 코드에서

  • @MockBean 사용 시 어노테이션 중요
  • 계층별 Mock 생성에 영향

 

 

어노테이션 용도 특별 기능 사용 위치

@Component 범용 없음 어디든
@Service 비즈니스 로직 없음 Service 계층
@Repository 데이터 접근 예외 변환 DAO 계층

🎯 핵심 기억사항

  1. 기능은 같지만 의미가 다름
  2. @Repository만 예외 변환 기능
  3. 코드 가독성과 유지보수성을 위해 정확히 사용
  4. 팀 컨벤션 중요

 

기능은 같지만 역할에 맞게 써야 코드가 깔끔해진다!

 

728x90
반응형