SPRING

스프링(SPRING) 의존성 주입 테스트

Jonny 2021. 12. 29. 13:55

# 의존성 주입 테스트

### 우선 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());
}

}



### 코드의 실행 결과를 보면 정상적으로 객체가 생성된 것을 확인할 수 있다.