교재 : 코드로 배우는 스프링 웹 프로젝트(개정판)
출판사 : 남가람북스
⚠이 포스팅은 책을 보고 공부한 내용을 정리한 책이므로 자세한 내용은 책을 참고할 것.
이전 포스트에서도 적어 놓았듯이 스프링에서는 생성자를 이용한 주입, setter를 이용한 주입이 있다.
이번 예제에서는 Lombok을 이용해 setter 메서드를 자동으로 구현되도록 하고 스프링의 동작을 테스트 한다.
pom.xml에 Lombok, spring-test 추가 해야 한다.
모두 Maven Repository에서 검색을 통하여 찾을 수 있다.
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring->test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework-version}</version> <scope>test</scope> </dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version>
아마 내 기준, 기존에 1.2.15버전으로 되어있었다. 이걸 1.2.17로 변경(안할 시 추후 Lombok사용 시 문제가 생길 수 있음)
Restaurant 클래스와 Chef 클래스를 작성할 것이다.
일반적으로 의존성 주입은 클래스가 아닌 인터페이스로 설계하는 것이 좋다고 한다.
Restaurant 클래스는 Chef 클래스를 주입받는 상황
package com.minsung.sample; import org.springframework.stereotype.Component; import lombok.Data; @Component @Data public class Chef { }
package com.minsung.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는 lombok의 문법, 만약 사용하지 않을 경우 @Autowired만 써줌. 이건 Spring에서 주입하는 어노테이션 //이클립스에서 의존주입성에 대한 어노테이션 표준을 만들기 위해 @Injection을 만듬. 표준 @Setter(onMethod_ = @Autowired) private Chef chef; }
@Data : Lombok의 setter을 생성하는 기능, 생성자와 toString()을 자동으로 생성하기위해 사용
@Component : 스프링에게 해당 클래스가 관리해야할 대상(Bean)임을 표시
@Setter : 자동으로 setChef()를 컴파일 시 생성.
@Setter의 onMethod속성 : 생성되는 setChef()에 @Autowired 어노테이션 추가
스프링은 클래스에서 객체를 생성하고 객체들의 의존성에 대한 처리 작업까지 내부에서 모든 것이 처리됨.
XML 말고도 java를 이용한 설정방식이 있지만 XML로만 쭉 진행할 것이다.
프로젝트 - src - webapp - WEB-INF - spring - root-context.xml
root-context.xml은 스프링 프레임워크에서 관리해야하는 객체(앞으로는 빈(Bean)이라고 표현한다.)를 설정하는 설정 파일이다.
root-context.xml파일 클릭 후 하단에 NameSpaces탭 클릭, 이후 context 항목 체크
다시 source탭을 선택하여 아래 코드 추가
<context:component-scan base-package="com.minsung.sample"></context:component-scan>
src/test/java에 생성 (SampleTest.java)
package com.minsung.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 lombok.Setter; import lombok.extern.log4j.Log4j; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") @Log4j public class SampleTest { @Setter(onMethod_ = @Autowired) private Restaurant restaurant; @Test public void testExist() { assertNotNull(restaurant); log.info(restaurant); log.info("-----------------------------"); log.info(restaurant.getChef()); } }
테스트는 spring-test 모듈을 이용하여 스프링을 가동시키고 위 설명된 동작 순서들이 일어나게 한다. 이때 JUnit 버전은 4.10이상을 권한다.
실행은 Run as > Junit Test