스프링 어노테이션
스프링 어노테이션(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;
'[패스트캠퍼스] 스프링의정석 정리 > Spring' 카테고리의 다른 글
DAO & 트랜잭션(Transaction) & 커밋(Commit) & 롤백(Rollback) (0) | 2023.05.19 |
---|---|
스프링으로 DB 연결 및 다루기 & TDD (0) | 2023.05.19 |
스프링 DI 이론 - IoC와 DI (0) | 2023.05.18 |
스프링 DI 흉내내기 (0) | 2023.05.17 |
데이터의 변환과 검증 핵심 인터페이스 정리 (1) | 2023.05.17 |