java - scan - spring 어노테이션




Spring의 @Component, @Repository & @Service 주석의 차이점은 무엇입니까? (16)

Spring 2.5는 @Component, @Service, @Controller와 같은 스테레오 타입 주석을 추가로 도입했다. @Component는 모든 Spring 관리 구성 요소의 일반적인 스테레오 타입 역할을합니다. 반면 @Repository, @Service 및 @Controller는 특정 용도 (예 : 지속성, 서비스 및 프레젠테이션 계층)에서 @Component의 전문화 역할을합니다. 즉, 컴포넌트 클래스에 @Component 주석을 달 수 있지만 대신 @Repository, @Service 또는 @Controller로 주석을 달아 클래스를 도구로 처리하거나 애스펙트와 연결하는 것이 적합합니다. 예를 들어, 이러한 스테레오 타입 주석은 pointcuts에 이상적인 타겟을 만듭니다. 물론, @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.

참조 : - 스프링 문서 - 자바를 사용하여 클래스 패스 스캐닝, 관리되는 구성 요소 및 쓰기 구성

@Component , @Repository@Service 주석은 Spring에서 상호 교환 가능하게 사용할 수 있습니까? 아니면 표기법 이외에 특정 기능을 제공 할 수 있습니까?

즉, Service 클래스가 있고 @Service 에서 @Component 주석을 변경하면 여전히 동일한 방식으로 동작합니까?

또는 주석이 클래스의 동작 및 기능에도 영향을 줍니까?


@ Component, @ Service, @ Controller, @ Repository에는 차이점이 없습니다. @Component는 MVC의 구성 요소를 나타내는 일반 주석입니다. 그러나 서비스 레이어 컴포넌트, 퍼시스턴스 레이어 컴포넌트, 프리젠 테이션 레이어 컴포넌트와 같은 MVC 애플리케이션의 일부로 몇 가지 컴포넌트가있을 것입니다. 그래서 그들을 구분하기 위해 봄 사람들은 다른 세 가지 주석을 부여했습니다.

지속성 계층 구성 요소를 표현하려면 : @Repository

서비스 계층 구성 요소를 나타 내기 위해 : @Service

표현 계층 구성 요소를 표현하려면 @Controller

그렇지 않으면 모든 컴포넌트에 @Component를 사용할 수 있습니다.


@Component는 다음과 같습니다.

<bean>

@Service, @Controller, @Repository = {@Component + 좀 더 특별한 기능}

이는 Service, Controller 및 Repository가 기능적으로 동일하다는 것을 의미합니다.

세 개의 주석은 응용 프로그램에서 "레이어" 를 분리하는 데 사용됩니다.

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

이제 당신은 왜 그것들을 분리 할 것인가를 묻습니다 : (나는 AOP-Aspect Oriented Programming을 알고 있다고 가정합니다)

DAO 계층의 활동 만 모니터하려고한다고 가정 해 보겠습니다. DAO의 모든 메소드가 호출되기 전후에 로깅을 수행하는 Aspect (A 클래스) 클래스를 작성할 것이고, AOP를 사용하여 세 개의 별개의 레이어가 있고 혼합되지 않은 것처럼 할 수 있습니다.

따라서 DAO를 "주변", "전"또는 "후"로깅 할 수 있습니다. 처음에는 DAO를 가졌기 때문에 그렇게 할 수 있습니다. 방금 달성 한 것은 관심사 또는 업무 분리입니다.

@Controller라는 주석이 하나만 있다고 가정하면이 구성 요소는 디스패치, 비즈니스 로직 및 데이터베이스에 모두 액세스하므로 데이터베이스가 복잡해집니다.

위에서 언급 한 것이 하나의 매우 일반적인 시나리오입니다. 세 가지 주석을 사용하는 이유에 대해 더 많은 사례가 있습니다.


@Component로 다른 구성 요소에 주석을 답니다 (예 : REST Resource 클래스).

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

@Component는 모든 Spring 관리 구성 요소의 일반 스테레오 타입입니다.

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

@Component in Spring


Spring @Component 에서 @Service , @Controller@Repository 는 다음에 사용되는 Stereotype 주석입니다.

@Controller: 프리젠 테이션 페이지에서 요청 매핑이 완료되었습니다. 즉, 프리젠 테이션 레이어는 다른 파일로 이동하지 않습니다. 즉, @Controller 클래스로 직접 이동하여 필요한 경우 메소드 호출 전에 작성된 @RequestMapping 주석의 요청 된 경로를 확인합니다.

@Service : 모든 비즈니스 로직이 여기에 있습니다. 즉, 데이터 관련 계산과 all입니다. 사용자가 퍼시스턴스 메소드를 직접 호출하지 않는 비즈니스 계층의이 주석은이 애노테이션을 사용하여이 메소드를 호출합니다. @Repository는 사용자 요청에 따라 요청할 것입니다.

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

@Component - 구성 요소 스테레오 타입으로 다른 구성 요소 (예 : REST 리소스 클래스)에 주석을 답니다.

주석 첨부 클래스가 「 component 」인 것을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 검색의 후보로 간주됩니다.

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

component


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

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

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

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

@Repository 보관소 (Repository) : 퍼시스턴스 계층 내에서이 주석을 사용해야합니다. 이는 데이터베이스 저장소와 같은 역할을합니다.

이 주석에는 앞으로의 특정 동작이 포함될 수 있으므로 클래스에 주석을 추가하는 동안보다 전문화 된 @Component 형식을 선택해야합니다.


기술적으로 @Controller, @Service, @Repository는 모두 동일합니다. 그것들 모두는 @Components를 확장합니다.

Spring 소스 코드에서 :

주석 첨부 클래스가 「컴퍼넌트」인 것을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 검색의 후보로 간주됩니다.

각 Bean마다 @Component를 직접 사용할 수 있지만 큰 응용 프로그램의 이해와 유지 관리를 위해 @Controller, @Service, @Repository를 사용합니다.

각 주석의 목적 :

1) @Controller -> 이것으로 주석 된 클래스는 클라이언트 측으로부터 요청을 수신하기위한 것입니다. 첫 번째 요청은 @RequestMapping annotation의 값을 사용하여 요청을 특정 컨트롤러로 전달하는 Dispatcher Servlet에 제공됩니다.

2) @Service -> 이것으로 주석 된 클래스는 클라이언트에서 수신하거나 데이터베이스에서 가져 오는 데이터를 조작하기위한 것입니다. 모든 조작은이 레이어에서 수행해야합니다.

3) @Repository -> 이것으로 주석 된 클래스는 데이터베이스와 연결하기위한 것입니다. DAO (Data Access Object) 계층으로 간주 될 수도 있습니다. 이 계층은 CRUD (작성, 검색, 갱신, 삭제) 조작으로 만 제한되어야합니다. 조작이 필요한 경우 데이터를 @Service 계층으로 다시 보내야합니다.

그들의 위치를 ​​바꾸면 @Controller 대신 @Repository를 사용하십시오.), 우리의 응용 프로그램은 정상적으로 작동합니다.

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


많은 답변에서 이미 이러한 특수 효과의 용도에 대해 설명 했으므로 여기서 간략히 설명하겠습니다.

우선 유사점

다시 강조 할 가치가있는 첫 번째 포인트는 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>@Component 로 주석 처리 된 것처럼 Bean을 선택하여 다음 클래스를 Bean으로 등록합니다.

그것들은 @Component 어노테이션으로 주석을 달기 때문에 스캔됩니다. 우리 자신의 커스텀 어노테이션을 정의하고 @Component 주석을 달면 <context:component-scan>

@저장소

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

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

이것이 Annotation 기반의 구성 임을 지적하는 것 외에도, @Repository 의 임무는 플랫폼 특정 예외를 잡아서 Spring의 통합되지 않은 단일 예외로 다시 던져 넣는 것입니다. 이를 위해 PersistenceExceptionTranslationPostProcessor 가 제공되어 Spring의 응용 프로그램 컨텍스트에서 다음과 같이 추가해야합니다.

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

이 빈 포스트 프로세서는 @Repository 주석 처리 된 모든 bean에 권고자를 추가하여 플랫폼 특정 예외를 포착 한 다음 Spring의 검사되지 않은 데이터 액세스 예외 중 하나로 다시 throw합니다.

@제어 장치

@Controller 주석은 특정 클래스가 컨트롤러의 역할을 담당 함을 나타냅니다. @Controller 어노테이션은 어노테이션이 적용된 클래스의 스테레오 타입 역할을하며 역할을 나타냅니다.

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

이 주석은 @Service 또는 @Repository 와 같은 다른 것으로도 전환 할 수 없습니다. Dispatcher는 @Controller 주석 된 클래스를 검색하고 그 안에 @RequestMapping 주석을 감지합니다. @Controller 주석이 달린 클래스에서만 @RequestMapping 을 사용할 수 있습니다.

@서비스

@Services 는 리포지토리 계층에서 비즈니스 논리 및 호출 메서드를 보유합니다.

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

비즈니스 논리를 유지한다는 것을 나타내는 데 사용된다는 것 외에도,이 주석이 제공하는 눈에 띄는 전문 분야는 없지만 앞으로 봄에 몇 가지 예외적 인 예외가 추가 될 수 있습니다.

또 뭐야?

위에서와 비슷하게, 앞으로 Spring은 @Service , @Controller@Repository 를위한 레이어링 규칙에 따라 특별한 기능을 추가 할 수도 있습니다. 그러므로 항상 대회를 존중하고 레이어와 함께 사용하는 것이 좋습니다.


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

봄에 지원되는 JSR-330 하면 @Named 를 사용하여 bean을 정의 할 수 있습니다 (Some @[email protected] ). 따라서이 표준에 따르면, @Repository , @Service , @Controller 와 같은 스테레오 타입을 카테고리 빈에 정의하는 용도는 없다.

그러나 특정 사용자를 위해 다른 주석을 사용하십시오. 예를 들면 다음과 같습니다.

  1. 개발자가 유능한 개발자에게 더 나은 카테고리를 정의하도록 도와줍니다. 이 분류는 어떤 경우에 도움이 될 수 있습니다. (예를 들어, aspect-oriented 사용하는 경우, 이것들은 pointcuts 위한 좋은 후보가 될 수 있습니다)
  2. @Repository 어노테이션은 빈에 몇 가지 기능을 추가 할 것이다 (빈 영속 계층으로의 자동 예외 번역).
  3. 스프링 MVC를 사용하는 경우 @RequestMapping@Controller 로 주석 처리 된 클래스에만 추가 할 수 있습니다.

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

  • @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 는 주석 된 bean을 스캔하여 DI 컨테이너에서 사용할 수있게하는 최상위 일반 주석입니다.

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

@Service 는 특수화 된 주석입니다. 지금은 새로운 기능을 제공하지 않지만 빈의 의도를 분명히합니다.

@Controller는 Bean MVC를 인식하고 @RequestMapping 과 같은 추가 주석을 사용할 수있게 해주는 특수 주석이다.

자세한 details 은 다음과 같습니다.


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

  1. 모든 웹 서비스 유형의 DB 연결에 @Service 사용
  2. 저장된 모든 proc DB 연결에 @Repository 사용

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


@Component : 클래스 @Component에 주석을 달아 준다면, 그것은 Bean이라는 사실을 hibernate에게 알려준다.

@ 보관소 (Repository) : @Repository 클래스에 주석을 달아 주면, 최대 절전 모드는 DAO 클래스이며 DAO 클래스로 취급합니다. DAO 메소드에서 던져진 검사되지 않은 예외를 Spring DataAccessException으로 변환 할 수 있도록합니다.

@Service : 이것은 Hibernate에게 당신이 @Transactional 등 서비스 레이어 주석을 가질 Service 클래스임을 말해 준다. 그래서 hibernate는 그것을 서비스 컴포넌트로 취급한다.

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

@Service("AAA")
public class CustomerService{

당신은 다음과 같이 bean 객체를 얻을 수 있습니다.

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

@Repository @Service@Controller 는 @Component를 @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, @ Repository, @ Service, @Controller :

@Component는 Spring @Repository, @Service 및 @Controller가 관리하는 구성 요소에 대한 일반 스테레오 타입으로,보다 구체적인 사용을위한 @Component 전문입니다.

  • @ 지속성을위한 보관소
  • @ 서비스 및 거래 서비스
  • MVC 컨트롤러 용 @Controller

@Repository, @Service, @Controller를 @Component에서 사용하는 이유는 무엇입니까? @Component를 사용하여 구성 요소 클래스를 표시 할 수 있지만 대신 예상되는 기능에 적응하는 대안을 사용합니다. 우리의 클래스는 각각의 특별한 경우에 예상되는 기능에 더 잘 맞습니다.

"@Repository"로 주석 처리 된 클래스는 org.springframework.dao.DataAccessException을 사용하여 더 나은 변환 및 읽기 오류 처리 기능을 제공합니다. 데이터 (DataAccessObject 또는 DAO)에 액세스하는 구성 요소를 구현하는 데 적합합니다.

"@Controller"라는 주석이 달린 클래스는 Spring Web MVC 애플리케이션에서 컨트롤러 역할을한다.

"@Service"가있는 주석이 달린 클래스는 비즈니스 로직 서비스에서 역할을 수행합니다. 예 : DAO 관리자 (Facade)의 Facade 패턴 및 트랜잭션 처리


Spring 프레임 워크에서는 스테레오 타입 어노테이션 (stereotype annotation)이라고하는 특수한 유형의 어노테이션을 제공합니다. 이들은 다음과 같습니다 : -

@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 파일에 추가 할 때 스프링이 자동으로 컨텍스트 생성 /로드 단계에서 위의 주석으로 주석 처리 된 클래스의 객체를 생성 하기 때문에 선언 된 주석이 특별 합니다.







annotations