스프링 어노테이션


스프링 어노테이션(1) - @Autowired

 

 => 인스턴스 변수, setter, 참조형 매개변수를 가진 생성자, 메서드에 적용한다. 객체를 자동 연결해주는데 이때 by Type 즉 타입을 통해 연결한다. 만약 빈이 여러 개 있는 경우 by Type을 통해 타입으로 찾을 수 없기 때문에 자동으로 이름으로 찾아준다. 이때 @Qualifier("이름") 어노테이션을 통해 선택 될 빈의 이름을 직접 지정해줄 수도 있다.

 

Spring container에서 타입으로 빈을 검색하여 빈을 검색하여 참조 변수에 자동 주입(DI)해주는데, 이때 검색된 빈이 n개이면 그 중에 참조변수와 이름이 일치하는 것을 주입한다.

   

   ①주입 대상이 변수일 때 - 검색된 빈이 반드시 한개여야 함(아니면 예외가 발생, required = false를 통해 0개도 가능하다 물론 이때에는 null)

   ②주입 대상이 배열일 때 - 검색된 빈이 n개라도 예외가 발생하지 않음

 

 

생성자의 @Autowired는 생략 가능하고, String 형과 기본 타입 매개변수에는 @Value("값") 어노테이션을 붙여주어야 한다. 그렇지 않으면 주입할 bean이 없어 에러가 발생한다.

 

 

 

 

스프링 어노테이션(2) - @Resource

 

=> Spring container에서 이름으로 빈을 검색해서 참조 변수에 자동 주입(DI)해 준다. 일치하는 이름의 빈이 없으면 예외가 발생한다. 즉 객체를 자동 연결해주는데 이때 by Name 이름을 통해 연결해준다. @Resource(name="이름")을 통해 이름을 찾는데 물론 생략할 수 있다. 생략하게 되면 자동으로 타입의 첫 글자를 소문자로 한 것이 이름으로 지정된다.

 

※ @Autowired의 경우에는 같은 타입의 빈이 여러 개 있으면 @Qualifier("이름") 어노테이션으로 이름을 찾는다.

 

 

 

 

스프링 어노테이션(3) - @Component

 

=> <component-scan>으로 @Component가 붙은 클래스를 자동으로 검색해서 빈으로 등록한다. 즉 클래스 앞에 @Component 어노테이션을 붙여주면 패키지 내의 모든 클래스들을 읽어서 패키지 내의 @Component가 붙은 클래스를 찾고 객체를 생성하여 Map에 저장한다. → guava library를 이용

 

마찬가지로 @Component("이름")을 생략하면 클래스의 이름 첫 글자를 소문자로 하여 빈의 이름으로 사용한다. → uncapitalize() 메서드를 통해 Key 첫 글자를 소문자로 바꿔준다.

 

※ 외부 파일을 이용하게 되면 여러 사람들이 개발할 때 수정하기 쉽지 않기 때문에 개별적으로 @Component를 사용

 

 

 

 

스프링 어노테이션(4) - @Value와 @PropertySource

 

=> @PropertySource 어노테이션은 ~.properties의 위치를 넣어주면 Environment 객체에 프로퍼티 값이 자동으로 주입시켜준다.

 

ex) @PropertySource("setting.properties")

 

 

=> @Value 어노테이션은 값을 지정해주는 것 외에도 System.getenv()를 통해 Map 형태로 환경 변수를 저장하여 시간대를 읽어올 수 있고, System.getProperties()를 통해 프로퍼티 객체를 사용하여 현재 작업 디렉토리를 읽어올 수도 있다. 또한 외부 파일을 통해 =를 구분자로 하여 Key, Value 형태로 값을 저장하고 @Value 뒤에 key 값을 붙여주면 value 값이 해당 변수로 들어간다.

 

Map<String, String> env = System.getenv();

Properties prop = System.getProperties();
@Value("#{systemProperties['user.timezone']}")
String timezone;

@Value("#{systemEnvironment['PWD']}")
String currDir;

@Value("${autosaveDir}")
String autosaveDir;

@Value("${autosaveInterval}")
int autosaveInterval;

@Value("${autosave}")
boolean autosave;

 

+ Recent posts