티스토리 뷰

728x90
반응형

@Service와 @Repository 애너테이션은 스프링 프레임워크에서 각각 

 

서비스 계층과 데이터 접근 계층을 표현하는 데 사용된다. 

 

이 두 애너테이션은 기능적으로 차이가 있을 뿐만 아니라, 내부 구조와 목적에서도 차이를 보인다.

 

결론부터 말하자면 두 애너테이션 모두 내부적으로는 @Component 애너테이션을 포함하고 있다. 

 

그러나 @Repository는 추가적으로 데이터 접근 예외를 일관된 방식으로 처리하기 위한 예외 변환 기능을 제공한다. 

 

이를 통해 애플리케이션은 더 구조적이고 명확하게 계층을 나눌 수 있으며, 각각의 역할에 맞는 클래스를 정의할 수 있다. 

 

이러한 구분은 코드의 가독성과 유지보수성을 높이는 데 기여한다.

 

@Service

 

@Service 애너테이션은 비즈니스 로직을 구현하는 서비스 계층을 표시하는 데 사용된다. 

 

주로 애플리케이션의 비즈니스 로직을 담당하는 클래스에 적용된다.

 

  • 내부 구조

@Service 애너테이션은 기본적으로 특별한 내부 구조를 갖고 있지 않다. 

 

이는 단순히 스프링 컨테이너에게 해당 클래스가 서비스 역할을 한다는 것을 알려주기 위한 것이다. 

 

@Service 애너테이션을 통해 스프링은 이 클래스를 빈으로 등록하며, 이는 다른 빈들에서 주입될 수 있다.

 

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

위의 코드에서 볼 수 있듯이, @Service 애너테이션은 @Component 애너테이션을 메타 애너테이션으로 포함한다. 

 

이는 @Service가 @Component와 동일한 역할을 수행하되, 더 명확하게 서비스 계층을 나타내기 위한 것임을 의미한다.

 

@Repository

 

@Repository 애너테이션은 데이터 접근 계층을 나타내며, 주로 데이터베이스와의 상호작용을 담당하는 클래스에 적용된다.

 

 

  • 내부 구조

@Repository 애너테이션은 데이터 접근 계층에서 발생할 수 있는 예외를 

 

스프링의 데이터 접근 예외로 변환하는 역할을 추가로 수행한다. 

 

이는 데이터베이스 특정 예외를 스프링의 DataAccessException으로 변환하여 일관된 예외 처리를 가능하게 한다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

@Repository 애너테이션 역시 @Component 애너테이션을 메타 애너테이션으로 포함하고 있으며, 

 

예외 변환을 수행하는 AOP(Aspect-Oriented Programming) 기능을 제공한다. 

 

스프링 프레임워크는 PersistenceExceptionTranslationPostProcessor 빈을 사용하여 이러한 예외 변환을 자동으로 처리한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함