Keep going
의존성 주입 테스트(Setter 이용) 본문
스프링에서는 생성자를 이용한 주입과 setter 메서드를 이용한 주입으로 의존성 주입을 구현한다.
설정 방식은 주로 XML이나 어노테이션을 이용해서 처리한다.
◆ porm.xml에 추가하거나 혹은 변경할 라이브러리들
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
<scope>provided</scope>
</dependency>
|
cs |
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
|
cs |
3. <dependency> log4j 버전 1.2.17로 바꿔주기 (안 바꿀시, Lombok 에서 문제 생김)
4. <dependency> junit 버전 4.12 로 바꿔주기
◆ src/main/java에 클래스 생성
@Data : Lombok의 setter를 생성하는 기능과 생성자, toString() 등을 자동으로 생성하도록 하기 위해 사용
@Component : 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시
@Setter : 자동으로 setChef()를 컴파일 시 생성함.
◆ 의존성 주입 설정
스프링은 클래스에서 객체를 생성하고 객체들의 의존성에 대한 처리 작업까지 내부에서 모든 것 처리된다.
스프링에서 관리되는 객체를 '빈(Bean)' 이라고 하고 이에 대한 설정은 XML과 Java를 이용하여 처리할 수 있다.
root-context.xml 설정
-1. XML을 이용하는 의존성 주입 설정
root-context.xml에 추가할 beans
<?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
https://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 |
# root -context.xml은 어떻게 동작하는가 ?
- 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역을 만드는데 이를 context라고 한다.
스프링에서는 ApplicationContext라는 이름의 객체가 만들어진다.
- 스프링은 자신이 객체를 생성하고 관리해야하는 객체들에 대한 설정이 필요하다.
이에 대한 설정이 root-context.xml 파일이다.
- root-context.xml에 설정된 <context:component-scan>태그의 내용을 통해 지정한 패키지를 스캔하기 시작한다.
- 지정한 패키지에 있는 클래스들 중에서 사용하는 @Component가 존재하는 클래스의 인스턴스를 생성 한다.
- Restaurant 객체는 Chef 객체가 필요하다는 @Autowired 설정이 있으므로, 스프링은 Chef 객체의 레퍼런스를 Restaurant 객체에 주입한다.
-2. Java를 이용하는 의존성 주입 설정
◆ 테스트 코드를 통한 확인
src/test/java 폴더에 테스트 시킬 클래스 생성.
생성한 클래스는 spring-test 모듈을 이용해서 간단하게 스프링 가동시키고, 위에서 설명된 동작들 일어난다.
@Runwith : 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라것을 명시하기 위해 사용한다.
@ContextConfiguration : 지정된 클래스나 문자열('classpath:' 나 'file :') 을 이용해서 필요한 객체들을 스프링 내에 객체(빈)로 등록하게 한다.
@Log4j : Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성한다.
(별도의 Logger 객체의 선언이 없어도 Log4j 라이브러리와 설정이 존재한다면 바로 사용 가능하다. 로그에 대한 설정은 src/main/resources와 src/test/resources에 별도로 존재한다.)
@Autowired : 해당 인스턴스 변수가 스프링으로부터 자동으로 주입해달라는 표시다.
@Test : JUnit에서 테스트 대상을 표시한다.
assertNotNull( )은 restaurant 변수가 null이 아니어야만 테스트가 성공한다는 것을 의미한다.
#log4j.xml에서 Cannot find DTD 'file:///C:/Spring_practice/ex00/src/main/resources/log4j.dtd'. Create the DTD file or configure an XML catalog for this DTD. 에러가 발생하는 경우
DTD 파일이란 XML의 문법을 정의해 놓은 파일이다. 간혹 이클립스에서 log4j.xml 파일의 DTD 파일을 확인하지 못해서 아래와 같은 에러를 표시하는 경우가 있다.
해결 방법
DTD 파일의 경로를 웹의 절대 경로로 지정한 형태로 바꿔주면 된다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
|
cs |
log4j.xml 파일을 저장하고 나면 아래와 같이 에러가 사라지는 것을 볼 수 있다.
◆ 실행 결과에서 주목해야 할 부분
1. new Restaurant()와 같이 Restaurant 클래스에서 객체를 생성한 적이 없는데 객체가 만들어진 점
- 스프링은 관리가 필요한 객체를 어노테이션 등을 이용해서 객체를 생성하고 관리하는 컨테이너나 팩토리의 기능을 가지고 있다.
2. Restaurant 클래스의 @Data 어노테이션으로 Lombok을 이용해서 여러 메서드가 만들어진 점
- 스프링은 생성자 주입 혹은 setter 주입을 이용해서 동작한다. Lombok을 통해서 getter/setter 등을 자동으로 생성하 고 'onMethod' 속성을 이용해서 작성된 setter에 @Autowired 어노테이션을 추가한다.
3. Restaurant 객체의 chef 인스턴스 변수에 Chef 타입의 객체가 주입되어 있다는 점
- 스프링은 @Autowired와 같은 어노테이션을 이용해서 개발자가 직접 객체들과의 관계를 관리하지 않고, 자동으로 관 리되도록 한다.
→ 테스트 결과가 의미하는 바는 1) 테스트 코드가 실행되기 위해 스프링 프레임워크가 동작했고, 2) 동작하는 과정에서 필요한 객체들이 스프링에 등록되었고, 3) 의존성 주입이 필요한 객체는 자동으로 주입이 이루어졌다. 는 것이다.
◆ 코드에 사용되는 어노테이션들
Lombok 관련 어노테이션 | Spring 관련 어노테이션 | 테스트 관련 어노테이션 |
@Setter @Data @Log4j |
@Autowired @Component |
@Runwith @ContextConfiguration @Test |
<Lombok 관련 어노테이션>
Lombok은 컴파일 시 코드를 작성하는 기능들을 완성해주는 라이브러리이다.
@Setter
@Setter 어노테이션은 setter 메서드를 만들어주는 역할을 하고 3가지의 속성을 부여해 줄 수 있다.
- value : 접근 제한 속성을 의미한다.
- onMethod : setter 메서드의 생성 시 메서드에 추가할 어노테이션을 지정한다.
- onParam : setter 메서드의 파라미터에 어노테이션을 사용하는 경우에 적용한다.
@Data
@Data는 @ToString, @EqualsAndHashCode, @Getter/@Settter, @RequiredArgsConstructor 를 모두 결합한 형태로 한 번에 자주 사용되는 모든 메서드들을 생성할 수 있다는 장점이 있다.
@Log4j
@Log4j 어노테이션은 로그 객체를 생성하게 된다. @Log4j는 Log4j 설정을 이용하고, Log4j가 존재하지 않을 경우에는 @Log를 이용할 수 있다. @Log를 클래스 쪽에 붙여주면 내부적으로 static final로 Logger 객체가 생성되므로 개발 시 별도의 로그를 설정할 필요 없이 코드로 만들어 낼 수 있다.
STS 등을 이용해서 'Spring Legay Project' 로 생성한 경우에는 기본적으로 Log4j 설정이 있기 때문에 추가적인 설정 없이 @Log4j 만으로 로그 객체를 준비할 수 있다.
<Spring 관련 어노테이션>
@Component
@Component는 해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시하는 어노테이션이다.
@ComponentScan을 통해서 지정한 패키지에 있는 클래스들을 조사하면서 @Component가 존재하는 클래스들을 객체로 생성해서 빈으로 관리하게 한다.
@Autowired
@Autowired는 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시이다.
Restaurant 객체는 Chef 타입의 객체가 필요하다는 것을 명시하고 있다. 스프링은 @Autowired 어노테이션을 보고 스프링 내부에 관리되는 객체 중에 적당한 것이 있는지 확인하고, 자동으로 주입해 준다.
Restaurant클래스에 필요한 객체를 명시하지 않았거나 명시한 객체에 @Component가 없다면 제대로 실행할 수 없게 된다.
<테스트 관련 어노테이션>
@ContextConfiguration
@ContextConfiguration은 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지를 명시한다. 속성으로는 locations를 이용해서 문자열의 배열로 XML 설정 파일을 명시할 수도 있고, classes 속성으로 @Configuration이 적용된 클래스를 지정해 줄 수도 있다.
@Runwith
@Runwith은 테스트 시 필요한 클래스를 지정한다. 스프링은 SpringJUinit4ClassRunner 클래스가 대상이 된다.
@Test
@Test는 junit에서 해당 메서드가 jUnit 상에서 단위 테스트의 대상인지 알려준다.
출처 : 코드로 배우는 스프링 웹 프로젝트 [구멍가게 코딩단]
'Records > Spring Framework' 카테고리의 다른 글
MyBatis와 스프링 연동 (0) | 2021.02.03 |
---|---|
스프링과 Oracle Database 연동 (0) | 2021.02.03 |
의존성 주입 테스트(생성자 이용) (0) | 2021.02.03 |
스프링 프로젝트 생성 및 설정 (0) | 2021.02.03 |
스프링의 특징 (0) | 2021.02.01 |