@Component
, @Repository
및 @Service
주석을 Spring에서 서로 바꿔서 사용할 수 있습니까? 아니면 표기 장치로 작동하는 것 외에 특정 기능을 제공합니까?
즉, Service 클래스가 있고 주석을 @Service
에서 @Component
변경하면 여전히 동일한 방식으로 작동합니까?
아니면 주석이 클래스의 동작과 기능에도 영향을 줍니까?
질문자 :Colin McCree
@Component
, @Repository
및 @Service
주석을 Spring에서 서로 바꿔서 사용할 수 있습니까? 아니면 표기 장치로 작동하는 것 외에 특정 기능을 제공합니까?
즉, Service 클래스가 있고 주석을 @Service
에서 @Component
변경하면 여전히 동일한 방식으로 작동합니까?
아니면 주석이 클래스의 동작과 기능에도 영향을 줍니까?
스프링 문서에서 :
@Repository
주석은 리포지토리(데이터 액세스 개체 또는 DAO라고도 함)의 역할 또는 스테레오타입을 수행하는 모든 클래스에 대한 마커입니다. 이 마커의 용도 중에는 예외 번역에 설명된 대로 예외의 자동 번역이 있습니다.
@Component
,@Service
@Controller
와 같은 추가 스테레오타입 주석을 제공합니다.@Component
는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입입니다.@Repository
,@Service
및@Controller
는 보다 구체적인 사용 사례(각각 지속성, 서비스 및 프레젠테이션 계층에서)를 위한@Component
전문화입니다. 따라서 구성 요소 클래스에@Component
@Repository
,@Service
또는@Controller
로 주석을 추가하면 클래스가 도구로 처리하거나 측면과 연결하는 데 더 적합합니다.예를 들어, 이러한 스테레오타입 주석은 포인트컷의 이상적인 대상이 됩니다.
@Repository
,@Service
및@Controller
는 Spring Framework의 향후 릴리스에서 추가 의미를 전달할 수도 있습니다. 따라서 서비스 계층에@Component
또는@Service
를 사용하는 것 중에서 선택하는 경우@Service
가 분명히 더 나은 선택입니다. 마찬가지로 앞서 언급한 것처럼@Repository
는 이미 지속성 계층에서 자동 예외 변환을 위한 마커로 지원됩니다.
주석 | 의미 |
---|---|
@Component | 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입 |
@Repository | 퍼시스턴스 레이어에 대한 고정관념 |
@Service | 서비스 계층에 대한 고정관념 |
@Controller | 프리젠테이션 레이어의 스테레오타입(spring-mvc) |
많은 답변에서 이러한 주석의 용도가 이미 명시되어 있으므로 여기서는 몇 가지 사소한 차이점에 초점을 맞출 것입니다.
첫 번째 유사성
다시 강조할 가치가 있는 첫 번째 요점 은 BeanDefinition에 대한 스캔 자동 감지 및 종속성 주입과 관련하여 이러한 모든 주석(즉, @Component, @Service, @Repository, @Controller)이 동일하다는 것입니다. 우리는 다른 것 대신에 하나를 사용할 수 있고 여전히 주위를 둘러볼 수 있습니다.
@요소
이것은 클래스가 스프링 컴포넌트임을 나타내는 범용 스테레오타입 주석입니다.
@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>
@Component
주석이 달린 것처럼 다음 클래스를 빈으로 등록합니다.
특수 유형 주석은 자체적으로 @Component
주석으로 주석이 달렸기 때문에 스캔됩니다. 즉, @Component
사용자 정의 주석을 정의하고 @Component
<context:component-scan>
@저장소
이는 클래스가 데이터 저장소를 정의함을 나타냅니다.
@Repository의 특별한 점은 무엇입니까?
이것이 주석 기반 구성 임을 지적하는 것 외에도 @Repository
의 작업은 플랫폼별 예외를 포착하고 이를 Spring의 통합된 확인되지 않은 예외 중 하나로 다시 throw하는 것입니다. 이를 위해 다음과 같이 Spring의 애플리케이션 컨텍스트에 추가해야 하는 PersistenceExceptionTranslationPostProcessor
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
@Repository
주석이 달린 빈에 어드바이저를 추가하여 플랫폼별 예외가 포착된 다음 Spring의 확인되지 않은 데이터 액세스 예외 중 하나로 다시 throw되도록 합니다.
@제어 장치
@Controller 주석은 특정 클래스가 컨트롤러 역할을 @Controller
@Controller
어노테이션은 해당 역할을 나타내는 어노테이션이 있는 클래스에 대한 스테레오타입 역할을 합니다.
@Controller의 특별한 점은 무엇입니까?
@Service
또는 @Repository
와 같은 다른 주석으로 이 주석을 전환할 수는 없습니다. @Controller
주석이 달린 클래스를 스캔하고 @RequestMapping
주석으로 주석이 달린 메소드를 감지합니다. @RequestMapping
@Controller
로 주석이 달려 있고 @Component
, @Service
, @Repository
등에서는 작동하지 않는 메서드에서만 사용할 수 있습니다.
@Bean
또는 @Component
, @Service
등... 주석과 같은 대체 방법을 통해 이미 Bean으로 등록된 경우 클래스에도 @RequestMapping
주석이 @RequestMapping
그러나 그것은 다른 시나리오입니다.
@서비스
@Service
Bean은 저장소 계층에서 비즈니스 로직과 호출 메소드를 보유합니다.
@Service의 특별한 점은 무엇입니까?
비즈니스 로직을 보유하고 있음을 나타내는 데 사용된다는 사실 외에는 이 주석에서 눈에 띄는 것이 없습니다. 그러나 Spring은 미래에 예외적인 기능을 추가할 수 있습니다.
또 무엇을?
위와 유사하게 미래에 Spring은 계층화 규칙에 따라 @Service
, @Controller
및 @Repository
대한 특수 기능을 추가할 수 있습니다. 따라서 항상 규칙을 존중하고 레이어와 함께 사용하는 것이 좋습니다.
그것들은 거의 동일합니다 - 그들 모두는 클래스가 Spring bean이라는 것을 의미합니다. @Service
, @Repository
및 @Controller
는 특수화된 @Component
입니다. 그들과 함께 특정 작업을 수행하도록 선택할 수 있습니다. 예를 들어:
@Controller
빈은 spring-mvc에서 사용됩니다.@Repository
Bean은 지속성 예외 변환에 적합합니다.또 다른 점은 구성 요소를 의미적으로 다른 레이어에 지정한다는 것입니다.
@Component
제공하는 한 가지는 다른 주석에 주석을 달 수 있고 @Service
와 같은 방식으로 사용할 수 있다는 것입니다.
예를 들어 최근에 다음을 만들었습니다.
@Component @Scope("prototype") public @interface ScheduledJob {..}
@ScheduledJob
으로 주석이 달린 모든 클래스는 스프링 빈이며 여기에 추가로 석영 작업으로 등록됩니다. 특정 주석을 처리하는 코드를 제공하기만 하면 됩니다.
@Component는 다음과 같습니다.
<bean>
@Service, @Controller, @Repository = {@Component + 몇 가지 더 특별한 기능}
즉, 서비스, 컨트롤러 및 저장소는 기능적으로 동일합니다.
세 개의 주석은 애플리케이션에서 "레이어" 를 구분하는 데 사용됩니다.
이제 당신은 그것들을 분리하는 이유를 물을 수 있습니다: (나는 당신이 AOP-Aspect Oriented Programming을 알고 있다고 가정합니다)
DAO 계층의 활동만 모니터링한다고 가정해 보겠습니다. DAO의 모든 메서드가 호출되기 전후에 일부 로깅을 수행하는 Aspect(A 클래스) 클래스를 작성할 것입니다. AOP를 사용하면 세 개의 개별 레이어가 있고 혼합되지 않기 때문에 이를 수행할 수 있습니다.
따라서 DAO 메소드 "주변", "전" 또는 "후"에 DAO 로깅을 수행할 수 있습니다. 처음에 DAO가 있었기 때문에 그렇게 할 수 있었습니다. 방금 달성한 것은 관심사 또는 작업의 분리입니다.
@Controller 주석이 하나만 있다고 상상해보십시오. 이 구성 요소에는 디스패칭, 비즈니스 로직 및 데이터베이스 액세스가 모두 혼합되어 더러운 코드가 있습니다!
위에서 언급한 것은 매우 일반적인 시나리오 중 하나이며 세 가지 주석을 사용해야 하는 더 많은 사용 사례가 있습니다.
Spring @Component
, @Service
, @Controller
및 @Repository
는 다음을 위해 사용되는 스테레오타입 주석입니다.
@Controller:
프레젠테이션 페이지 의 요청 매핑이 완료되는 곳, 즉 프레젠테이션 레이어가 다른 파일로 이동하지 않고 @Controller
클래스로 직접 이동하고 필요한 경우 메서드 호출 전에 작성된 @RequestMapping
주석에서 요청된 경로를 확인합니다.
@Service
: 모든 비즈니스 로직이 여기에 있습니다. 즉, 데이터 관련 계산 및 모든 것입니다. 사용자가 지속성 메서드를 직접 호출하지 않는 비즈니스 계층의 주석이므로 이 주석을 사용하여 이 메서드를 호출합니다. 사용자 요청에 따라 @Repository를 요청합니다.
@Repository
: 데이터베이스에서 데이터를 가져오기 위해 사용한 애플리케이션의 Persistence 계층(Data Access Layer)입니다. 즉, 모든 데이터베이스 관련 작업은 저장소에서 수행됩니다.
@Component
- 구성 요소 스테레오타입으로 다른 구성 요소(예: REST 리소스 클래스)에 주석을 추가합니다.
주석이 달린 클래스가 " component "임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 스캐닝을 사용할 때 자동 감지 후보로 간주됩니다.
다른 클래스 수준 주석은 일반적으로 @Repository 주석 또는 AspectJ의 @Aspect 주석과 같은 특수한 종류의 구성 요소를 식별하는 것으로 간주될 수 있습니다.
Spring 2.5는 @Component, @Service 및 @Controller와 같은 추가 스테레오타입 주석을 도입합니다. @Component는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입 역할을 합니다. 반면 @Repository, @Service 및 @Controller는 보다 구체적인 사용 사례에 대해 @Component의 전문화 역할을 합니다(예: 각각 지속성, 서비스 및 프레젠테이션 계층에서). 이것이 의미하는 바는 컴포넌트 클래스에 @Component로 주석을 달 수 있지만 대신 @Repository, @Service 또는 @Controller로 주석을 달면 클래스가 도구로 처리하거나 측면과 연결하는 데 더 적합하다는 것입니다. 예를 들어, 이러한 스테레오타입 주석은 포인트컷의 이상적인 대상이 됩니다. 물론 @Repository, @Service 및 @Controller가 Spring Framework의 향후 릴리스에서 추가 의미를 전달할 수도 있습니다. 따라서 서비스 계층에 @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.
기술적으로 @Controller
, @Service
, @Repository
는 모두 동일합니다. 모두 @Component
확장합니다.
Spring 소스 코드에서:
주석이 달린 클래스가 "구성요소"임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 스캐닝을 사용할 때 자동 감지 후보로 간주됩니다.
@Component
를 직접 사용할 수 있지만 큰 응용 프로그램의 더 나은 이해와 유지 관리를 위해 @Controller
, @Service
, @Repository
합니다.
각 주석의 목적:
@Controller
-> 이것으로 주석이 달린 클래스는 클라이언트 측에서 요청을 받기 위한 것입니다. @RequestMapping
주석 값을 사용하여 특정 컨트롤러에 요청을 전달하는 Dispatcher Servlet으로 옵니다.@Service
-> 이것으로 주석이 달린 클래스는 클라이언트로부터 받거나 데이터베이스에서 가져오는 데이터를 조작하기 위한 것입니다. 모든 데이터 조작은 이 계층에서 이루어져야 합니다.@Repository
-> 주석이 달린 클래스는 데이터베이스와 연결하기 위한 것입니다. DAO(Data Access Object) 계층이라고도 볼 수 있습니다. 이 계층은 CRUD(생성, 검색, 업데이트, 삭제) 작업으로만 제한되어야 합니다. 조작이 필요한 경우 데이터를 @Service 계층으로 다시 보내야 합니다. 위치를 @Controller
@Repository
사용) 애플리케이션이 제대로 작동합니다.
@annotations
을 사용하는 주요 목적은 엔터프라이즈 애플리케이션에 더 나은 모듈성을 제공하는 것입니다.
@Service
및 @Repository
주석의 사용은 데이터베이스 연결 관점에서 중요합니다.
@Service
사용@Repository
를 사용하십시오.적절한 주석을 사용하지 않으면 롤백 트랜잭션에 의해 무시되는 커밋 예외에 직면할 수 있습니다. JDBC 트랜잭션 롤백과 관련된 스트레스 로드 테스트 중에 예외가 표시됩니다.
@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.
이 모든 주석은 스테레오 유형의 주석 유형이며, 이 세 가지 주석의 차이점은 다음과 같습니다.
- @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 } }
@Service
또는 @Repositroy
또는 @Controller
주석을 기본적으로 추가할 때마다 @Component
주석은 클래스 위에 존재하게 됩니다.@Component
, @Service
, @Repository
및 @Controller
네 가지 유형의 자동 구성 요소 스캔 주석을 제공합니다. 기술적으로 둘 사이에는 차이가 없지만 모든 자동 구성 요소 스캔 주석은 정의된 레이어 내에서 특별한 목적으로 사용해야 합니다.
@Component
: 기본 자동 구성 요소 스캔 주석이며 주석이 달린 클래스가 자동 스캔 구성 요소임을 나타냅니다.
@Controller
: Annotated 클래스는 컨트롤러 구성 요소임을 나타내며 주로 프레젠테이션 계층에서 사용됩니다.
@Service
: 주석이 달린 클래스가 비즈니스 계층의 서비스 구성 요소임을 나타냅니다.
@Repository
: 퍼시스턴스 레이어 내에서 이 주석을 사용해야 합니다. 이것은 데이터베이스 저장소처럼 작동합니다.
이 주석에는 앞으로 특정 동작이 포함될 수 있으므로 클래스에 주석을 추가하는 동안 @Component
형식을 선택해야 합니다.
@Component
, @Service
, @Controller
, @Repository
에는 차이가 없습니다. @Component
는 MVC의 구성 요소를 나타내는 일반 주석입니다. 그러나 서비스 계층 구성 요소, 지속성 계층 구성 요소 및 프레젠테이션 계층 구성 요소와 같은 MVC 응용 프로그램의 일부로 여러 구성 요소가 있습니다. 그래서 그들을 구별하기 위해 Spring 사람들은 다른 세 가지 주석도 제공했습니다.
@Repository
@Service
@Controller
@Component
를 사용할 수 있습니다.@Component로 다른 구성 요소에 주석을 답니다(예: REST 리소스 클래스).
@Component public class AdressComp{ ....... ...//some code here }
@Component는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입입니다.
@Controller, @Service 및 @Repository는 특정 사용 사례에 대한 @Component의 전문화입니다.
우리는 자바 표준에 따라 이에 답할 수 있습니다.
이제 Spring에서 지원하는 JSR-330
참조하면 @Named
를 사용하여 빈을 정의 @Named=@Component
). 따라서 이 표준에 따르면 범주 빈에 @Repository
, @Service
, @Controller
)을 정의할 필요가 없는 것 같습니다.
그러나 스프링 사용자는 이러한 다른 주석을 특정 용도에 따라 다르게 사용합니다. 예를 들면 다음과 같습니다.
aspect-oriented
pointcuts
의 좋은 후보가 될 수 있습니다)@Repository
주석은 빈에 일부 기능을 추가합니다(빈 지속성 계층에 대한 일부 자동 예외 변환).@RequestMapping
@Controller
의해 주석이 달린 클래스에만 추가할 수 있습니다.@Component @Component
주석을 달면 하이버네이트에 그것이 Bean임을 알려줍니다.
@Repository : 당신은 클래스에 주석을 @Repository
, 그것이이 DAO 클래스입니다 최대 절전 모드 및 DAO 클래스로 취급 알려줍니다. 확인되지 않은 예외(DAO 메서드에서 throw됨)를 Spring DataAccessException
변환할 수 있음을 의미합니다.
@Service : 이것은 hibernate에게 그것이 @Transactional
etc Service 계층 주석을 가질 서비스 클래스임을 알려주므로 hibernate는 그것을 Service 컴포넌트로 취급합니다.
플러스 @Service
@Component
진보입니다. Bean 클래스 이름이 CustomerService
가정합니다. XML Bean 구성 방법을 선택하지 않았으므로 Bean을 Bean으로 표시하기 위해 @Component
그래서 빈 객체를 얻는 동안 CustomerService cust = (CustomerService)context.getBean("customerService");
기본적으로 Spring은 'CustomerService'에서 'customerService'로 구성 요소의 첫 번째 문자를 소문자로 지정합니다. 그리고 'customerService'라는 이름으로 이 구성 요소를 검색할 수 있습니다. @Service
주석을 사용하면 다음과 같이 특정 빈 이름을 제공할 수 있습니다.
@Service("AAA") public class CustomerService{
다음으로 bean 객체를 얻을 수 있습니다.
CustomerService cust = (CustomerService)context.getBean("AAA");
@Component나 @Repository나 @service를 교환해도
그것은 동일하게 작동하지만 한 가지 측면은 구성 요소 또는 @ 서비스를 사용하는 경우 저장소 대신 DAO와 관련된 특정 예외를 잡을 수 없다는 것입니다.
Spring 4에서 최신 버전:
@Repository 주석은 리포지토리(데이터 액세스 개체 또는 DAO라고도 함)의 역할 또는 스테레오타입을 수행하는 모든 클래스에 대한 마커입니다. 이 마커의 용도 중에는 20.2.2절. “예외 번역”에 설명된 예외 자동 번역이 있습니다.
Spring은 @Component, @Service 및 @Controller와 같은 추가 스테레오타입 주석을 제공합니다. @Component는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입입니다. @Repository, @Service 및 @Controller는 각각 지속성, 서비스 및 프레젠테이션 계층과 같은 보다 구체적인 사용 사례에 대한 @Component의 전문화입니다. 따라서 @Component로 구성 요소 클래스에 주석을 달 수 있지만 대신 @Repository, @Service 또는 @Controller로 주석을 추가하면 클래스가 도구로 처리하거나 측면과 연결하는 데 더 적합합니다. 예를 들어, 이러한 스테레오타입 주석은 포인트컷의 이상적인 대상이 됩니다. @Repository, @Service 및 @Controller가 Spring Framework의 향후 릴리스에서 추가 의미를 전달할 수도 있습니다. 따라서 서비스 계층에 @Component 또는 @Service를 사용하는 것 중에서 선택하는 경우 @Service가 분명히 더 나은 선택입니다. 유사하게, 위에서 언급한 바와 같이 @Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환을 위한 마커로 지원됩니다.
@Component
는 주석이 달린 빈을 스캔하고 DI 컨테이너에서 사용할 수 있도록 하는 최상위 일반 주석입니다.
@Repository
는 특수화된 주석으로 DAO 클래스에서 확인되지 않은 모든 예외를 변환하는 기능을 제공합니다.
@Service
는 특수 주석입니다. 현재로서는 새로운 기능을 제공하지 않지만 빈의 의도를 명확히 합니다.
@RequestMapping
과 같은 추가 주석의 사용을 허용하는 특수 주석입니다.
자세한 내용 은 다음과 같습니다.
여기에 제시된 답변은 기술적으로 부분적으로 정확하지만 응답 목록이 길고 이것이 맨 아래에 있을지라도 누군가가 우연히 발견하고 가치 있는 것을 배울 경우를 대비하여 여기에도 실제로 올바른 응답을 넣을 가치가 있다고 생각했습니다. 그것. 나머지 답변이 완전히 틀렸다는 것이 아니라 단지 그들이 옳지 않다는 것입니다. 그리고 트롤 무리를 막기 위해 그렇습니다. 기술적으로 이러한 주석이 현재 효과적으로 동일하며 대부분의 경우 봄 5까지 상호 교환할 수 있다는 것을 알고 있습니다. 이제 정답은 다음과 같습니다.
이 세 가지 주석은 완전히 다른 것이며 상호 교환할 수 없습니다. 한 개가 아니라 세 개가 있기 때문에 알 수 있습니다. 그것들은 상호 교환할 수 있도록 의도된 것이 아니며, 우아함과 편리함에서 그렇게 구현되었습니다.
현대 프로그래밍은 다양한 비율의 발명, 예술, 기술 및 커뮤니케이션입니다. 코드는 일반적으로 작성된 것보다 훨씬 더 자주 읽히기 때문에 통신 비트는 일반적으로 매우 중요합니다. 프로그래머로서 당신은 기술적인 문제를 해결하려고 할 뿐만 아니라 당신의 코드를 읽을 미래의 프로그래머에게 당신의 의도를 전달하려고 노력하고 있습니다. 이 프로그래머들은 당신의 모국어나 사회적 환경을 공유하지 않을 수 있으며, 50년 후에 그들이 당신의 코드를 읽을 가능성이 있습니다(당신이 생각하는 것만큼 가능성이 높지는 않습니다). 먼 미래까지 효과적으로 의사 소통하기가 어렵습니다. 따라서 우리가 사용할 수 있는 가장 명확하고 가장 효율적이며 정확하고 의사 소통이 가능한 언어를 사용하는 것이 중요합니다. 우리는 최대한의 영향력을 미치고 우리의 의도를 최대한 명확하게 하기 위해 신중하게 단어를 선택했습니다.
예를 들어 저장소를 작성할 때 @Component
@Repository
를 사용하는 것이 중요합니다. 후자는 우리가 저장소를 보고 있다는 것을 나타내지 않기 때문에 저장소에 대한 주석의 매우 잘못된 선택입니다. 저장소도 스프링 빈이라고 가정할 수 있지만 구성 요소가 저장소라고 가정할 수는 없습니다. @Repository
우리는 우리 언어로 명확하고 구체적입니다. 우리는 이것이 저장소임을 분명히 밝히고 있습니다. @Component
를 사용하여 읽고 있는 구성 요소 유형을 결정하는 것은 독자에게 맡기고 의미를 추론하기 위해 전체 클래스(및 하위 클래스 및 인터페이스 트리)를 읽어야 합니다. 그러면 이 클래스는 먼 미래에 독자에 의해 저장소가 아닌 것으로 잘못 해석될 수 있으며, 이것이 저장소라는 것을 충분히 알고 있는 우리가 우리 언어로 구체적이지 않았기 때문에 이 실수에 대해 부분적으로 책임이 있었을 것입니다. 우리의 의도를 효과적으로 전달합니다.
다른 예는 다루지 않겠지만 최대한 명확하게 설명하겠습니다. 이러한 주석은 완전히 다른 것이며 의도에 따라 적절하게 사용해야 합니다. @Repository
는 저장소 저장소용이며 다른 주석이 올바르지 않습니다. @Service
는 서비스용이며 다른 주석이 올바르지 않습니다. @Component
는 리포지토리도 서비스도 아닌 구성 요소를 위한 것이며 이 중 하나를 대신 사용하는 것도 올바르지 않습니다. 컴파일하고 테스트를 실행하고 통과할 수도 있지만 이는 잘못된 것이므로 (전문적으로) 이 작업을 수행할 경우 당신을 덜 생각하게 될 것입니다.
봄 내내(및 일반적으로 프로그래밍) 이에 대한 예가 있습니다. @RestController
를 사용할 수 있으므로 REST API를 작성할 때 @Controller
사용하면 안 됩니다. @GetMapping
이 유효한 대안일 때 @RequestMapping
사용하면 안 됩니다. Etc. Etc. Etc. 독자에게 의도를 전달할 수 있는 가장 구체적이고 정확한 언어를 선택해야 합니다 . 그렇지 않으면 시스템에 위험이 발생하고 위험에는 비용이 따릅니다.
마지막으로 객체 지향 시스템에 관한 순서를 말씀드리고 싶습니다. 기본 규칙 중 하나는 구현은 다양할 수 있지만 인터페이스는 그렇지 않아야 한다는 것입니다. 이러한 주석이 동일하다고 가정하면 매우 미끄러운 기울기이며 완전히 OO에 반대합니다. 지금은 상호 교환 가능한 방식으로 구현될 수 있지만 미래에 그렇게 될 것이라는 보장은 없습니다. 또한 동일한 팀 내에서도 엔지니어는 관점을 사용하여 이러한 주석 중 하나 이상에서 일부 동작을 중단하기로 결정할 수 있으며, 플랫폼 엔지니어는 운영상의 이유로 이러한 주석 중 하나의 구현을 교체하도록 선택할 수 있습니다. 당신은 모를 뿐 아니라 그렇게 해서도 안 됩니다. OO에서는 구현이 아니라 인터페이스에 의존합니다.
구성 요소 저장소 서비스 주석 간의 차이점을 설명하기에 충분한 답변이 있습니다. @Controller & @RestController
의 차이점을 공유하고 싶습니다.
@Controller
대 RestController
@RestController
:@Controller
추가 @Controller
와 @ResponseBody
자동으로 주석을. 따라서 매핑 방법에 @ResponseBody
를 추가할 필요가 없습니다. @ResponseBody
가 기본적으로 활성화되어 있음을 의미합니다.@RestController
를 사용하면 뷰를 반환할 수 없습니다(Spring/Spring-Boot에서 Viewresolver
@RestController
@ResponseBody
가 반환된 객체를 본문에 있을 수 있는 것으로 JSON/XML automatically
로 변환합니다( eg JSON or XML
@Controller
@Controller
는 클래스를 Spring MVC 컨트롤러로 표시하는 데 사용됩니다. @Component
의 특수 버전일 뿐이며 컨트롤러 클래스가 클래스 경로 검색을 기반으로 자동 감지되도록 합니다.@Controller
하면 Spring 웹 MVC에서 뷰를 반환할 수 있습니다.스프링 문서를 인용하는 @Service
주석이 달린 클래스가 원래 Domain-Driven Design(Evans, 2003)에 의해 "캡슐화된 상태 없이 모델에서 단독으로 독립된 인터페이스로 제공되는 작업"으로 정의된 "서비스"임을 나타냅니다. 클래스가 "Business Service Facade"(Core J2EE 패턴 의미에서) 또는 이와 유사한 것임을 나타낼 수도 있습니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미 체계를 좁히고 적절하게 사용할 수 있습니다.
에릭 에반스의 도메인 주도 디자인을 보면,
SERVICE는 ENTITIES 및 VALUE OBJECTS와 같이 상태를 캡슐화하지 않고 모델에서 단독으로 독립하는 인터페이스로 제공되는 작업입니다. SERVICES는 기술 프레임워크의 일반적인 패턴이지만 도메인 계층에도 적용될 수 있습니다. 이름 서비스는 다른 개체와의 관계를 강조합니다. ENTITIES 및 VALUE OBJECTS와 달리 순수하게 클라이언트를 위해 할 수 있는 것으로 정의됩니다. SERVICE는 개체라기보다는 활동, 즉 명사보다는 동사로 명명되는 경향이 있습니다. SERVICE는 여전히 추상적이고 의도적인 정의를 가질 수 있습니다. 그것은 단지 객체의 정의와 다른 풍미를 가질 뿐입니다. SERVICE에는 여전히 정의된 책임이 있어야 하며 해당 책임과 이를 수행하는 인터페이스는 도메인 모델의 일부로 정의되어야 합니다. 작업 이름은 UBIQUITOUS LANGUAGE에서 가져오거나 해당 언어로 도입되어야 합니다. 매개변수와 결과는 도메인 개체여야 합니다. SERVICES는 신중하게 사용해야 하며 ENTITIES 및 VALUE OBJECTS의 모든 행동을 제거하는 것이 허용되지 않아야 합니다. 그러나 작업이 실제로 중요한 도메인 개념일 때 서비스는 MODEL-DRIVEN DESIGN의 자연스러운 부분을 형성합니다. 실제로 아무 것도 나타내지 않는 가짜 개체가 아닌 SERVICE로 모델에서 선언된 독립 실행형 작업은 누구도 오도하지 않습니다.
Eric Evans에 따른 Repository
REPOSITORY는 특정 유형의 모든 개체를 개념적 집합(일반적으로 에뮬레이트됨)으로 나타냅니다. 보다 정교한 쿼리 기능을 제외하고는 컬렉션처럼 작동합니다. 적절한 유형의 개체가 추가 및 제거되고 REPOSITORY 뒤에 있는 기계가 해당 개체를 데이터베이스에서 삽입하거나 삭제합니다. 이 정의는 초기 라이프 사이클에서 끝까지 AGREGATES의 루트에 대한 액세스를 제공하기 위한 응집력 있는 책임 세트를 수집합니다.
Repository 와 Service 는 Component 주석의 자식입니다. 따라서 모두 Component 입니다. 리포지토리 및 서비스 는 확장하면 됩니다. 정확히 어떻게? 서비스 에는 이념적 차이만 있을 뿐입니다. 서비스를 위해 사용합니다. 리포지토리 에는 특정 예외 처리기가 있습니다.
고정 관념에 대한 설명 :
@Service
모든 서비스 클래스에 주석을 답니다. 이 계층은 작업 단위를 알고 있습니다. 모든 비즈니스 로직은 서비스 클래스에 있습니다. 일반적으로 서비스 계층의 메서드는 트랜잭션에 포함됩니다. 하나의 트랜잭션이 실패하면 모든 트랜잭션이 롤백되어야 하므로 서비스 메소드에서 여러 DAO 호출을 수행할 수 있습니다.@Repository
모든 DAO 클래스에 주석을 답니다. 모든 데이터베이스 액세스 논리는 DAO 클래스에 있어야 합니다.@Component
- 구성 요소 스테레오타입으로 다른 구성 요소(예: REST 리소스 클래스)에 주석을 답니다.@Autowired
- Spring이 @Autowired 어노테이션을 사용하여 다른 빈을 클래스에 자동 연결하도록 합니다. @Component
는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입입니다. @Repository
, @Service
및 @Controller
는 예를 들어 각각 지속성, 서비스 및 프레젠테이션 계층과 같은 보다 구체적인 사용 사례에 대한 @Component
전문화입니다.
원래 여기 에 대답했습니다.
@Component, @Repository, @Controller 및 @Service 주석의 차이점
@Component – 일반이며 애플리케이션 전체에서 사용할 수 있습니다.
@Service – 서비스 계층 수준에서 클래스에 주석을 답니다.
@Controller – 주로 Spring MVC에서 사용되는 프리젠테이션 레이어 수준에서 클래스에 주석을 답니다.
@Repository – 데이터베이스 저장소 역할을 하는 지속성 계층에서 클래스에 주석을 답니다.
@Controller
= @Component ( 내부 주석 ) + 프레젠테이션 계층 기능
@Service
= @Component ( 내부 주석 ) + 서비스 계층 기능
@Component
= 실제 구성 요소( Beans )
@Repository
= @Component ( 내부 주석 ) + 데이터 계층 기능 ( 도메인 빈 처리에 사용 )
@Component 는 구성 클래스에서 @Bean 주석 역할을 하고 스프링 컨텍스트에서 bean을 등록합니다. 또한 @Service, @Repository 및 @Controller 주석의 부모입니다.
@Service 는 @Component 주석을 확장하고 이름만 다릅니다.
@Repository - @Component 주석을 확장하고 모든 데이터베이스 예외를 DataAccessException 으로 변환합니다.
@Controller - MVC 패턴에서 컨트롤러 역할을 합니다. 디스패처는 @RequestMapping 주석을 감지하여 매핑된 메서드에 대해 주석이 달린 클래스를 스캔합니다.
스프링 프레임워크에서는 스테레오타입 주석이라고 하는 몇 가지 특별한 유형의 주석을 제공합니다. 이들은 다음과 같습니다:-
@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>
을 추가할 때 컨텍스트 생성/로드 단계에서 위 주석으로 주석이 달린 클래스의 객체를 spring이 자동으로 생성하기 때문에 특별합니다.
@Component
, @ Repository
, @ Service
, @Controller
:
@Component
@Repository
, @Service
및 @Controller
가 관리하는 구성 요소에 대한 일반 스테레오타입입니다. @Controller는 보다 구체적인 용도를 위한 @Component
@Repository
지속성을 위한 저장소@Service
서비스 및 거래를 위한 서비스@Controller
@Component
보다 @Repository
, @Service
, @Controller
를 사용하는 이유는 무엇입니까? 구성 요소 클래스를 @Component로 표시할 수 있지만 대신 예상 기능에 적응하는 대안을 사용합니다. 우리의 클래스는 각각의 특정한 경우에 기대되는 기능에 더 적합합니다.
@Repository
주석이 달린 클래스는 org.springframework.dao.DataAccessException을 사용하여 더 나은 번역과 읽기 가능한 오류 처리를 제공합니다. 데이터(DataAccessObject 또는 DAO)에 액세스하는 구성 요소를 구현하는 데 이상적입니다.
@Controller
가 있는 주석 클래스는 Spring Web MVC 애플리케이션에서 컨트롤러 역할을 합니다.
@Service
가 있는 어노테이션이 있는 클래스는 비즈니스 로직 서비스에서 역할을 합니다. 예를 들어 DAO Manager(Facade) 및 트랜잭션 처리를 위한 Facade 패턴
이 그림을 단순화하기 위해 유스 케이스별로 기술을 고려합시다. 이러한 주석은 주입되는 데 사용되며 문자 그대로 " 주입되는 데 사용 "이라고 말했듯이 종속성 주입 "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 리포지토리 패턴 리포지토리 디자인 패턴에 대한 구현을 적용하는 인터페이스입니다. 일반적으로 일부 데이터 저장소 또는 데이터베이스를 처리할 때 사용되며 여러 항목이 포함되어 있음을 알 수 있습니다. 데이터베이스 작업을 처리하기 위한 준비된 구현 CrudRepository , JpaRepository 등이 될 수 있습니다.
// For example public interface DoerRepository implements JpaRepository<Long, XEntity> {}
마지막으로 @Component 는 Spring에 등록된 Bean의 일반 형식입니다. 즉, Spring은 항상 등록할 @Component로 표시된 Bean을 찾고 있으며 @Service와 @Repository는 모두 @Component의 특수한 경우이지만 일반적인 사용 사례입니다. for component는 직접적인 비즈니스 사례를 다루지 않고 순전히 기술적인 것을 만들 때입니다! 날짜 형식 지정 또는 특별 요청 직렬화 메커니즘 전달 등.
@Component @Controller @Repository @Service @RestController
이것들은 모두 StereoType 주석입니다. 이것은 클래스를 ioc 컨테이너에서 스프링 빈으로 만드는 데 유용합니다.
출처 : http:www.stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in
디렉토리가 이미 존재하지 않는 경우에만 mkdir하는 방법은 무엇입니까? (0) | 2021.11.29 |
---|---|
'using' 지시문은 네임스페이스 내부 또는 외부에 있어야 합니까? (0) | 2021.11.29 |
JavaScript 자르기/슬라이스/문자열의 마지막 문자 자르기 (0) | 2021.11.29 |
Java에서 배열을 어떻게 선언하고 초기화합니까? (0) | 2021.11.29 |
Bash의 구분 기호에서 문자열을 어떻게 분할합니까? (0) | 2021.11.29 |