Spring

[Spring] 의존성 주입 테스트(Chef, Restaurant)_5/10

EunaSon 2022. 5. 26. 00:05

lombok이 이클립스 폴더에 등록된 후.

 

1. 의존성 주입 테스트 전 pom.xml 수정.

Lombok 라이브러리 등록해야함.

pom.xml에 lombok 라이브러리 등록

 

2. Test 위해 라이브러리 수정

pom.xml에 test 위해 junit 수정

3. 프로젝트 우클릭>Properties>Java Build Path>Add Library>JUnit>버전 4>Finish

 

4. 열려있는 Properties에서 Deployment Assembly>Maven 등록된 것 확인>Add>Java Build Path Entries>JUnit4>apply

 

 

5. (55p) 의존성 주입 확인 예제

src/main/java > org.zerock.controller 에 org.zerock.sample 패키지 생성,

생성한 패키지에 Chef.java 클래스 생성

@Component

 해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시함

 

 

6. 같은 루트에 Restaurant 클래스 생성

@Autowired

 자신이 특정한 객체에 의존적이므로 해당 타입의 빈을 자신에게 주입하라는 표시.

 예제에서 Restaurant 객체는 Chef 타입의 객체가 필요함을 명시함.

 만약 Chef 클래스에 @Component가 없다면 스프링은 Chef 객체를 관리하지 않으므로 실행되지 않음.

 

 

 

7. 코드 작성 중 onMethod 속성 사용에서 에러 발생

8. 프로젝트 우클릭> Properties > Project Facets > Dynamic Web Module 2.5로 수정, apply

이클립스 닫고 사용자 폴더의 .m2 폴더 삭제 후 이클립스 재실행 -> 에러 사라짐

 

9. 파일을 만들고 끝이 아니라 주입해서 사용하겠다고 태그를 등록해줘야 함.

root-context.xml을 열고, schemaLocation에서 두번째 항목 뒤에 -3.2 를 붙이고, 다른 2개 더 추가

그리고 사용할 클래스가 있는 패키지 등록

root-context.xml 수정

 

10. 톰캣 서버 동작시키지 않아도 얼마든지 테스트 파일 만들어서 테스트할 수 있음.

우리가 실제 만드려는 클래스, 파일들은 src/main/java와 /resources에 있음.

이 파일들을 테스트 할때는 src/test/java와 /resources에다가 test class와 test resource를 만들어서 테스트 함.

Chef와 Restaurant 클래스를 테스트하기 위해, src/test/java에 org.zerock.sample 패키지를 생성하고

패키지 우클릭>New>JUnit Test Case>파일명은 SampleTest로 주고>Finish

 

11.

테스트에 필요한 클래스임을 지정하기 위한 어노테이션

@RunWith --- junit

 속성으로 SpringJUnit4ClassRunner.class 설정

@ContextConfiguration --- springframework.test.context.Contextconfiguration

 환경설정 등록된 파일의 경로 지정

 file : 이 경로에 있는 파일 대로 환경설정을 읽어오겠다

@Log4j

 로그 객체를 생성.

 테스트한 내용을 톰캣, 웹브라우저에서 보는게 아니라 콘솔창을 통해서 볼것

 

@Setter

스프링을 통해서 자동으로 인스턴스 변수 주입하라는 표시

onMethod_ 속성

: setter 메서드 생성 시 메서드에 추가할 어노테이션을 지정함.

@Autowired

아래에 Restaurant를 자료형으로 쓰는 restaurant

그 아래에 실제로 테스트 할 메서드 내용 작성

 

@Test

 해당 메서드가 테스트 대상임을 알려줌

 

assertNotNull

: 기본제공됨, restaurant 클래스(...인스턴스?)가 존재하는지 안하는지 알아냄

log.info(restaurant)

: restaurant로 저장된 값 콘솔에 찍음

log.info(restaurant.getChef())

: Restaurant 클래스에서 Chef 쓰겠다고 했었는데, 위에 @Data 작성을 통해 각 멤버변수에 해당하는 getter/setter 메서드 자동으로 생성됨. 그래서 getChef() 메서드 생성되고, 이게 제대로 동작하는지 테스트하는 것

Chef와 Restaurant를 테스트 하기위한 테스트파일 생성, 그러나 오류... log4j에 문제?

 

@Log4j 사용에서 다음과 같은 에러가 발생함.

Multiple markers at this line

 - org.apache.log4j cannot be resolved to a type

 - org.apache.log4j.Logger cannot be resolved to a type

 

이를 해결하기 위해 pom.xml에서 log4j 하단의 scope를 주석처리함

pom.xml에서 log4j의 scope 주석처리

에러 해결됨.

 

그리고 에러 하나더 추가.

상단 프로젝트>clean 후 ex00 우클릭>Maven> update 하였으나 에러나며 실패

 

이번엔 프로젝트 우클릭>Run as>Maven Install

잠시 대기... 후 다시 프로젝트 클린>메이븐 업데이트 하였는데


Dynamic Web Module 3.1 requires Java 1.7 or newer. ex00 line 1 Maven Java EE Configuration Problem


Java compiler level does not match the version of the installed Java project facet. ex00 Unknown Faceted Project Problem (Java Version Mismatch)


One or more constraints have not been satisfied. ex00 line 1 Maven Java EE Configuration Problem

 

이렇게 3개의 에러 발생..

다시한번 properties를 살펴보자.

-Deployment Assembly>메이븐 추가

-Project Facets에서 java 1.8, dynamic web module 2.5 확인

-java build path>library 탭> javaSE-1.8 확인... (그런데 1.6이 되어있다..?)

--> 우선 잘 모르기때문에 alternative JRE 에서 installed JRE 클릭, java8을 적용해주었다.

-java compiler>1.6으로 설정되어있다(왜???) 1.8로 변경해줌

 

 

 

 

그러나 여전히 에러는 남아있다.

어디서 발생했는지 모르겠다. 폴더에만 빨간 x가 떠있다.


Dynamic Web Module 3.1 requires Java 1.7 or newer. ex00 line 1 Maven Java EE Configuration Problem


One or more constraints have not been satisfied. ex00 line 1 Maven Java EE Configuration Problem

 

먼저, pom.xml의 <properties> 태그에서는 pom.xml에서 공통적으로 사용하는 java, spring 등의 버전을 관리해준다.

기본값으로 만들어져 버전이 오래됐으므로 선호하는 버전으로 설정해준다.

-> Maven Dependencies가 바뀌는 것 확인하자.

 

자바 버전관리는 프로젝트 중 JRE System Library [JavaSE-1.6]으로 설정된 것을 우클릭> properties를 통해 수정한다.

(처음에 JavaSE-1.8로 잘 저장되어 있었는데 프로젝트 클린...어쩌고 하다보니 1.6으로 돌아갔고 다시 저렇게 되지 않는다ㅜㅜ java8 또는 cdc-어쩌고 foundation 둘 중 하나밖에 못쓰게 되어있다..)

 

web.xml은 서블릿 배포 기술자, 영어로 Deployment Descriptor, DD로 불린다.

web.xml을 수정할까 하여 찾아보았으나

pom.xml에서 plugin 중 내가 쓰는 자바 버전을 1.6에서 1.8로 수정해주었다.

pom.xml 중 maven-compiler-plugin에서 내가 쓰는 자바 버전 1.6->1.8로 수정

그리고 다시 메이븐 업데이트...

 

굳 에러 해결!!!

 

12. SampleTest 화면에서 우클릭>Run as> JUnit Test 클릭,

에러 발생하지 않았는지 확인하고

Errors, Failures 없으면 오케이

콘솔창을 확인하면 Chef 클래스가 제대로 주입되어 사용되고 있음을 볼 수 있다.

 

(63p)

콘솔창에 나타난 결과를 보면, @Autowired를 통해 Restaurant 객체의 Chef 인스턴스 변수(멤버변수)에 Chef 타입의 객체가 주입되어 있다. 

 

 

(60p)

- 스프링이 동작하면서 생기는 일

작성한 Chef, Restaurant 두 클래스와 root-context.xml이 어떻게 동작하는지 이해하기 위해서는 시간의 순서대로 고민해보자.

스프링이 동작한다는 가정하에,

1. 스프링 프레임워크가 시작되면, 먼저 스프링이 사용하는 메모리 영역을 만들게 되는데, 이를 컨텍스트(Context)라고 한다. 스프링에서는 ApplicationContext라는 이름의 객체가 만들어진다.

2. 스프링은 자신이 생성하고 관리해야하는 객체들에 대한 설정이 필요하다. 이 설정이 root-context.xml에 저장되어있다.

3. root-context.xml에 설정된 <context:component-scan> 태그의 내용을 통해서 'org.zerock.sample' 패키지를 스캔(scan)한다.

4. 해당 패키지의 클래스들 중에서 스프링이 사용하는 @Component 어노테이션이 존재하는 클래스의 인스턴스를 생성한다.

5. Restaurant 객체는 Chef 객체가 필요하다는 어노테이션(@Autowired) 설정이 있으므로 스프링은 Chef 객체의 레퍼런스를 Restaurant 객체에 주입한다.