의존성 주입 테스트
예제를 통해 살펴보자.
ex00 프로젝트의 pom.xml에 추가하거나 변경할 라이브러리들이 존재한다.
ex00 프로젝트에 패키지(org.zerock.sample)와 클래스(Restaurant, Chef) 생성한다.
Chef 클래스에 아래와 같이 작성한다.
Restaurant 클래스에 아래와 같이 작성한다.
Restaurant 클래스는 Chef를 주입받도록 설계한다.
Lombok의 setter를 생성하는 기능과 생성자, toString() 등을 자동으로 생성하도록 @Data 어노테이션을 이용한다.
코드가 의미하는 것은 Restaurant 객체는 Chef 타입의 객체를 필요로 한다는 상황이다.
@Component는 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시하는 어노테이션
@Setter는 자동으로 setChef()를 컴파일 시 생성
@Setter에서 사용된 onMethod 속성은 생성되는 setChef()에 @Autowired 어노테이션을 추가하도록 한다.
Lombok으로 생성된 클래스에 대한 정보는 이클립스를 통해 확인할 수 있다. ↓
프로젝트의 src 폴더 내에 'root-context.xml'은 스프링 프레임워크에서 관리해야 하는 객체(Bean)를 설정하는 설정 파일이다.
root-context.xml 파일을 누르고 Namespaces 탭에서 context 항목을 체크해준다. (beans는 이미 체크되어있을 것이다)
그런 다음, Source 탭을 선택해서 코드를 추가한다.
변경된 xml 저장하고 Bean Graph 탭을 선택해보면 Restaurant와 Chef 객체가 설정된 것을 확인할 수 있다.
스프링이 동작하면서 생기는 일
1. 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역을 만들게 되는데 이를 컨텍스트(Context)라고 한다. 스프링에서는 ApplicationContext라는 이름의 객체가 만들어진다.
2. 스프링은 자신이 객체를 생성하고 관리해야 하는 객체들에 대한 설정이 필요하다. 이에 대한 설정이 root-context.xml 파일이다.
3. root-context.xml에 설정되어 있는 <context:component-scan> 태그의 내용을 통해서 'org.zerock.sample' 패키지를 스캔(scan)하기 시작한다.
4. 해당 패키지에 있는 클래스들 중에서 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성한다.
5. Restaurant 객체는 Chef 객체가 필요하다는 어노테이션(@Autowired) 설정이 있으므로, 스프링은 Chef 객체의 레퍼런스를 Restaurant 객체에 주입한다.
테스트 코드를 통한 확인
프로젝트 내 'src/test/java' 폴더에 'org.zerock.sample.SampleTests' 클래스 추가
- SampleTests 클래스는 spring-test 모듈을 이용해서 간단하게 스프링 가동하고 위에서 설명된 동작들 일어나게 한다.
- 이때 Junit은 반드시 4.10 이상의 버전 사용
테스트 코드 입력
@Runwith 어노테이션 : 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 것 표시
@ContextConfiguration 어노테이션 : 지정된 클래스나 문자열을 이용해서 필요한 객제들을 스프링 내에 객체로 등록하게 된다.( 흔히 스프링의 빈으로 등록된다고 표현)
@ContextConfiguration에 사용하는 문자열 : 'classpath:' 나 'file:' 을 이용할 수 있으므로, 이클립스에서 자동으로 생성된 root-context.xml의 경로 지정 가능
@Log4j : Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성, 별도의 Logger 객체의 선언 없이도 Log4j 라이브러리와 설정이 존재한다면 바로 사용 가능, 'Spring Legacy Project'로 생성하는 경우 기본으로 Log4j와 해당 설정이 완료되는 상태이기 때문에 별도의 처리 없이 사용 가능
@Autowired : 해당 인스턴스 변수가 스프링으로부터 자동으로 주입해 달라는 표시, 스프링은 정상적으로 주입 가능하다면 obj 변수에 Restaurant 타입의 객체를 주입하게 됨
@Test : JUnit에서 테스트 대상을 표시하는 어노테이션, 해당 메서드를 선택하고 JUnit Test 기능을 실행
assertNotNull() : restaurant 변수가 null이 아니어야만 테스트가 성공한다는 것을 의미
Run As -> Junit Test를 실행해서 테스트 결과 확인
실행 결과
코드의 실행 결과를 보면 정상적으로 객체가 생성된 것 확인 가능
new Restaurant()와 같이 Restaurant 클래스에서 객체를 생성한 적이 없는데도 객체가 만들어졌다는 점
- 스프링은 관리가 필요한 객체(Bean)를 어노테이션 등을 이용해서 객체를 생성하고 관리하는 일정의 '컨테이너'나 '팩토리' 기능을 가지고 있음
Restaurant 클래스의 @Data 어노테이션으로 Lombok을 이용해서 여러 메서드가 만들어진 점
- Lombok은 자동으로 getter/setter 등을 만들어 주는데 스프링은 생성자 주입 혹은 setter 주입을 이용해서 동작, Lombok을 통해서 getter/setter 등을 자동으로 생성하고 'onMethod' 속성을 이용해서 작성된 setter에 @Autowired 어노테이션 추가
Restaurant 객체의 Chef 인스턴스 변수(멤버 변수)에 Chef 타입의 객체가 주입되어 있다는 점
- 스프링은 @Autowired와 같은 어노테이션을 이용해서 개발자가 직접 객체들과의 관계를 관리하지 않고 자동으로 관리되도록 함
1) 테스트 코드가 실행되기 위해서 스프링 프레임워크가 동작
2) 동작하는 과정에서 필요한 객체들이 스프링에 등록
3) 의존성 주입이 필요한 객체는 자동으로 주입이 이루어짐
출처 : 코드로 배우는 스프링 웹 프로젝트(개정판) - 구멍가게 코딩단
'코드로 배우는 스프링 웹 프로젝트 > Part1.스프링 개발 환경 구축' 카테고리의 다른 글
04 MyBatis와 스프링 연동 (0) | 2020.09.24 |
---|---|
03. 스프링과 Oracle Database 연동 (0) | 2020.09.13 |
02. 스프링의 특징과 의존성 주입3 (0) | 2020.09.13 |
02. 스프링의 특징과 의존성 주입1 (0) | 2020.09.09 |