-
의존성 주입 테스트Spring 2020. 9. 18. 13:34
예제로 구성할 내용은 레스토랑 객체를 만들고
레스토랑에서 일하는 셰프 객체를 주입하는 예제를 작성
스프링에서의 의존성 주입 구현
-생성자를 이용한 주입
-setter메서드를 이용한 주입
1.예제를 작성하기 위해서 pom.xml에 추가하거나 혹은 변경할 라이브러리
123456789101112131415<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>cs 예제 클래스 생성
org.zerock.sample 패키지의 Restaurant 클래스와 Chef 클래스 생성하기
1234567891011121314package org.zerock.sample;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import lombok.Data;import lombok.Setter;@Component //해당 클래스가 스프링에서 관리해야 하는 대상임을 표시@Datapublic class Chef {}cs 123456789101112package org.zerock.sample;import org.springframework.stereotype.Component;import lombok.Data;@Component@Datapublic class Chef {}cs 2-1 XML을 이용하는 의존성 주입 설정
-root-context.xml 클릭하고 아래쪽에 "NameSpaces"라는 탭을 클릭하여 'context'라는 항목 체크
-root-context.xml의 source 탭을 클릭하여 아래의 코드 추가
12345678910111213<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- Root Context: defines shared resources visible to all other web components --><context:component-scan base-package="org.zerock.sample"></context:component-scan></beans>cs 2-2 Java 설정을 이용하는 의존성 주입
-'RootConfig' 클래스 이용
1234567891011121314package org.zerock.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScan(basePackages= {"org.zerock.sample"})public class RootConfig {}cs 3.테스트 코드를 통한 확인
3-1 XML 이용시
'src/test/java' 폴더 내에 'org.zerock.sample.SampleTests' 클래스를 추가
123456789101112131415161718192021222324252627282930313233package 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 })@Log4jpublic class SampleTests {@Setter(onMethod_ = { @Autowired }) //@Autowired는 해당 인스턴스 변수가 스프링으로 부터 자동으로 주입해달라는 표시.private Restaurant restaurant;@Test //테스트 대상을 표시하는 어노테이션.public void testExist() {assertNotNull(restaurant); //레스토랑 변수가 null이 아니어야만 테스트가 성공한다는것을 의미.log.info(restaurant);log.info("-------------");log.info(restaurant.getChef());}}cs 작성후 Run AS > Junit Test 를 실행해서 테스트 결과 확인
실행되고 나면
-new Restaurant( ) 와 같이 레스토랑 클래스에서 객체 생성 하지 않았음에도 불구하고 객체가 만들어짐
-Restaurant 클래스의 @Data 어노테이션으로 Lombok을 이용해서 여러 메서드가 만들어짐
-Restaurant 객체의 Chef 인스턴스에 Chef 타입의 객체가 주입되어 있음
실행결과의 의미는
테스트 코드가 실행되기 위해서 스프링 프레임워크가 동작 -> 동작 과정에서 필요한 객체들이 스프링에 등록됨
->의존성 주입이 필요한 객체는 자동으로 주입이 이루어짐
코드에 사용된 어노테이션들
Lombok
@Setter: setter 메소드를 생성 해주는 역할
@Setter에는 3가지 속성을 부여 할수 있음
1.value : 접근 제한 속성을 의미.
2.onMethod: setter 메서드의 생성시 메서드에 추가할 어노테이션을 지정
(예제의 경우 @Autowired)
3.onParam : setter메서드의 파라미터에 어노테이션을 사용하는 경우
@Data
: @ToString, @EqualsAndHashCode, @Getter/@Setter, @RequiredArgsConstructor 모두 결합한 형태
-@Log4: 로그객체를 생성
Spring
@Component: 해당클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시
@Autowired: 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당하는 타입의 빈을 주입해 주라는 표시
테스트 관련 어노테이션
@ContextConfiguration: 스프링이 실행되면서 어떤 설정 정보를 읽어들여야 하는지 명시
@Runwith : 테스트시 필요한 클래스를 지정
728x90반응형'Spring' 카테고리의 다른 글
Spring MVC 패턴 (1) 2020.10.25 Spring에 커넥션풀(Connection Pool) 등록 - HikariCP (1) 2020.10.24 [Spring] 스프링 어노테이션 종류 (1) 2020.10.17 MyBatis란? (0) 2020.09.28 Spring Framework의 구성요소와 동작 원리 (0) 2020.09.17