일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- oracle 설치방법
- BCrypt 적용
- 스프링 업로드
- 회원가입 기능
- arraylist
- spring 프로젝트
- 인증번호 전송
- 스프링 메일 전송
- 쇼핑몰 포트폴리오
- 스프링 포트폴리오
- 스프링 게시판
- ResponseEntity
- 쇼핑몰 프로젝트
- 정규표현식
- 삭제 구현
- 로그아웃 기능 구현
- Bcrypt
- 이미지 출력
- 스프링 쇼핑몰 프로젝트
- 스프링 게시판 구현
- 스프링 HikariCP
- 스프링 파일 삭제
- 스프링 프로젝트
- 파일 업로드
- 로그인 기능
- 스프링 쇼핑몰
- spring 쇼핑몰
- 스프링 이미지
- 스프링 프로젝트 기본 설정
- 스프링 프로젝트 설정
- Today
- Total
Kim VamPa
[Spring][02]MVC 프로젝트 생성 및 기본환경 설정(의존성 주입 테스트) 본문
개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다.
목표
- 스프링에서 제공하는 '의존성 주입'을 직접 예제 클래스를 생성하여 테스트 해봅니다.
- '의존성 주입' 설정방식 에대해 공부합니다(context.xml 설정 방식 / Java 설정 방식)
- 스프링에서 "의존성 주입"이 어떤 과정을 거치는지 이해합니다.
- "의존성 주입"에 대한 개념은 [의존성 주입(Dependency Injection)] 글에 있습니다.
목차
1. 필요 라이브러리
2. 예제 객체 생성
3. xml 설정을 통한 "의존성 주입" 설정 및 테스트
4. Java 설정을 이용한 "의존성 주입" 설정 및 테스트(선택)
5. 스프링 "의존성 주입" 동작 과정
0. 의존성 주입
- 스프링은 ApplicationContext를 통해서 객체들을 관리하여 의존성 주입을 구현합니다.
- 스프링에서 'ApplicationContext'가 관리하는 객체들을 '빈(Bean)'이라고 불립니다.
- 빈과 빈사이의 의존관계는 "xml설정", "Java 설정"방식을 통해서 정의 할 수 잇습니다.(의존관계 설정 방법) =>[3. / 4. 참고]
1. 필요 라이브러리
- 의존성 주입 기능을 위해선 pom.xml에서 다음의 라이브러리 들을 추가 및 변경해줍니다.
- 추가할 라이브러리
- spring-test
- lombok(lombok 설치방법 참고)
- log4j(기존 log4j는 삭제 혹은 주석처리 합니다.)
- 변경할 라이브러리
- Junit(변경전 version => 4.12)
*lombok : 자바 컴파일 시점에서 특정 어노테이션으로 해당 코드를 추가할 수 있는 라이브러리 입니다.
*log4j : 로그문의 출력을 다양한 대상으로 할 수 있도록 도와주는 도구입니다.
*spring-test : @RunWith/@ContextConfiguration 등의 어노테이션을 활용하여 Spring Framework에서 조금 더 편하게 테스트를 지원할 수 있게 해줍니다.
*Junit : Java에서 독립된 단위 테스트를 지원해주는 프레임워크 입니다.
1.1 기존의 log4j 라이브러리 태그를 삭제하거나 주석처리합니다.
1.2 새로운 log4j 라이브러리 태그와 spring-test 라이브러리 태그를 추가해줍니다.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<!-- 기존 log4j라이브러리 주석 혹은 삭제처리-->
<!--
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
-->
<!-- log4j 추가 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- spring-test 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
1.3 기존의 Junit 라이브러리 태그의 버전은 변경해줍니다.
- 4.7 => 4.12
1
2
3
4
5
6
7
8
|
<!-- 버전 4.12로 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
1.4 Lombok라이브러리 필요시 추가해줍니다.
2. 예제 객체 생성
- src/main/java 경로에 com.프로젝트명.sample 패키지를 생성합니다.(테스트를 위해 생성하는 것이므로 기존에 있던 패키지를 사용하여도 무방합니다.)
- 해당 패키지에 Restaurant.java / Chef.java 클래스를 생성합니다.
Chef.java
- Chef 클래스의 내용은 아래와 같습니다.
- @Component를 통해서 해당 객체는 스프링에서 관리해야하는 객체로 인식 되어집니다.
- @Data를 통해서 해당 객체의 Getter/Setter/toString이 자동 형성됩니다.(lombok라이브러리 사용자 해당)
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.vam.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef {
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
Restaurant.java
- Restaurant클래스의 내용은 아래와 같습니다.
- @Component를 통해서 해당 객체는 스프링에서 관리해야하는 객체로 인식 되어집니다.
- @Data를 통해서 해당객체의 Getter/Setter/toString이 자동 형성됩니다.
- Restaurant클래스에 @setter(onMethod_ = @Autowired)로인해 Chef클래스가 자동 주입됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.vam.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component
@Data
public class Restaurant {
@Setter(onMethod_ = @Autowired)
private Chef chef;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
*@Component는 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시하는 어노테이션입니다.
*@Data는 클래스안의 모든 private 필드에 대해 @Getter(Getter 메서드 생성)와 @Setter(Setter 메서드 생성)를 적용하여 세터/게터를 만들어주고 클래스내에 @ToString(toString 메서드 생성) 과 @EqualsAndHashCode(equals 메서드, hashcode메서드 생성)를 적용시켜 메소드를 오버라이드 해주며 @RequiredArgsConstructor(생성자 자동 생성, null chek 실행)를 지정해 줍니다.(Lombok라이브러리에서 제공)
*@Autowired는 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시입니다.
* @Setter(onMethod_ = @Autowired)는 setter 메서드의 생성 시 메서드에 추가할 어노테이션을 지정합니다. 해당 어노테이션에서는 @Autowired가 추가됩니다.
3. xml 설정을 통한 '의존성 주입' 설정 및 테스트
3.1 root-context.xml 설정
1) 'root-context.xml'들어가서 하단 'NameSpaces'클릭한 후 'context' 항목을 체크 합니다. 체크를 하였다면 다시 'source' 탭을 클릭합니다.
- 'root-context.xml'은 src => main => webapp => WEB-INF => spring 경로에 있습니다.
2) <context:component-scan base-package="패키지 경로"> 코드를 추가 후 저장합니다.
- com.vam.sample는 스프링에서 인식해야할 객체가 담긴 패키지입니다.(자신이 인식시켜야할 객체를 가지고 있는 패키지를 기입하면됩니다.
3) 'root-context.xml'의 아래의 탭들 중 'Beans Graph'를 클릭하면 [2.예제 객체생성]에서 생성하였던 Chef.java 클래스와 Restaurant.java 클래스가 스프링에서 관리해야할 객체(Bean)로 인식 하고 있는 것을 볼 수 있습니다.
3.2 xml 통해 설정한 객체 테스트
1) src/test/java에 com.vam.sample 패키지를 만들고 "SampleTests.java"클래스를 생성합니다.
2) 해당 클래스에 다음의 코드를 추가합니다.
- @Runwit는 해당 크래스에 있는 코드(테스트코드)가 스프링을 실행하는 역할이라는 것을 표시합니다.
- @ContextConfiguration 는 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체(빈, Bean)로 등록합니다.
- @Log4j는 Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성합니다.
- @Test는 JUnit에서 테스트 대상을 표시합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Autowired
private Restaurant restaurant;
@Test
public void textExist() {
assertNotNull(restaurant);
log.info("--------------------------------------");
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
3) SampleTest.java 창에 마우스를 두고 오른쪽 마우스를 클릭합니다. [Run As] => [Junit Test]를 클릭합니다.
4) 테스트 성공 결과가 나옵니다.
- 다음은 console창 결과 중 일부입니다. 주목할점은 [INFO:com.dustmq.sample.SampleTest-Chef()]가 출력되었다는 점입니다. Restaurant클래스 내에서 Chef클래스를 호출하는 메서드(Chef())를 추가 하지 않았음에도 Chef 인스턴스변수(private Chef chef)에 붙여진@Autowired를 통해서 해당 객체가 주입 되었다는 것을 알수 있습니다.
1
2
3
4
5
|
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
4. Java 설정을 통한 '의존성 주입' 설정 및 테스트(선택)
4.1 Java를 통한 설정
1) src.main/java 경로에 com.vam.config 패키지를 생성합니다. 생성후 RootConfig.java 클래스를 생성하고 다음의 코드를 추가합니다.
- @Configuration 은 스프링 IOC Container에게 해당 클래스를 Bean 구성 Class임을 알려주는 어노테이션입니다.
- @ComponentScan 은[root-context xml 설정 방식 "2)"] 에서 추가한 <context:component-scan base-package="패키지 경로"> 와 같을 역할을 수행합니다.
1
2
3
4
5
6
7
8
9
10
11
|
package com.vam.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages= {"com.vam.sample"})
public class RootConfig {
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
4.2Java를 통해 설정한 객체 테스트
1) src/test/java에 com.vam.sample_java 패키지를 만들고 "SampleTests.java"클래스를 생성합니다. 생성 후 다음의 코드를 추가합니다.
- com.vam.sample에서 해도 무관합니다. xml설정을 통한 테스트와 명확히 구분짓기 위해서 저는 따로 만들었습니다.
- [xml을 통해 설정한 객체 테스트]에서 추가한 코드는 @ContextConfiguration() 어노테이션에서 경로를 xml이 아닌 class(classes={RootConfig.class})를 경로로 지정했다는 점이 다릅니다. 해당 어노테이션을 제외하곤 다른 코드는 동일합니다.
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
34
35
36
|
package com.vam.sample_java;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.vam.config.RootConfig;
import com.vam.sample.Restaurant;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class})
@Log4j
public class SampleTest {
@Autowired
private Restaurant restaurant;
@Test
public void textExist() {
assertNotNull(restaurant);
log.info("--------------------------------------");
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
3) SampleTest.java 창에 마우스를 두고 오른쪽 마우스를 클릭합니다. [Run As] => [Junit Test]를 클릭합니다.
4) 테스트 성공 결과가 나옵니다.
5. 스프링에서 "의존성 주입"동작 과정
- [3. / 4.]에서 테스트한 결과물들의 스프링 내에서의 동작과정은 다음과 같습니다.
1. 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리영역을 만들게 되는데 이를 컨텍스트(Context)라고 합니다. 스프링에서는 ApplicationContext라는 이름의 객체가 만들어집니다.
2. 스프링은 자신이 객체를 생성하고 관리해야 하는 객체들에 대한 설정이 필요합니다. 이에대한 설정이 root-context.xml(Java설정 경우 RootConfig.java)파일입니다.
3. root-context.xml에 설정되어 있는 <Context:component-scan> 태그의 내용을 통해서"com.vam.sample"패키지를 스캔(scan)하기 시작합니다.
(Java설정 경우 RootConfig.java에서 @ComponentScan이 해당 역할 수행)
4. 해당 패키지에 있는 클래스들 중에서 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성합니다.
5. Restaurant 객체는 Chef객체가 필요하다는 어노테이션(@Autowired) 설정이 있으므로, 스프링 Chef객체의 레퍼런스를 Restaurant 객체에 주입합니다.
Reference
- "코드로 배우는 스프링 웹 프로젝트"(남가람북스)
Date
- 2020.03.30 작성
- 2020.08.03 수정(사진 및 내용)
'공부 > 스프링' 카테고리의 다른 글
[Spring][05-1]MyBatis 라이브러리 추가, SQLSessionFactory 설정 (3) | 2020.04.11 |
---|---|
[Spring][04]커넥션 풀 설정(HikariCP) (0) | 2020.04.10 |
[Spring][03-02]JDBC 연결 테스트 (MySQL DB 연결) (2) | 2020.04.09 |
[Spring][03-01]JDBC 연결 테스트 (Oracle DB 연결) (8) | 2020.04.09 |
[Spring][01]MVC 프로젝트 생성 및 기본환경 설정(생성 및 구동 테스트) (0) | 2020.03.24 |