Spring에서 @Component, @Repository 및 @Service 주석의 차이점은 무엇입니까?


2103

@Component, @Repository@Service주석은 Spring에서 상호 교환 적으로 사용될 수 있습니까 ?

즉, Service 클래스가 있고 주석을에서 @Service로 변경해 @Component도 여전히 같은 방식으로 작동합니까?

아니면 주석이 클래스의 동작과 기능에도 영향을 줍니까?


8
Microsoft의 배경 지식을 가진 개발자 인 저는 이전 MS SmartClientSoftwareFactory 프레임 워크 (현재는 분산 데스크탑 앱에 대해 더 이상 사용되지 않는 복잡한 프레임 워크)에서 서비스의 의미 론적 정의를 상기합니다. 이 정의 ( Rich Newman에 의해 잘 문서화 됨)는 서비스를 상태가없는 재사용 가능한 객체, 바람직하게는 싱글 톤 범위를 갖는 인수로 전달 된 다른 객체에 대해 비즈니스 로직 작업을 수행하는 데 사용되는 것으로 정의했습니다. 나는 봄 서비스를 같은 방식으로 보는 경향이있다
Ivaylo Slavov

3
상관 없습니다 !! 당신을 위해 무엇이든 :) 나는 항상 Spring에 대해 이것을 싫어해서 항상 당신을 위해 "규칙"을 정의하는 경향이 있습니다. 말할 것도없이 Spring은 거대한 스택을 가지고 있습니다.
TriCore

30
@TriCore Sprting은 프레임 워크이며, "규칙"을 정의하면 그 역할을 수행 할 수 있습니다 :)
Walfrat

답변:


1500

에서 봄 문서 :

@Repository주석 (또한 데이터 액세스 개체 또는 DAO로 알려진) 저장소의 역할이나 고정 관념을 충족하는 모든 클래스에 대한 마커입니다. 이 마커의 사용 사이에 기술 된 바와 같이, 예외의 자동 번역 인 예외 번역 .

봄은 더 스테레오 타입 주석을 제공합니다 @Component, @Service하고 @Controller. @ComponentSpring 관리 컴포넌트의 일반적인 스테레오 타입입니다. @Repository, @Service@Controller의 특수화이다 @Component(각각, 지속성 서비스, 및 프레젠테이션 층)의보다 구체적인 사용 사례. 따라서 귀하의 구성 요소 클래스에 주석을 달 수 있습니다 @Component그들을 주석에 의해, 그러나 @Repository, @Service또는 @Controller 대신에, 당신의 클래스가 더 적절 도구에 의해 처리 또는 측면과 연관 적합합니다.

예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다. @Repository, @Service그리고 @Controller또한 Spring 프레임 워크의 향후 릴리스에 추가 의미를 수행 할 수 있습니다. 따라서 서비스 계층을 사용 @Component하거나 @Service서비스 계층 중 @Service하나를 선택하는 것이 더 나은 선택입니다. 마찬가지로 앞서 언급했듯이 @Repository지속성 계층에서 자동 예외 변환에 대한 마커로 이미 지원됩니다.

┌──────────────┬─────────────────────────────────────────────────────┐
 Annotation    Meaning                                             
├──────────────┼─────────────────────────────────────────────────────┤
  @Component   generic stereotype for any Spring-managed component 
  @Repository  stereotype for persistence layer                    
  @Service     stereotype for service layer                        
  @Controller  stereotype for presentation layer (spring-mvc)      
└──────────────┴─────────────────────────────────────────────────────┘

6
@WebServlet에 @Controller (또는 @Component)를 추가하는 것이 합리적입니까? Spring MVC 컨트롤러는 아니지만 개념적으로 가장 일치합니다. 서블릿 필터는 어떻습니까?
Rick

1
"@Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환의 마커로 지원됩니다." 평균?
Jack

9
이러한 주석은 AOP의 대상이되며 다른 주석은 아직 포인트 컷을 정의하지 않지만 향후에는 그렇게 할 수 있습니다. 반면 @Repository는 이미 포인트 컷의 대상입니다. 이 포인트 컷은 엄격한 변환을 피하기 위해 예외 변환, 즉 기술 별 예외를보다 일반적인 스프링 기반 예외로 변환하는 데 사용됩니다.
stivlo

3
@ stivlo : 나는 '스테레오 타입'이라는 용어를 이해하려고 노력했지만 여전히 이해하지 못했습니다. 이 용어를 이해하도록 도와 주실 수 있습니까? 많은 도움과 감사합니다
Premraj

2
@xenoterracide 실제로 많은 차이가 없습니다. 주석 뭔가 @Service 입니다 또한 @Component(때문에 @Service자체로 주석이 주석 @Component). 내가 아는 한 Spring 프레임 워크의 어떤 것도 무언가가라는 사실을 명시 적으로 사용하지 @Service않으므로 그 차이는 실제로 개념적 일뿐입니다.
Jesper

801

많은 답변이 이미 이러한 주석이 사용되는 것을 나타내므로 여기서는 약간의 차이점에 중점을 둘 것입니다.

먼저 유사점

다시 강조해야 할 첫 번째 사항 은 BeanDefinition의 스캔 자동 감지 및 종속성 주입과 관련하여 이러한 모든 주석 (즉, @Component, @Service, @Repository, @Controller)이 동일하다는 것입니다. 우리는 다른 것을 대신해서 사용할 수 있으며 여전히 길을 갈 수 있습니다.


@Component, @Repository, @Controller 및 @Service의 차이점

@구성 요소

클래스가 스프링 컴포넌트임을 나타내는 범용 스테레오 타입 어노테이션입니다.

@Component에 대해 특별한 무엇입니까
<context:component-scan> 만을 검사@Component및 위해 보이지 않는@Controller,@Service그리고@Repository일반적으로. 로 주석이 붙어 있기 때문에 스캔됩니다@Component.

그냥 봐 가지고 @Controller, @Service@Repository주석의 정의 :

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Repository {
    ….
}

 

@Component
public @interface Controller {
    
}

따라서, 그 말을 잘못 아니다 @Controller, @Service@Repository특수 유형의 @Component주석. <context:component-scan>로 주석을 달듯이 마치 다음 클래스를 Bean으로 등록합니다 @Component.

특수 유형 주석도 주석으로 @Component주석 이 붙어 있기 때문에 스캔됩니다. 이는 또한 주석이기도 @Component합니다. 자체 맞춤 주석을 정의하고로 주석을 달면 다음과 같이 @Component스캔됩니다.<context:component-scan>


@저장소

이것은 클래스가 데이터 저장소를 정의 함을 나타냅니다.

@Repository의 특별한 점은 무엇입니까?

이는 것을, 지적뿐만 아니라 구성 기반 주석이 , @Repository의 작업은 플랫폼 특정 예외를 잡으려고하고 봄의 통일 체크되지 않는 예외의 하나로서 그들을 재 - 던져. 이를 위해 다음 PersistenceExceptionTranslationPostProcessor과 같이 Spring의 애플리케이션 컨텍스트에 추가해야합니다.

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

이 bean post processor는 주석이 달린 모든 bean에 권고자를 추가하여 @Repository플랫폼 별 예외를 포착 한 다음 Spring의 점검되지 않은 데이터 액세스 예외 중 하나로 다시 생각합니다.


@제어 장치

@Controller주석은 특정 클래스가 컨트롤러의 역할을 역할을 나타냅니다. @Controller주석은 역할을 나타내는 주석 클래스에 대한 스테레오 타입 역할을합니다.

@Controller의 특별한 점은 무엇입니까?

우리는 같은 다른와이 주석을 전환 할 수 없습니다 @Service또는 @Repository그들이 동일하게 표시에도 불구하고. 디스패처는 어노테이션이있는 클래스를 스캔하고 어노테이션이있는 @Controller메소드를 감지 @RequestMapping합니다. @RequestMapping클래스에 주석이 달린 메소드에서만 on / in을 사용할 수 있으며 , 등에서 @Controller는 작동 하지 않습니다 .@Component@Service@Repository

참고 : 클래스가 이미 통해처럼, 어떤 다른 방법을 통해 빈으로 등록되어있는 경우 @Bean또는를 통해 @Component, @Service등 ... 주석, 다음 @RequestMapping클래스도 주석 경우 뽑힐 수 @RequestMapping주석. 그러나 그것은 다른 시나리오입니다.


@서비스

@Service Bean은 저장소 계층에서 비즈니스 로직 및 호출 메소드를 보유합니다.

@Service의 특별한 점은 무엇입니까?

비즈니스 로직을 보유하고 있음을 나타내는 데 사용된다는 사실 외에도이 주석에는 눈에 띄는 것이 없습니다. 그러나 누가 알더라도 Spring은 앞으로 몇 가지 예외를 추가 할 수 있습니다.


또 뭐요?

위에서와 마찬가지로, 미래에 봄은 특별한 기능을 추가 할 수 있습니다 @Service, @Controller그리고 @Repository자신의 레이어링 규칙에 따라. 따라서 컨벤션을 존중하고 레이어에 맞춰 사용하는 것이 좋습니다.


JPA가 감지되면 'PersistenceExceptionTranslationPostProcessor'가 자동으로 등록됩니다.
Olga

21
환상적인 설명. 당신은 나의 오해를 많이 정리했습니다. 우리가 모든 프로젝트를 처음부터 시작한 대학에서 왔기 때문에 프로그램을 직접 연결하지 않아도 Spring Applications가 왜 효과가 있었는지 이해하기 어려웠습니다. 주석은 이제 의미가 있습니다. 감사합니다!
NodziGames 2016 년

그런 다음 DI 기능 외에도 Hibernate (Persistence Layer)에 @Service 주석이 의미하는 것은 일종의 Entity를 가져 와서 각 DTO에 매핑하기위한 Persistence Layer Proxy는 어떻습니까? 이 계층은 지속성 계층의 역 동성을 위해 매우 중요합니다. 누군가 JPA에 미치는 영향을 깊이 알고 있다면 매우 도움이 될 것입니다)))
Musa

1
@Controller주석 에 대한 약간의 잘못된 정보가 있습니다. 클래스에 주석을 달고 @RequestMapping어떤 방식 으로든이 클래스의 Bean을 작성 하는 경우 필요하지 않습니다 . @Controller OR로 주석이 달린 빈 @RequestMapping은 Spring MVC의 요청 매핑에 참여할 것이다. 예를 들어 컨트롤러를 프로그래밍 방식으로 (예 : @Bean메소드를 사용하여 ) 작성 하는 동시에 패키지 스캔으로 패키지를 작성하지 못하도록하는 데 유용합니다 ( 패키지를 스캔에서 제외 할 수없는 경우).
Ruslan Stelmachenko는

1
이것은 최고 투표 답변이어야합니다-모든 질문에 대답하고 꽤 깊이갑니다. @stivlo는 첫 번째 OP 질문-기술적 차이점에 대해 많이 설명하지 않았습니다.
kiedysktos

430

그들은 거의 동일합니다-모두 클래스가 스프링 콩임을 의미합니다. @Service, @Repository@Controller 있는 전문 @Component들. 그들과 함께 특정 작업을 수행하도록 선택할 수 있습니다. 예를 들면 다음과 같습니다.

  • @Controller 콩은 spring-mvc에서 사용됩니다.
  • @Repository 빈은 지속성 예외 번역에 적합합니다.

또 다른 것은 구성 요소를 의미 적으로 다른 계층으로 지정한다는 것입니다.

제공하는 한 가지는 @Component다른 주석에 주석을 달고 다음과 같은 방식으로 사용할 수 있다는 것입니다.@Service 입니다.

예를 들어 최근에 만들었습니다.

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

따라서 주석이 달린 모든 클래스 @ScheduledJob는 스프링 콩이며 그 외에도 석영 작업으로 등록됩니다. 특정 주석을 처리하는 코드 만 제공하면됩니다.


1
@Component는 스프링 빈만을 의미하며 다른 목적입니까?
kapil das

21
@Component Bean은 스프링 컨테이너로 자동 감지 할 수 있습니다. 구성 파일에서 bean을 정의 할 필요는 없으며 런타임시 Spring에서 자동으로 감지합니다.
Akash5288

1
나는 일반적인 @Component를 좋아한다. 특히 @Scope (proxyMode = ScopedProxyMode.//MODE)와의 콤보
Eddie B

365

@Component는

<bean>

@Service, @Controller, @Repository = {@ 컴포넌트 + 더 특별한 기능}

이는 서비스, 컨트롤러 및 리포지토리가 기능적으로 동일하다는 것을 의미합니다.

세 개의 주석은 애플리케이션에서 "레이어" 를 분리하는 데 사용됩니다 .

  • 컨트롤러는 디스패치, 포워딩, 서비스 메소드 호출 등과 같은 작업을 수행합니다.
  • 서비스 보류 비즈니스 로직, 계산 등
  • 리포지토리는 DAO (데이터 액세스 개체)이며 데이터베이스에 직접 액세스합니다.

이제 왜 그것들을 분리 해야하는지 물을 수 있습니다. (AOP-Aspect Oriented Programming을 알고 있다고 가정합니다)

DAO 계층의 활동 만 모니터링한다고 가정 해 봅시다. DAO의 모든 메소드가 호출되기 전후에 로깅을 수행하는 Aspect (클래스) 클래스를 작성합니다. AOP를 사용하면 3 개의 개별 레이어가 있고 혼합되지 않으므로 AOP를 사용하여 수행 할 수 있습니다.

따라서 DAO 메소드 "around", "before"또는 "after"를 DAO 로깅 할 수 있습니다. 당신은 처음에 DAO를 가지고 있기 때문에 그렇게 할 수 있습니다. 방금 달성 한 것은 우려 또는 작업의 분리입니다.

@Controller 주석이 하나만 있다고 가정하면이 구성 요소에는 디스패치, 비즈니스 로직 및 액세스 데이터베이스가 모두 혼합되어 더러워진 코드가 있습니다!

위에서 언급 한 매우 일반적인 시나리오는 세 가지 주석을 사용해야하는 경우가 더 많다는 것입니다.


6
근본적인 질문이 있습니다-스프링 메커니즘에 의해 사용되는 주석입니까 아니면 프로그래머가 해당 코드 조각이 무엇을 기억하는지에 대한 것입니까?
user107986

25
@ user107986 주로 프로그래머가 애플리케이션의 계층을 기억합니다. 그러나 @Respository자동 예외 번역 기능도 있습니다. 예외가 예외에서 발생할 때와 같이 @Repository일반적으로 해당 예외에 대한 핸들러가 있으며 DAO 클래스에 try catch 블록을 추가 할 필요가 없습니다. 이것은 PersistenceExceptionTranslationPostProcessor와 함께 사용됩니다
Oliver

모든 "@Repository"클래스에 대한 조인트 포인트를 작성하는 방법을 샘플 코드로 작성해 주시겠습니까? 우리는 표현식을 사용하거나 빈 이름을 사용하지만이 조언이 모든 "@Repository"클래스에 적용된다고 말할 수 있습니다.이 샘플을 얻으려고했지만 찾을 수 없었습니다. 여러분의 도움은 정말 감사합니다.
Moni

또한 주석은 현재 모두 기능적으로 동일하게 작동하지만 지정된 속성에 대한 특정 기능이 나중에 추가 될 수 있습니다.
Cod3Citrus

224

@Component, @Service, @Controller, 및@Repository 스테레오 타입 주석에 사용되는 :

@Controller:귀하의 경우 요청 프리젠 테이션 페이지에서 매핑 할 즉, 프리젠 테이션 층은 다른 파일로 이동하지 않습니다이 직접 진행 @Controller에 요청 경로를 클래스와 검사 @RequestMapping필요한 경우 메서드 호출 이전에 작성된 주석.

@Service: 모든 비즈니스 로직은 여기에 있습니다. 즉 데이터 관련 계산 및 모두. 사용자가 지속성 메소드를 직접 호출하지 않으므로이 주석을 사용하여이 메소드를 호출하는 비즈니스 계층의 주석입니다. 사용자 요청에 따라 @Repository를 요청합니다.

@Repository: 데이터베이스에서 데이터를 가져 오는 데 사용되는 응용 프로그램의 지속성 계층 (데이터 액세스 계층)입니다. 즉, 모든 데이터베이스 관련 작업은 리포지토리에서 수행됩니다.

@Component -컴포넌트 스테레오 타입으로 다른 컴포넌트 (예 : REST 자원 클래스)에 주석을 답니다.

주석이 달린 클래스가 " 컴포넌트 " 임을 나타냅니다 . 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 감지의 후보로 간주됩니다.

다른 클래스 수준 주석은 구성 요소, 일반적으로 특별한 종류의 구성 요소를 식별하는 것으로 간주 될 수 있습니다 (예 : @Repository 주석 또는 AspectJ의 @Aspect 주석).

여기에 이미지 설명을 입력하십시오


24
이 답변은 모두 훌륭하지만 모두 우리가 원하는 것은 "비즈니스 로직"과 같은 일반적인 설명보다는 서비스와 같은 구성 요소가 제공하는 기능의 일부 코드 예입니다. 이 객체. 그렇지 않으면, 우리는 여전히 "아, 훌륭하고 모든 것을 제외하고는 여전히 동일한 코드를 컴포넌트에 적용 할 수있다"고 가정합니다.
dtc

2
모든 비즈니스 로직이 서비스에 들어가는 것은 아닙니다 ! DDD 측면에서 서비스는 둘 이상의 엔터티에 영향을주는 도메인 논리 만 포함해야합니다. 답변 참조 stackoverflow.com/a/41358034/238134
deamon

@deamon 네,하지만 개발자의 접근 방식에 따라 다름
Harshal Patil

4
@HarshalPatil 물론 서비스에 모든 비즈니스 로직이 포함 된 응용 프로그램을 작성할 수는 있지만 빈혈 도메인 모델이 될 수 있으며 엔터티에 대한 제약과 일관성을 강제하기가 어렵습니다.
deamon

1
물론 그것은 개발자의 접근 방식에 달려 있습니다. 다 그렇습니다. 문제에 부정확하게 접근하는 경우, 즉 구조없이 원하는 것을 작성하고 그것이 "접근법"이라고 말하면 제대로되지 않습니다. 물론 "오른쪽"과 "잘못"은 SOLID 및 기타 원칙과 같은 우수한 소프트웨어 개발 방식을 설명하는 용어로 사용되며 "지금은이 방식을 원합니다"와 같은 나쁜 소프트웨어 방식과 유사합니다.
milosmns

71

Spring 2.5에는 @Component, @Service 및 @Controller와 같은 추가 스테레오 타입 주석이 도입되었습니다. @Component는 모든 Spring 관리 구성 요소에 대한 일반적인 고정 관념으로 사용됩니다. 반면 @Repository, @Service 및 @Controller는보다 구체적인 사용 사례 (예 : 지속성, 서비스 및 프레젠테이션 계층 각각)에 대한 @Component 전문화 역할을합니다. 이는 컴포넌트 클래스에 @Component로 주석을 달 수 있지만, 대신 @Repository, @Service 또는 @Controller로 주석을 달면 클래스를 도구로 처리하거나 측면과 연관시키는 데 더 적합합니다. 예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다. 물론 @Repository, @Service 및 @Controller는 향후 스프링 프레임 워크 릴리스에서 추가 의미를 가질 수 있습니다. 그러므로, 서비스 계층에 @Component 또는 @Service를 사용하기로 결정한 경우 @Service가 더 나은 선택입니다. 마찬가지로 위에서 언급했듯이 @Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환을위한 마커로 지원됩니다.

@Component  Indicates a auto scan component.
@Repository  Indicates DAO component in the persistence layer.
@Service  Indicates a Service component in the business layer.
@Controller  Indicates a controller component in the presentation layer.

참조 : -Spring Documentation-Java를 사용한 클래스 경로 스캔, 관리되는 구성 요소 및 쓰기 구성


48

기술적으로 @Controller, @Service, @Repository모두 동일합니다. 그들 모두 확장됩니다 @Component.

스프링 소스 코드에서 :

주석이 달린 클래스가 "컴포넌트"임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 감지의 후보로 간주됩니다.

우리는 직접 사용할 수있는 @Component많은 응용 프로그램의 이해 및 유지 관리에 대한하지만, 각각의 모든 콩을 위해, 우리가 사용하는 @Controller, @Service,@Repository .

각 주석의 목적 :

  1. @Controller-> 주석이 달린 클래스는 클라이언트 측에서 요청을 받도록 고안되었습니다. 첫 번째 요청은 Dispatcher Servlet으로옵니다. 여기서 요청은 다음 값을 사용하여 특정 컨트롤러에 요청을 전달합니다.@RequestMapping 주석 .
  2. @Service-> 주석이 달린 클래스는 클라이언트에서 받거나 데이터베이스에서 가져 오는 데이터를 조작하기위한 것입니다. 데이터에 대한 모든 조작은이 계층에서 수행해야합니다.
  3. @Repository-> 주석이 달린 클래스는 데이터베이스에 연결하기위한 것입니다. DAO (Data Access Object) 레이어로 간주 될 수도 있습니다. 이 계층은 CRUD (만들기, 검색, 업데이트, 삭제) 작업으로 만 제한되어야합니다. 조작이 필요한 경우 데이터를 @Service 계층으로 다시 보내야합니다.

우리는 (사용 자신의 위치를 교환하는 경우 @Repository대신에 @Controller), 우리의 응용 프로그램이 잘 작동합니다.

서로 다른 세 가지를 사용하는 주요 목적은 @annotations엔터프라이즈 응용 프로그램에 더 나은 모듈성을 제공하는 것입니다.


2
교환 장소를 교체한다는 것은 무슨 의미입니까? controller and repository
Ashish Kamble

46

데이터베이스 연결 관점에서 사용 @Service@Repository주석은 중요합니다.

  1. 사용 @ServiceDB 연결의 모든 웹 서비스 유형
  2. 를 사용하여 @Repository모든 저장된 프로 시저의 DB 연결을위한

적절한 주석을 사용하지 않으면 롤백 트랜잭션으로 인해 커밋 예외가 발생할 수 있습니다. JDBC 트랜잭션 롤백과 관련된 스트레스로드 테스트 중 예외가 표시됩니다.


@Repository를 DB 작업 대신 RestAPI 호출에 사용할 수 있습니까?
Nayeem

@Nayeem 기술적으로 컨트롤러 및 저장소로 서비스에 서비스로 주석을 달 수 있습니다. 종속성 주입은 동일하게 작동합니다. 그러나 왜 그렇게 하시겠습니까? 데이터베이스 엔터티와 함께 ​​작동하지 않는 경우 리포지토리가 아니며 @Repository지속성 레이어와 작동하도록 특별히 설계되었습니다. 나머지 API를 사용하는 경우 DAO가 아닌 DTO를 사용하는 것입니다.

28

@Repository @Service@Controller 는 @Service를 @Component로 대체 할 수 있지만이 경우 전문화를 잃을 수있는보다 구체적인 사용을 위해 @Component의 전문화 역할을합니다.

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.

27

이 모든 주석은 스테레오 유형의 주석 유형이며,이 세 주석의 차이점은

  • @Component를 추가하면 클래스의 역할이 컴포넌트 클래스임을 알려줍니다.이 클래스는 논리를 구성하는 클래스임을 의미하지만 클래스가 특정 비즈니스 또는 지속성 또는 컨트롤러 논리를 포함하는지 여부를 알려주지 않으므로 사용하지 않습니다. 이 @Component 주석을 직접
  • @Service 주석을 추가하면 비즈니스 로직을 구성하는 클래스의 역할을 알려줍니다.
  • 클래스 위에 @Repository를 추가하면 지속성 논리로 구성된 클래스를 알려줍니다
  • 여기서 @Component는 @ Service, @ Repository 및 @Controller 주석에 대한 기본 주석입니다.

예를 들어

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • 기본 주석 으로 @Serviceor @Repositroy또는 @Controller주석을 추가 할 때마다 @Component클래스 상단에 존재합니다.

23

봄, 그들이 자동차 부품 검사 주석의 네 가지 유형을 제공 @Component, @Service, @Repository@Controller . 기술적으로는 차이점이 없지만 모든 자동 구성 요소 스캔 주석은 특수 목적과 정의 된 레이어 내에서 사용해야합니다.

@Component: 기본 자동 구성 요소 스캔 주석이며 주석이 달린 클래스가 자동 스캔 구성 요소임을 나타냅니다.

@Controller: 주석이 달린 클래스는 컨트롤러 컴포넌트이며 주로 프리젠 테이션 레이어에서 사용됨을 나타냅니다.

@Service: 주석이 달린 클래스가 비즈니스 계층의 서비스 구성 요소임을 나타냅니다.

@Repository: 지속성 계층 내에서이 주석을 사용해야하며 데이터베이스 저장소처럼 작동합니다.

@Component이 주석에는 앞으로 특정 동작이 포함될 수 있으므로 클래스에 주석을 달면서 보다 특수한 형식을 선택해야합니다 .


20

우리는 자바 표준에 따라 이것에 대답 할 수 있습니다

을 참조하면 JSR-330이제 스프링에 의해 지원되는, 만 사용할 수 있습니다 @Named빈을 (어떻게 든 정의 @Named=@Component). 따라서이 표준에 따르면 카테고리 Bean에 스테레오 타입 (예 @Repository: @Service,, @Controller)을 정의 할 필요가없는 것 같습니다 .

그러나 스프링 사용자는 이러한 특수 주석을 특정 용도에 따라 다르게 사용하십시오.

  1. 개발자가 유능한 분야에 대해 더 나은 범주를 정의하도록 도와줍니다. 이 분류는 경우에 따라 도움이 될 수 있습니다. (예를 들어을 사용하는 aspect-oriented경우 이것에 대한 좋은 후보가 될 수 있습니다. pointcuts)
  2. @Repository 주석은 Bean에 일부 기능을 추가합니다 (일부 Bean Persistence 계층으로 자동 예외 변환).
  3. 스프링 MVC를 사용 @RequestMapping하는 경우로 주석이 달린 클래스에만 추가 할 수 있습니다 @Controller.

당신의 3 점에 관해서. 그건 사실이 아니야. 서비스 클래스의 메소드에도 @RequestMapping 주석을 추가 할 수 있습니다 (@Service로 주석이 달린 클래스를 의미합니다).
Rahul Gupta

19

REST Resource 클래스와 같이 @Component로 다른 컴포넌트에 주석을 답니다.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@Component는 모든 Spring 관리 컴포넌트의 일반적인 스테레오 타입입니다.

@Controller, @Service 및 @Repository는 특정 사용 사례에 대한 @Component의 전문화 영역입니다.

봄의 @Component

"구성 요소 전문화"


18

사이에는 차이가 없습니다 @Component, @Service, @Controller, @Repository. @ComponentMVC의 구성 요소를 나타내는 일반 주석입니다. 그러나 서비스 계층 구성 요소, 지속성 계층 구성 요소 및 프레젠테이션 계층 구성 요소와 같은 MVC 응용 프로그램의 일부로 여러 구성 요소가 있습니다. 따라서 봄 사람들은 다른 세 가지 주석도 제공했습니다.

  • 지속성 계층 구성 요소를 나타내려면 @Repository
  • 서비스 계층 구성 요소를 표시하려면 다음을 수행하십시오. @Service
  • 프리젠 테이션 레이어 구성 요소를 나타내려면 다음을 수행하십시오. @Controller
  • 그렇지 않으면 당신 @Component은 그들 모두를 위해 사용할 수 있습니다.

17

@Component, @Repository 또는 @service를 서로 바꿔도

구성 요소 또는 @ 서비스를 사용하는 경우 Repository 대신 DAO와 관련된 특정 예외를 포착 할 수 없다는 것이 하나의 측면입니다.


15

Spring 4의 최신 버전 :

@Repository 어노테이션은 리포지토리의 역할 또는 스테레오 타입 (데이터 액세스 오브젝트 또는 DAO라고도 함)을 충족하는 모든 클래스의 마커입니다. 이 마커의 사용 중에는 20.2.2 절“예외 변환”에 설명 된 예외의 자동 번역이 있습니다.

Spring은 추가 스테레오 타입 어노테이션을 제공합니다 : @Component, @Service 및 @Controller. @Component는 Spring 관리 컴포넌트의 일반적인 스테레오 타입입니다. @Repository, @Service 및 @Controller는 각각 지속성, 서비스 및 프레젠테이션 계층과 같은보다 구체적인 사용 사례에 대한 @Component의 전문화 영역입니다. 따라서 @Component로 컴포넌트 클래스에 주석을 달 수 있지만 대신 @Repository, @Service 또는 @Controller로 주석을 달면 클래스가 도구로 처리하거나 측면과 연관시키는 데 더 적합합니다. 예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다. @Repository, @Service 및 @Controller는 향후 스프링 프레임 워크 릴리스에서 추가 의미를 가질 수 있습니다. 그러므로, 서비스 계층에 @Component 또는 @Service를 사용하도록 선택하는 경우 @Service가 더 나은 선택입니다. 마찬가지로 위에서 언급했듯이 @Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환을위한 마커로 지원됩니다.


15

@Component : 클래스에 주석을 달면 @Component최대 절전 모드에서 Bean임을 알립니다.

@Repository : 클래스에 주석을 달면 @RepositoryDAO 클래스 인 최대 절전 모드에이를 DAO 클래스로 취급합니다. 확인되지 않은 예외 (DAO 메소드에서 발생)를 Spring으로 변환 할 수있게 함을 의미합니다 DataAccessException.

@Service : 이것은 최대 절전 모드에 @Transactional서비스 계층 주석 이있는 서비스 클래스임을 알려주 므로 최대 절전 모드는이를 서비스 구성 요소로 취급합니다.

플러스 @Service는입니다 @Component. Bean 클래스 이름을로 가정 CustomerService하십시오. XML Bean 구성 방법을 선택하지 않았으므로 Bean으로 주석을 달아 Bean에 주석을 달았습니다 @Component. Bean 객체를 가져 오는 동안 CustomerService cust = (CustomerService)context.getBean("customerService");기본적으로 Spring은 컴포넌트의 첫 문자 인 'CustomerService'에서 'customerService'를 소문자로 사용합니다. 이름이 'customerService'인이 구성 요소를 검색 할 수 있습니다. 그러나 @ServiceBean 클래스에 주석을 사용하면 다음과 같이 특정 Bean 이름을 제공 할 수 있습니다.

@Service("AAA")
public class CustomerService{

그리고 당신은 콩 객체를 얻을 수 있습니다

CustomerService cust = (CustomerService)context.getBean("AAA");

13

@Component 주석이 달린 빈을 스캔하여 DI 컨테이너에서 사용할 수있게하는 최상위 일반 주석입니다.

@Repository 특수 주석이며 DAO 클래스에서 확인되지 않은 모든 예외를 변환하는 기능을 제공합니다.

@Service특수 주석입니다. 현재로서는 새로운 기능을 제공하지 않지만 Bean의 의도를 분명히합니다.

@Controller는 빈 MVC 인식을하고 같은 더 주석의 사용을 허용 주석 전문 @RequestMapping그러한 모든를

자세한 내용 은 다음과 같습니다


11

A는 @Service봄 문서를 인용하기

주석이 달린 클래스는 " 도메인 기반 디자인 (Evans, 2003)에 의해 원래 정의 된 상태로 모델에 독립된 인터페이스로 제공되는 작업"으로 정의 된 "서비스"임을 나타냅니다 . 클래스가 "비즈니스 서비스 외관"(핵심 J2EE 패턴 의미) 또는 이와 유사한 것임을 나타낼 수도 있습니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.

에릭 에반스의 도메인 주도 디자인을 보면,

SERVICE는 ENTITIES 및 VALUE OBJECTS와 같이 캡슐화 상태없이 모델에서 독립적 인 인터페이스로 제공되는 작업입니다. 서비스는 기술 프레임 워크에서 일반적인 패턴이지만 도메인 계층에도 적용될 수 있습니다. 이름 서비스는 다른 개체와의 관계를 강조합니다. ENTITIES 및 VALUE OBJECTS와는 달리 클라이언트에 대해 수행 할 수있는 기능 측면에서 순수하게 정의됩니다. SERVICE는 엔티티가 아닌 활동, 즉 명사가 아닌 동사로 명명되는 경향이 있습니다. 서비스는 여전히 추상적이고 의도적 인 정의를 가질 수 있습니다. 그것은 단지 객체의 정의와 다른 풍미를 가지고 있습니다. 서비스는 여전히 정의 된 책임이 있어야하며, 그 책임과이를 수행하는 인터페이스는 도메인 모델의 일부로 정의되어야합니다. 조작 이름은 유비쿼터스 언어에서 가져 오거나 도입해야합니다. 매개 변수 및 결과는 도메인 개체 여야합니다. 서비스는 신중하게 사용해야하며 모든 행동의 개체 및 가치있는 물건을 제거해서는 안됩니다. 그러나 작업이 실제로 중요한 도메인 개념 인 경우 SERVICE는 MODEL-DRIVEN DESIGN의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다. 서비스는 모델 중심 디자인의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다. 서비스는 모델 중심 디자인의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다.

그리고 Repository에릭 에반스에 따라,

REPOSITORY는 특정 유형의 모든 객체를 개념 집합 (일반적으로 에뮬레이션)으로 나타냅니다. 보다 정교한 쿼리 기능을 제외하고는 컬렉션처럼 작동합니다. 적절한 유형의 오브젝트가 추가 및 제거되고 REPOSITORY 뒤에있는 기계가 오브젝트를 삽입하거나 데이터베이스에서 삭제합니다. 이 정의는 초기 수명주기에서 끝까지 AGGREGATES의 근본에 대한 액세스를 제공하는 일관된 책임 세트를 수집합니다.


11

구성 요소 저장소 서비스 주석 사이의 차이점을 설명하기에 충분한 대답이 있습니다. 나는 차이점을 공유하고 싶습니다@Controller & @RestController

@Controller vs RestController

@RestController:

여기에 이미지 설명을 입력하십시오

  • 이 주석은 특수 버전으로 @Controller추가 @Controller되고@ResponseBody 으로 자동으로 주석 됩니다. 따라서 @ResponseBody매핑 방법 을 추가 할 필요가 없습니다 . 이는 @ResponseBody기본적으로 활성화되어 있음을 의미 합니다.
  • 당신이 사용하는 경우 @RestController 하면 뷰를 반환 할 수 없습니다 ( ViewresolverSpring / Spring-Boot에서 사용)
  • @RestController또한에 대한 응답으로 변환 JSON/XML automatically으로 @ResponseBody몸에있을 수있는 일에 반환 된 객체를 만든다을,e.g. JSON or XML

@Controller

여기에 이미지 설명을 입력하십시오

  • @Controller클래스를 Spring MVC Controller로 표시하는 데 사용됩니다. 이 주석은@Component 클래스 경로 스캔을 기반으로 컨트롤러 클래스를 자동 감지 할 수 있습니다.
  • @Controller Spring web MVC에서 뷰를 반환 할 수 있습니다.

더 자세히보기


9

리포지토리서비스구성 요소 주석의 하위입니다 . 그래서 그것들은 모두 Component 입니다. 리포지토리서비스 가 확장되었습니다. 정확히 어떻게? 서비스 는 이념적 차이 만 있습니다 : 우리는 서비스를 위해 서비스를 사용합니다. 리포지토리 에는 특정 예외 처리기가 있습니다.


6

고정 관념 설명 :

  • @Service-모든 서비스 클래스에 @Service로 주석을 답니다. 이 계층은 작업 단위를 알고 있습니다. 모든 비즈니스 로직은 서비스 클래스에 있습니다. 일반적으로 서비스 계층의 방법은 트랜잭션에 포함됩니다. 한 트랜잭션이 실패하면 모든 트랜잭션이 롤백되어야합니다. 서비스 메소드에서 여러 DAO 호출을 수행 할 수 있습니다.
  • @Repository-@Repository로 모든 DAO 클래스에 주석을 답니다. 모든 데이터베이스 액세스 로직은 DAO 클래스에 있어야합니다.
  • @Component -컴포넌트 스테레오 타입으로 다른 컴포넌트 (예 : REST 자원 클래스)에 주석을 답니다.
  • @Autowired -@Autowired 주석을 사용하여 Spring이 다른 bean을 클래스에 자동으로 연결하도록하십시오.

@ComponentSpring 관리 컴포넌트의 일반적인 스테레오 타입입니다. @Repository, @Service@Controller의 전문 분야입니다@Component 구체적인 사용 예에 대한, 예를 들어, 각각 지속성 서비스, 및 프리젠 테이션 층이다.

원래 여기 에 대답 했습니다 .


5

@Component, @Repository, @Controller 및 @Service 주석의 차이점

@Component – ​​일반이며 응용 프로그램에서 사용할 수 있습니다.
@Service – 서비스 계층 수준에서 클래스에 주석을 답니다.
@Controller – Spring MVC에서 주로 사용되는 프리젠 테이션 레이어 레벨의 클래스에 주석을 달 수 있습니다.
@Repository – 지속성 계층에서 클래스에 주석을 달면 데이터베이스 저장소로 작동합니다.

@Controller= @Component (내부 주석) + 프리젠 테이션 계층 기능
@Service= @Component (내부 주석) + 서비스 계층 기능
@Component= 실제 컴포넌트 (Beans)
@Repository= @Component (내부 주석) + 데이터 계층 기능 (도메인 Bean 처리에 사용)


3

스프링 프레임 워크에서 스테레오 타입 주석이라고하는 특수한 유형의 주석을 제공합니다. 이들은 다음과 같습니다 :-

@RestController- Declare at controller level.
@Controller  Declare at controller level.
@Component  Declare at Bean/entity level.
@Repository  Declare at DAO level.
@Service  Declare at BO level.

위에서 선언 한 주석은 <context:component-scan>xxx-servlet.xml 파일에 추가 할 때 컨텍스트 생성 /로드 단계에서 주석으로 주석이 달린 클래스의 객체를 자동으로 생성 하기 때문에 특별 합니다.


2

@Component, @ Repository, @ Service, @Controller:

@Component에 의해 관리되는 구성 요소에 대한 일반적인 관념은 봄 @Repository, @Service하고 @Controller있는 @Component보다 구체적인 사용하는을위한 전문 :

  • @Repository 지속성을 위해
  • @Service 서비스 및 거래
  • @Controller MVC 컨트롤러 용

왜 사용 @Repository, @Service, @Controller이상@Component ? 컴포넌트 클래스를 @Component로 표시 할 수 있지만, 대신 예상되는 기능에 맞는 대안을 사용합니다. 우리 수업은 각각의 특정한 경우에 예상되는 기능에 더 적합합니다.

주석이 달린 클래스 @Repository는 org.springframework.dao.DataAccessException으로 더 나은 번역 및 읽기 쉬운 오류 처리 기능을 갖습니다. 데이터에 액세스하는 컴포넌트 (DataAccessObject 또는 DAO)를 구현하는 데 이상적입니다.

@ControllerSpring Web MVC 애플리케이션에서 컨트롤러 역할을 하는 주석이 달린 클래스

@Service비즈니스 로직 서비스에서 주석이 달린 클래스 , 예를 들어 DAO 관리자의 Facade 패턴 (Facade) 및 트랜잭션 처리


2

여기에 제시된 답변은 대부분 기술적으로 정확하지만 응답 목록이 길고 맨 아래에 있지만 실제로 누군가가 그것을 넘어서서 가치있는 것을 배우는 경우를 대비하여 실제로 올바른 응답을 넣을 가치가 있다고 생각했습니다. 그것. 나머지 답변이 잘못되었다는 것이 아니라 단지 그들이 옳지 않다는 것입니다. 그리고 트롤 무리를 막기 위해, 기술적으로 이러한 주석은 사실상 똑같으며 봄 5까지도 가장 상호 교환이 가능하다는 것을 알고 있습니다.

이 세 가지 주석은 완전히 다른 것으로 상호 교환 할 수 없습니다. 하나가 아닌 세 개가 있기 때문에 알 수 있습니다. 그것들은 상호 교환 가능하도록 의도 된 것이 아니며, 우아하고 편리하지 않은 방식으로 구현되었습니다.

현대 프로그래밍은 다양한 비율로 발명, 예술, 기술 및 커뮤니케이션입니다. 통신 비트는 일반적으로 코드가 작성된 것보다 훨씬 자주 읽히기 때문에 매우 중요합니다. 프로그래머는 기술적 인 문제를 해결하려고 할뿐만 아니라 코드를 읽는 미래의 프로그래머에게 의사를 전달하려고합니다. 이 프로그래머들은 모국어 나 사회 환경을 공유하지 않을 수도 있으며, 향후 50 년 동안 코드를 읽을 수도 있습니다 (생각할 것 같지는 않습니다). 미래까지 효과적으로 의사 소통하기는 어렵습니다. 그러므로 우리가 사용할 수있는 가장 명확하고 효율적이며 정확하고 의사 소통적인 언어를 사용하는 것이 중요합니다.

예를 들어, @Repository우리가 아닌 저장소를 작성할 때 사용되는 것이 중요합니다 @Component. 후자는 저장소를보고 있음을 나타내지 않기 때문에 저장소에 대한 주석의 선택이 매우 좋지 않습니다. 리포지토리도 스프링 빈이라고 가정 할 수 있지만 구성 요소가 리포지토리 인 것은 아닙니다. 와@Repository 우리가 우리의 언어로 명확하고 구체적인되고있다. 우리는 이것이 저장소라는 것을 분명히 밝히고 있습니다. 와@Component우리는 읽고있는 구성 요소 유형을 결정하기 위해 독자에게 맡기고 있으며, 의미를 유추하기 위해 전체 클래스 (및 서브 클래스 및 인터페이스 트리)를 읽어야합니다. 이 클래스는 먼 미래에 리포지토리가 아닌 것으로 독자에 의해 잘못 해석 될 수 있으며, 이것이 리포지토리라는 것을 완전히 알고있는 우리가 언어에 구체적으로 설명하지 못했기 때문에이 실수에 대해 부분적으로 책임을 졌을 것입니다 우리의 의도를 효과적으로 전달하십시오.

다른 예제는 다루지 않겠지 만 최대한 명확하게 설명하겠습니다. 이러한 주석은 완전히 다른 것이므로 의도에 따라 적절하게 사용해야합니다. @Repository스토리지 저장 소용이며 다른 주석이 올바르지 않습니다. @Service서비스 용이며 다른 주석이 맞지 않습니다. @Componentrepostories 나 service가 아닌 구성 요소를위한 것이며 이들 중 하나를 대신 사용하는 것도 올바르지 않습니다. 컴파일 될 수도 있고 테스트를 실행하고 통과 할 수도 있지만 잘못된 것이므로이 작업을 수행하는 경우 (전문적으로) 덜 생각할 것입니다.

봄 내내 (및 일반적으로 프로그래밍)에 대한 예가 있습니다. @ControllerREST API를 작성할 때 사용할 수 없으므로 사용해서는 안됩니다 @RestController. @RequestMappingwhen @GetMappingis a valid alternative를 사용해서는 안됩니다 . 기타 등 기타 독자에게 의도를 전달할 수있는 가장 정확하고 정확한 언어를 선택 해야합니다 . 그렇지 않으면 시스템에 위험을 초래할 수 있으며 위험에는 비용이 발생합니다.


잘 말하고 좋은 지적!
Andy

1

이 그림을 단순화하기 위해, 우리가 사용 사례에 의해 전문적를 생각해 보자,이 주석을 주입하는 데 사용됩니다 및 말했듯이 문자 그대로 " 주입하는 데 사용됩니다 사용하는 방법을 알고있는 경우에, 그 말은," 의존성 삽입 (Dependency Injection) "DI" 당신을 그런 다음 항상 이러한 주석을 찾아야하며 이러한 스테레오 유형으로 클래스에 주석을 달아 DI 컨테이너에 스캔하여 다른 장소에 주입 할 준비가되었는지를 알려주십시오 . 이것이 실제 목표입니다.

이제 각각으로 이동하자; 첫 번째 @Service , 특정 비즈니스 사례에 대한 논리를 작성하는 경우 비즈니스 논리가 포함될 장소에서 분리 해야하는 경우이 서비스는 일반 클래스이거나 원하는 경우 인터페이스로 사용할 수 있으며 다음과 같이 작성됩니다 이

@Service
public class Doer {
   // Your logic 
}

// To use it in another class, suppose in Controller 
@Controller
public class XController {
 // You have to inject it like this 
 @Autowired 
 private Doer doer;
}

@Repository 를 주입 할 때 모두 동일한 방식입니다 .Repository 는 Repository Pattern Repository 디자인 패턴에 대한 구현을 적용하는 인터페이스 이며 일반적으로 일부 데이터 저장소 또는 데이터베이스를 처리 할 때 사용되며 여러 항목이 포함되어 있음을 알 수 있습니다 데이터베이스 작업을 처리 할 수있는 준비된 구현. CrudRepository , JpaRepository 등이 될 수 있습니다 .

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

마지막으로 @Component , 이것은 Spring에서 등록 된 빈의 일반적인 형식입니다. 스프링은 항상 @Component로 표시된 빈을 찾고 있습니다. 그런 다음 @Service와 @Repository는 @Component의 특별한 경우이지만 일반적인 사용 사례입니다 구성 요소는 직접적인 비즈니스 사례를 다루지 않는 순수한 기술적 인 것을 만들 때입니다! 날짜 형식 지정 또는 특수 요청 직렬화 메커니즘 등을 전달합니다.


0

@Component 는 구성 클래스에서 @Bean 주석으로 작동하고 스프링 컨텍스트에서 Bean을 등록합니다. 또한 @Service, @Repository 및 @Controller 주석의 부모입니다.

@Service , @Component 주석을 확장하며 이름 차이 만 있습니다.

@ Repository-@Component 주석을 확장하고 모든 데이터베이스 예외를 DataAccessException 으로 변환합니다 .

@ Controller-MVC 패턴에서 컨트롤러 역할을합니다. 디스패처는 이러한 주석이 달린 클래스에서 매핑 된 메소드를 검색하여 @RequestMapping 주석을 감지합니다.


-13
@Component
@Controller
@Repository
@Service
@RestController

이것들은 모두 StereoType 주석입니다. 이것은 클래스를 ioc 컨테이너에서 스프링 빈으로 만드는 데 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.