[Spring] 스프링이 동작하는 과정 (의존성 주입 테스트)

딱지의겨울

·

2021. 4. 6. 13:38

[1] 스프링이 동작하는 과정

2개의 클래스와 'root-context.xml'가 작동하는 원리

1) 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역(컨텍스트)을 만듦. 스프링에서는 ApplicationContext라는 이름의 객체가 생성됨.

2) 객체를 생성 & 관리해야 하는 객체들에 대한 설정: root-context.xml

3) root-context.xml 에 설정되어 있는 <context:component-scan> 태그의 내용을 통해 지정된 'org.zerock.sample' 패키지를 스캔함.

4) 해당 패키지에 있는 클래스들 중에서 @Component 어노테이션이 존재하는 클래스의 인스턴스를 생성

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

 

 

[2] 테스트 코드를 통한 확인

▶ SampleTests.java

 

- @Runwith: 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 것을 표시

- @ContextConfiguration: 지정 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내 객체로 등록하게 됨. (classpath: 나 file: 이용해서 root-context.xml 경로 지정)

- @Log4j: Lombok 라이브러리를 이용해서 로그를 기록하는 변수 생성 > log.info()

- @Autowired / @Setter(onMethod_={@Autowired}) : 해당 변수에 자동으로 주입해달라고 스프링에게 요청하는 표시

- @Test: JUnit 에서 테스트 대상을 표시하는 어노테이션.

- assertNotNull(): 괄호안의 변수가 null 이 아니어야만 테스트가 성공한다는 의미.

 

 

▶ Restaurant.java: 의존성 주입 방법 4가지

1) 필드 주입: @Autowired

 

 

2) Setter 주입: @Setter(onMethod_ = {@Autowired})

3) 생성자 주입 @AllArgsConstructor

- 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 작성하게 됨.

 

4) (최근 많이 사용) final 선언 후 @RequiredArgsConstructor

- 여러개의 인스턴스 변수중에서 특정한 변수에 대해서만 생성자를 작성하고 싶을 때. final 로 선언하거나 @NonNull 어노테이션을 붙인 인스턴스 변수에 대한 생성자만 만들어 냄.

▶ 실행 결과

- new Restaurant() 와 같이 객체를 생성하지 않았는데도 객체가 생성됐음. (스프링이 생성)

- Restaurant 의 @Data 어노테이션으로 getter, setter 가 자동으로 생성됐음. setter의 onMethod_ 속성을 이용해서 @Autowired 추가.

- Restaurant 객체의 Chef 인스턴스 변수가 Chef 타입에 주입되어 있다.

- 즉, 테스트 코드가 실행되기 위해 스프링 프레임워크가 동작했고, 동작하는 과정에서 필요한 객체가 스프링에 등록됐고, 의존성 주입이 필요한 객체는 자동으로 주입이 이루어졌다!

 

 

[2-1] 테스트 코드를 통한 확인: Java를 이용하는 경우

- 모든 코드는 동일하나 @ContextConfiguration 설정을 RootConfig.class 로 지정 (root-context.xml 대신)

 

[추가설명]

▶ Spring Explorer 화면

 

- root-context.xml : 스프링 객체 지향 관련 설정 파일

- subvlet-context.xml: 웹 관련 설정 파일

- 추가적으로 여러 설정 파일을 만들 수 있음

- 뭔가 에러가 났을 때 해당 페키지가 component-scan이 되고 있는지 (스프링이 스캔해서 관리하도록 설정되어있는지) 확인해야 함.

 

출처: 코드로 배우는 스프링 웹 프로젝트