# 의존성 주입 테스트
### 우선 sample패키지 생성 후 Restaurant클래스와 Chef클래스 생성
- Chef 클래스
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef { // Restaurant 클래스는 Chef를 주입받도록 설계, 이 때 Lombok을 이용하도록 @Data어노테이션 이용
}
- Restaurant 클래스
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component
@Data
public class Restaurant {
@Setter(onMethod_ = @Autowired) //onMethod 속성은 생성되는 setChef()에 @Autowired 어노테이션을 추가한 것.
private Chef chef;
//작성된 코드가 의미하는 것은 Restaurant 객체는 Chef 타입의 객체를 필요로 한다는 상황.
//@Component는 스프링에게 해당 클래스가 스프링은 관리해야 하는 대상임을 표시하는 어노테이션, @Setter는 자동으로 setChef()를 컴파일시 생성
}
### Java 설정으로 하니 RootConfig클래스를 이용
package org.zerock.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
public class RootConfig {
}
## 스프링이 동작하면서 생기는 일
- 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역을 만들게 되는데 이를 컨텍스트(Context)라고 한다. 스플리에서는 ApplicationContext라는 이름의 객체가 만들어진다.
- 스프링은 자신이 객체를 생성하고 관리해야 하는 객체들의 대한 설정이 필요. 이에 대한 설정이 root-context.xml파일.
- root-context.xml에 설정되어 있는<context:component-scan>태그의 내용을 통해 패키지를 스캔
- 해당 패키지에 있는 클래스들 중에서 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성.
- Restaruant객체는 Chef 객체가 필요하다는 어노테이션 설정이 있으므로, 스프링은 Chef객체의 레퍼런스를 Restaruant 객체에 주입합니다.
## 테스트 코드를 통한 확인
테스트 코드는 우선 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 것을 @Runwith 어노테이션으로 표시
package org.zerock.sample;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.config.RootConfig;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class})
//지정된 클래스나 문자열을 이용해 필요한 객체들을 스프링 내에 객체로 등록하게 된다.(스프링의 빈으로 등록)
@Log4j
//lombok을 이용해서 로그를 기록하는 logger를 변수로 생성
public class SampleTests {
@Setter(onMethod_ = {@Autowired}) //@AutoWired는 해당 인스턴스 변수가 스프링으로부터 자동 주입 해달라는 표시.
private Restaurant restaurant;
@Test //JUnit에서 테스트 대상을 표시하는 어노테이션.
public void testExist() {
assertNotNull(restaurant); //restaurant 변수가 null이 아니어야만 테스트가 성공.
log.info(restaurant);
log.info("--------------------------------");
log.info(restaurant.getChef());
}
}
### 코드의 실행 결과를 보면 정상적으로 객체가 생성된 것을 확인할 수 있다.
'SPRING' 카테고리의 다른 글
맥 스프링 MyBatis 연동 (0) | 2022.01.06 |
---|---|
이클립스 hikari 커넥션 풀 설정 (0) | 2022.01.05 |
스프링(SPRING) 프레임워크의 역사와 특징 (0) | 2021.12.29 |
맥에서 이클립스 Lombok 라이브러리 설치하기 (0) | 2021.12.27 |