Spring 주석 @Controller는 @Service와 동일합니까?


80

Spring 주석은 다음 @Controller과 동일 @Service합니까?

비즈니스 논리 @ControllerURL매핑하고 호출하는 데 사용할 수있는 방법 에 대해 알고 있습니다 .

동안 @Service비즈니스 로직을 포함 주석을 서비스 클래스에 사용.

@Controller대신 @Service서비스 클래스에 주석을 달 수 있습니까 ?

답변:


124

아니요, 그들은 서로 상당히 다릅니다.

둘 다 @Component 주석 의 다른 전문화 (실제로는 동일한 인터페이스의 두 가지 다른 구현 임)이므로 둘 다 클래스 경로 스캔에서 발견 할 수 있습니다 (XML 구성에서 선언 한 경우).

@Service 주석은 서비스 계층에서 사용되며 서비스 작업을 수행하는 클래스에 주석을 추가합니다. 종종 사용하지 않지만 대부분의 경우이 주석을 사용하여 모범 사례를 나타냅니다. 예를 들어, DAO 클래스를 직접 호출하여 데이터베이스에 개체를 유지할 수 있지만 이것은 끔찍합니다. DAO를 호출하는 서비스 클래스를 호출하는 것은 꽤 좋습니다. 이것은 관심 패턴의 분리를 수행하는 좋은 것입니다.

@Controller 주석은 Spring MVC 프레임 워크 (웹 애플리케이션 구현에 사용되는 Spring Framework의 구성 요소)에서 사용되는 주석입니다. @Controller 주석은 특정 클래스가 컨트롤러의 역할을 수행함을 나타냅니다. @Controller 어노테이션은 어노테이션이있는 클래스의 스테레오 타입으로 작동하여 역할을 표시합니다. 디스패처는 매핑 된 메서드에 대해 이러한 주석이 달린 클래스를 스캔하고 @RequestMapping 주석을 감지합니다.

따라서 Spring MVC 아키텍처를 살펴보면 모든 HTTP 요청을 적절한 컨트롤러 클래스 (@Controller로 주석 처리)로 전달하는 프런트 컨트롤러를 나타내는 DispatcherServlet 클래스 (XML 구성에서 선언)가 있습니다. 이 클래스는 해당 메서드에 의해 비즈니스 논리를 수행하고 서비스를 호출 할 수 있습니다. 이러한 클래스 (또는 해당 메서드)는 일반적으로 컨트롤러 및 해당 메서드에 의해 처리되는 HTTP 요청을 지정하는 @RequestMapping 주석 으로 주석 처리됩니다.

예를 들면 :

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

이 클래스는 컨트롤러입니다.

이 클래스는 "/ appointments" "folder"에 대한 모든 HTTP 요청을 처리하며 특히 get 메서드는 "/ appointments"폴더에 대한 모든 GET HTTP 요청을 처리하기 위해 호출되는 메서드입니다.

이제 더 명확 해 지길 바랍니다.


3
아주 좋은 설명입니다. 한가지 언급하자면, (at) 컨트롤러 클래스는 (at) RequestMapping을 가질 필요가 없습니다. (at) RequestMapping은 메서드 수준 일 수도 있습니다.
타임 키퍼

1
단일 클래스 정의에서 혼합 할 수 있습니까? 아니면 별도의 클래스로 구현하는 것이 더 낫습니까?
kensai

37

@Controller, @Service주석 의 정의를 살펴보면 특수한 유형의 @Component주석 임을 알 수 있습니다 .

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

그렇다면 차이점은 무엇입니까?

@제어 장치

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

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

당신처럼 다른과이 주석을 전환 할 수 없습니다 @Service또는 @Repository그들이 동일하게 표시에도 불구하고. 디스패처 @Controller@RequestMapping주석이 달린 클래스를 스캔하고 그 안의 주석을 감지 합니다. 만 사용할 수 있습니다 @RequestMapping@Controller주석 클래스.


@서비스

@Services 저장소 계층에 비즈니스 로직 및 호출 방법을 보유합니다.

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

그것이 비즈니스 로직을 보유하고 있음을 나타내는 데 사용된다는 사실 외에도이 주석이 제공하는 눈에 띄는 전문성은 없지만 누가 알겠습니까? 스프링은 미래에 추가 예외를 추가 할 수 있습니다.

연결된 답변 : Spring의 @Component, @Repository 및 @Service 주석의 차이점은 무엇입니까?


7

아니요, @Controller과 같지는 @Service않지만 둘 다의 전문화이므로 둘 다 @Component클래스 경로 스캔에 의한 검색 후보가됩니다. @Service주석은 서비스 계층에서 사용되며, @Controller프리젠 테이션 계층에서 스프링 MVC 컨트롤러입니다. A는 @Controller일반적으로 URL 매핑을 가질 것이며, 웹 요청에 의해 트리거 될 수있다.


5

@Service 대 @Controller

@Service : 클래스는 "비즈니스 서비스 외관"(핵심 J2EE 패턴 의미에서) 또는 이와 유사한 것입니다.

@Controller : 주석이 달린 클래스가 "Controller"(예 : 웹 컨트롤러)임을 나타냅니다.

---------- 주요 스테레오 타입에 대한 유용한 정보 찾기 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@interface 구성 요소

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

주석이 달린 클래스가 구성 요소임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 스캔을 사용할 때 자동 감지 후보로 간주됩니다.

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

@ 인터페이스 컨트롤러

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

주석이 달린 클래스가 "컨트롤러"(예 : 웹 컨트롤러)임을 나타냅니다.

이 주석은 @Component의 특수화 역할을하여 구현 클래스가 클래스 경로 스캔을 통해 자동 감지되도록합니다. 일반적으로 RequestMapping 어노테이션을 기반으로 어노테이션이있는 핸들러 메소드와 함께 사용됩니다.

@ 인터페이스 서비스

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

어노테이션이있는 클래스가 원래 Domain-Driven Design (Evans, 2003)에서 "캡슐화 된 상태가없는 모델에서 독립적 인 인터페이스로 제공되는 작업"으로 정의 된 "서비스"임을 나타냅니다. 클래스가 "Business Service Facade"(핵심 J2EE 패턴 의미) 또는 이와 유사한 것임을 나타낼 수도 있습니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.

이 주석은 @Component의 특수화 역할을하여 구현 클래스가 클래스 경로 스캔을 통해 자동 감지되도록합니다.

@interface 저장소

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

주석이 달린 클래스가 원래 Domain-Driven Design (Evans, 2003)에서 "객체 컬렉션을 에뮬레이트하는 저장, 검색 및 검색 동작을 캡슐화하기위한 메커니즘"으로 정의 된 "저장소"임을 나타냅니다. "Data Access Object"와 같은 전통적인 J2EE 패턴을 구현하는 팀도이 스테레오 타입을 DAO 클래스에 적용 할 수 있지만 그렇게하기 전에 데이터 액세스 객체와 DDD 스타일 저장소 간의 차이점을 이해해야합니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.

이렇게 주석이 달린 클래스는 PersistenceExceptionTranslationPostProcessor와 함께 사용될 때 Spring DataAccessException 번역에 적합합니다. 어노테이션이있는 클래스는 도구, 측면 등의 목적을 위해 전체 애플리케이션 아키텍처에서 역할에 대해서도 명확합니다.

Spring 2.5부터이 어노테이션은 @Component의 특수화 역할도하여 구현 클래스가 클래스 경로 스캔을 통해 자동 감지되도록합니다.


1

나는 이미 여기 에서 비슷한 질문에 대답했습니다.

둘 다 다르지 않습니다.

@Service 주석은 다른 용도로 사용되며 @Controller는 다른 용도로 사용됩니다. 실제로 Spring 프레임 워크에서 클래스 경로 스캔을 사용하여 자동 빈 감지에 Spring @Component, @Service, @Repository 및 @Controller 주석이 사용되지만 모든 기능이 동일하다는 의미는 아닙니다. @Service : 주석이 달린 클래스가 비즈니스 계층의 서비스 구성 요소임을 나타냅니다.

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


0

당신은 그들이 다를 수 없습니다. 예를 들어 앱이 배포되면 컨트롤러 매핑이 지루해집니다.

어쨌든 컨트롤러는 서비스 가 아니며 그 반대도 마찬가지입니다.


0

봄의 행동

보시다시피이 클래스는 @Controller로 주석 처리됩니다. 그 자체로 @Controller는 많은 일을하지 않습니다. 주요 목적은이 클래스를 구성 요소 스캔을위한 구성 요소로 식별하는 것입니다. HomeController는 @Controller로 주석 처리 되었기 때문에 Spring의 컴포넌트 스캐닝은 자동으로이를 발견하고 Spring 애플리케이션 컨텍스트에서 Bean으로 HomeController의 인스턴스를 작성합니다.

실제로 @Component, @Service 및 @Repository를 포함한 몇 가지 다른 주석은 @Controller와 유사한 용도로 사용됩니다. 다른 어노테이션으로 HomeController에 효과적으로 어노테이션을 작성할 수 있었으며 여전히 동일하게 작동했을 것입니다. 그러나 @Controller의 선택은 응용 프로그램에서이 구성 요소의 역할을 더 설명합니다.


0

@service@Controller 로 선언 할 수 있습니다 .

@Controller@Service 로 선언 할 수 없습니다.

@서비스

규칙적입니다. 클래스를 컴포넌트로 선언하고 있습니다.

@제어 장치

Component보다 조금 더 특별합니다. 디스패처 를 검색합니다 @RequestMapping 여기. 따라서 @Controller로 주석이 달린 클래스는 API가 호출되는 URL을 선언하는 권한이 추가로 부여됩니다.


0
  • 컨트롤러는 서로 다른보기 간의 탐색을 처리합니다. 매핑 요청 매핑은 컨트롤러의 도움으로 처리됩니다.
  • 서비스는 일반적으로 비즈니스 로직이 수행되는 저장소와 직접 상호 작용합니다. 서비스 레이어에서 추가, 삭제, 제거 등을 할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.