ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 의존성 주입 테스트
    Spring 2020. 9. 18. 13:34

    예제로 구성할 내용은 레스토랑 객체를 만들고 

    레스토랑에서 일하는 셰프 객체를 주입하는 예제를 작성 

     

    스프링에서의 의존성 주입 구현 

    -생성자를 이용한 주입

    -setter메서드를 이용한 주입 

     

     

     

    1.예제를 작성하기 위해서 pom.xml에 추가하거나 혹은 변경할 라이브러리

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            <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 클래스 생성하기 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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 Chef {
     
    }
    cs

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package org.zerock.sample;
     
    import org.springframework.stereotype.Component;
     
    import lombok.Data;
     
     
    @Component
    @Data
    public class Chef {
     
    }
    cs

     

    2-1 XML을 이용하는 의존성 주입 설정

     

    -root-context.xml 클릭하고 아래쪽에 "NameSpaces"라는 탭을 클릭하여 'context'라는 항목 체크 

    -root-context.xml의 source 탭을 클릭하여 아래의 코드 추가 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?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.xsd
            http://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' 클래스 이용 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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 {
     
    }
     
    cs

     

    3.테스트 코드를 통한 확인 

     

    3-1 XML 이용시 

     

    'src/test/java' 폴더 내에 'org.zerock.sample.SampleTests' 클래스를 추가 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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
    public 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

    댓글

Designed by Tistory.