스프링의 주요 특징
- POJO 기반의 구성
- 의존성 주입(DI)을 통한 객체 간의 관계 구성
- AOP(Aspect-Oriented-Programming) 지원
- 편리한 MVC 구조
- WAS의 종속적이지 않은 개발 환경
의존성 주입 테스트
- 마틴 파울러가 제시
- 코드의 내부에서 객체간의 연결을이루지 않고, 외부에서 설정을 통해서 객체간을 연결하는 패턴
- 컴파일시가 아닌 실행시에 의존 관계가 완성되는 방식
- 스프링의 경우 의존성주입을 쉽게 적용할 수 있는 프레임워크
의존성 주입 테스트
스프링에서는 생성자를 이용한 주입과 setter 메서드를 이용한 주입으로 의존성 주입을 구현합니다.
설정 방식은주로 XML이나 어노테이션을이용해서 처리합니다. 예제는 Lombok을 이용해서 setter 메서드를 자동으로 구현되도록 할 것이고, 스프링의 동작을 테스트할 것이므로 pom.xml에서 Lombok 라이브러리를 추가하고, spring-test 라이브러리를 이용합니다.
예제 클래스 생성
우선 ex00 프로젝트에 'org.noel.sample' 패키지를 생성하고, Restaurant 클래스와 Chef 클래스를 생성합니다.
( ※ 일반적으로 스프링에서 의존성 주입은 Chef를클래스가 아닌 인테퍼이스로 설계하는 것이 좋지만, 의존성 주입을 테스트패보기 위해 클래스로 설계)
Restaurant 클래스와 Chef 클래스를 생성하기전에 pom.xml에 추가하거나 혹은 변경할 라이브러리들이 존재합니다.
▶ pom.xml에 추가되는 라이브러리
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
생성된 프로젝트의 Log4j 라이브러리는 1.2.15로 설정되어 있으므로, 위와 같이 Log4j 1.2.17버전을추가하고 기존 1.2.15 부분은 삭제하거나 주석처리합니다.
▶ pom.xml에서 변경되는 라이브러리
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
▶ org.noel.sample.Chef 클래스
package org.noel.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef {
}
Restaurant 클래스는 Chef를 주입받도록 설계합니다. 이때 Lombok의 setter를 생성하는 기능과 생성자, toString() 등을자동으로 생성하도록 @Data 어노테이션을 이용합니다.(저는 @Data 어노테이션 대신 @ToString을 사용했습니다.)
package org.noel.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.ToString;
@Component
@ToString
public class Restaurant {
@Autowired
private Chef chef;
}
작성된 코드가 의미하는 것은 Restaurant 객체는Chef 타입의 객체를 필요로 한다는 상황입니다. @Component는 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시하는 어노테이션입니다.
XML을 이용하는 의존성 주입 설정
스프링은 클래스에서 객체를 생성하고 객체들의 의존성에 대한 처리 작업까지 내부에서 모든 것이 처리됩니다. 스프링에서 관리되는객체를 흔히 '빈(Bean)'이라고 하고, 이에 대한 설정은 XML과 Java를 이용해서 처리할 수 있습니다. STS의 'Spring Legacy Project'의 경우 기본적으로 XML을 이용해서 스프링에서 관리해야 하는 객체들을 처리합니다.
프로젝트의 src 폴더 내에 'root-context.xml'은 스프링 프레임워크에서 관리해야 하는객체를 설정하는 파일입니다.
'root-xontext.xml'을 클릭하면 아래쪽에 'NameSpaces'라는탭이 보이게되는데, 이때 'context'라는 항목을 체크합니다.
'Source' 탭을 선택해서 아래의 코드를 추가합니다.
변경된 XML을 저장하고 'Bean Graph' 탭을 선택해 보면 Restaurant와 Chef 객체가 설정된 것을 확인할 수 있습니다.
만일 프로젝트 내에 스프링 설정을 XML을 이용하는방식 대신에 Java를 이용하고 싶은 경우에넌 전혀 다른 방식으로 설정하므로 프로젝트 초기에 어떤 방식을 사용할 것인지 확실하게 결정해야 합니다.
스프링이 동작하면서 생기는 일
테스트 코드를 통한 확인
프로젝트 내 'src/test/java' 폴더 내에 'org.noel.sample.SampleTests' 클래스를 추가합니다.
SampleTests 클래스는 spring-test 모듈을 이용해서 간단하게 스프링을 가동시키고, 위에서 설명된 동작들이 일어나게 합니다. 이때 Junit은 반드시 4.10 이상의 버전을 사용해야 합니다.
package org.noel.sample;
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.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Autowired
private Restaurant restaurtant;
@Autowired
private SampleHotel hotel;
@Test
public void testHotel() {
log.info(hotel);
}
@Test
public void test1() {
System.out.println("test.............");
log.info("test1............");
log.info(restaurtant);
}
}
- @Runwith : 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 것을 표시하는 역할
- @ContextConfiguratin : 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록
- @Log4j : Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성
- @Autowired : 해당 인스턴스 변수가 스프링으로부터 자동으로 주입해 달라는 표시
'Back-end > Spring Web Project' 카테고리의 다른 글
[Spring Web Project] 스프링과 Oracle Database 연동(3) - 커넥션 풀 설정 (0) | 2023.11.13 |
---|---|
[Spring Web Project] 스프링과 Oracle Database 연동(2) - JDBC 드라이버 연결 확인 (1) | 2023.11.13 |
[Spring Web Project] 스프링과 Oracle Database 연동(1) - Oracle 설치 및 설정 (1) | 2023.11.13 |
[Spring Web Project] 개발 환경 설정(2) - Lombok (1) | 2023.10.31 |
[Spring Web Project] 개발 환경 설정(1) (0) | 2023.10.31 |