곰도리탕 2017. 9. 20. 14:45


 라이브러리

 Category

상세 

lombok

https://projectlombok.org/

 의미

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-동일한 것이 없다