반응형
- 기능적으로는 동일함 - 모두 스프링 컨테이너에 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 계층 |
🎯 핵심 기억사항
- 기능은 같지만 의미가 다름
- @Repository만 예외 변환 기능
- 코드 가독성과 유지보수성을 위해 정확히 사용
- 팀 컨벤션 중요
기능은 같지만 역할에 맞게 써야 코드가 깔끔해진다!
728x90
반응형
'Java' 카테고리의 다른 글
Java Exception 처리 전략과 커스텀 예외 설계 (1) | 2025.06.08 |
---|---|
Java 코드 성능/메모리 사용량 최적화 (0) | 2025.05.07 |
boolean이랑 Boolean 뭐가 다를까? — Swagger 쓰다가 궁금해서 정리함 (0) | 2025.04.21 |
sts3 설치 시 압축풀기 오류 (0) | 2024.03.03 |
sts4 - spring boot 자동 리로드 시키는법 (0) | 2024.01.12 |