@Annotation
라이브러리 |
Category | 상세 |
lombok |
의미 | * getter, setter, toString, equals, hashcode등등을 @[Annotation]으로 처리해주는 라이브러리 - 개발시 반복되는 코드의 양을 줄이고 가독성을 높여줌 |
설명 | @Getter @Setter @ToString @EqualsAndHashCode @Data == @Getter + @Setter + @ToString + @EqualsAndHashCode 의 모음 @NonNull @Cleanup @Synchronized @SneakyThrows |
|
| ||
* Spring Basic Annotation *
Annotation |
설명 |
@Component |
클래스가 컴포넌트 클래스임을 나타냄. 이 클래스를 빈으로 만들어야 함을 스프링에 단서로 제공함. @Component <== 기본 클래스명의 첫 글자를 소문자로 바꾼 id로 bean 생성 @Component("anythingYouWantBeanId") <= bean에 사용할 id를 명시함. |
@ComponentScan |
@Configuration 에 같이 쓰는걸로 추측 설정 클래스로서 동일한 클래스를 기본 스캐닝함. 자신의 패키지와 그 하위 패키지를 스캔하고 @Component로 애너테이트된 클래스를 찾음. 그리고 자동으로 스프링으로 빈을 만든다. @ComponentScan - 아무것도 안쓰면 기본 설정 클래스 패키지를 기본 @ComponentScan("somethingpackage") - somethingpackage를 지정 @ComponentScan(basepackages={"pack", "age"}) -"pack", "age" 여러개 패키지를 지정 @ComponentScan(basePackageClasses={Pack.class, Age.class}) - 위에 처럼 String으로 지정하면 실수 할수 있으니 XXX.class로 명시 |
@Bean | 이 메소드가 스프링 애플리케이션 컨텍스트에서 빈으로 등록된 객체를 반환해야 함을 나타냄. 결국 메소드는 빈 인스턴스를 만드는 로직을 포함한다. 기본적으로 빈은 @Bean으로 애너테이트된 메소드와 동일한 ID를 받는다. 다른 이름을 사용하고 싶으면 메소드 명을 바꾸든가 @Bean(name="blahblah")로 사용. |
@Autowired |
해당 타입의 Bean이 자동으로 주입된다. - 생성자, AnyMethod 위에 사용가능 - 하지만 Method의 파라미터에 의존성을 가진다. - 한개의 빈이 일치하면 그 빈은 와이어링 된다. - 매칭되는 빈이 없으면 Exception 발생. @Autowired(required=false) - 매칭되는 빈이 없어도 Exception을 발생하지 않음. - 단, 이렇게 사용시 null체크가 필수!! |
@Import | 다른 Configuration java class 파일을 import하는 방법 예제) @Import(XXXConfig.class) |
@ImportResource | 다른 XML 파일을 import하는 방법 @ImportResource("classpath:xxx-config.xml") |
@Profile | Bean이 속한 프로파일을 지정하는 애너테이션 설정 클래스의 빈이 지정된 프로파일이 활성화된 경우에만 작성되어야 함을 스프링에게 알려준다. 사용위치: class, method @Profile("myEnv") - myEnv가 활성화 되지 않으면 해당 @Bean메소드는 무시 된다. |
@Primary | @Bean, @Component에 모호할때 추가적으로 붙여서 기본 빈으로 만들어줌. 하지만 모든 빈에 또 @Primary를 붙이면 여전히 모호해지는 문제가 생김. 고로, 모호할때에는 @Qualifier를 이용하기를 추천. |
@Qualifier | 방법 1. 이런식은 쓰지 말기. 주입할 빈의 ID를 파라미터로 이용 컴포넌트 스캔시, 해당 클래스의 인스턴스를 만들경우 생성 빈을 참조한다. - 빈 Id가 바뀌면 거시기해진다.. ex) @Qualifier("someBeanId") 방법 2. 맞춤형 수식자 만들기 빈 선언에서 자신의 수식자를 지정. @Component @Qualifier("ggg") 하고 빈 정의 지점에서 지정 @Bean @Qualifier("ggg") 해서 사용. - 이 또한 동일하게 사용하면 여전히 모호해진다. 방법 3. 맞춤형 수식자 애너테이션 정의하기 - @ggg, @kkk 처럼 직접 애너테이션을 정의 하여 사용. @Target({ElementType.CONSTRUCTER, ElementType.FIELD, ElementType.METHOD, ElementTtype.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface ggg {} @Target({ElementType.CONSTRUCTER, ElementType.FIELD, ElementType.METHOD, ElementTtype.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface kkk {} |
@Scope | Singleton - 전체 애플리케이션을 위해 생성되는 빈의 인스턴스 하나 (=default) Prototype - 빈이 주입될 때마다 생성되거나 스프링 애플리케이션 컨텍스트에서 얻는 빈의 인스턴스 하나 Session - 웹 애플리케이션에서 각 세션용으로 생성되는 빈의 인스턴스 하나. Request - 웹 애플리케이션에서 각 요청용으로 생성되는 빈의 인스턴스 하나. |
스프링 어노테이션 vs. 표준 어노테이션
Spring | javax.inject.* | javax.inject의 제약 / 설명 |
---|---|---|
@Autowired | @Inject | @Inject에는 'required'속성이 없다 |
@Component | @Named | - |
@Scope("singleton") | @Singleton | JSR-330의 기본 범위는 스프링의 prototype과 비슷하다. 하지만 스프링의 일반적인 기본값과 일관성을 유지하기 위해 스프링 컨테이너에서 선언된 JSR-330 빈은 기본적으로 singleton이다. The JSR-330 default scope is like Spring's prototype. singleton 대신 다은 범위를 사용하려면 스프링의 @Scope 어노테이션을 사용해야 한다. javax.inject도 @Scope 어노테이션을 제공한다. 그렇기는 하지만 이 어노테이션은 자신만의 어노테이션을 생성할 때만 사용하도록 만들어졌다. |
@Qualifier | @Named | - |
@Value | - | 동일한 것이 없다 |
@Required | - | 동일한 것이 없다 |
@Lazy | - | 동일한 것이 없다 |