1.10.2 meta-annotation 및 composed annotation 사용

메타 어노테이션 종류

메타 어노테이션 어노테이션을 선언할때 사용한다. 프로그래머가 어노테이션을 만들때 사용하는 것이다. @Target@Retention@Documented: 해당 어노테이션 정보가 JavaDocs(API) 문서에 포함@Inherited: 모든 자식 클래스가 부모 클래스의 어노테이션을 사용할 수 있다는 것을 선언@interface: 어노테이션 선언할 때 사용

Spring이 제공하는 많은 annotation은 여러분의 코드에서 메타 annotation으로 사용할 수 있습니다. 메타 annotation은 다른 annotation에 적용 할 수있는 annotation입니다. 예를 들어, 앞서 언급 한 @Service annotation은 다음 예제에서 처럼 @Component와 같이 메타 annotation이 첨부됩니다 .

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component 
public @interface Service {

    // ....
}

Component원인은 @Service@Component와 같은 방법으로 처리 되도록 합니다.

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

메타 annotation 들을 결합하여 "합성 annotation"을 작성할 수도 있습니다. 예를 들어 Spring MVC 의 @RestController annotation @Controller@ResponseBody로 구성된다.

@ResponseBody 메소드에서 @ResponseBody 어노테이션을 사용하면 Spring은 반환 값을 변환하여 HTTP Response 에 자동으로 씁니다. Controller 클래스의 각 메소드에는 @ResponseBody 어노테이션이 있어야합니다.

<연수네 프로젝트 예제>

@RestController

Spring 4.0은 @Controller와 @ResponseBody 을 합쳐놓은것 이상의 역할을 수행하는@RestController를 추가했습니다. 컨트롤러 클래스에 @RestController 어노테이션을 작성함으로써 더 이상 @ResponseBody를 모든 요청 매핑 메소드에 추가 할 필요가 없습니다. @ResponseBody 어노테이션은 이제 기본으로 작동..!

일반적인 Spring의 MVC흐름

  1. 클라이언트에서 웹서비스에 요청을 보냄.

  2. Handler Mapping과 그 타입을 찾는 Dispatcher Servlet에 의해 요청이 가로채짐.

  3. 요청은 Controller에 의해 처리되고 응답은 Dispatcher Servlet으로 반환되고 Dispatcher Servlet은 다시 View로 보내게 됩니다.

또한 작성된 annotation은 사용자 정의가 가능하도록 선택적으로 메타 annotation의 속성을 재 선언 할 수 있습니다. 이는 메타 annotation 속성의 하위 집합 만 노출하려는 경우 특히 유용 할 수 있습니다. 예를 들어, Spring의 @SessionScope주석은 범위 이름을 session에 하드 코딩 하지만 여전히proxyMode의 사용자 정의를 허용니다. 다음 목록은 SessionScopeannotation의 정의를 보여줍니다 .

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {

    /**
     * Alias for {@link Scope#proxyMode}.
     * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
     */
    @AliasFor(annotation = Scope.class)
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;

}

그런 다음 다음과 같이 proxyMode선언하지 않고 @SessionScope를 사용할 수 있습니다.

@Service
@SessionScope
public class SessionScopedService {
    // ...
}

다음 예제와 같이 proxyMode 의 값을 override 할 수도 있습니다 .

@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
    // ...
}

자세한 내용은 Spring Annotation Programming Model 위키 페이지를 참조하십시오.

진짜 아무리 검색해도 안나와...세션스콥이뭐하는지..

Last updated