[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이 되고 있는지 (스프링이 스캔해서 관리하도록 설정되어있는지) 확인해야 함.
출처: 코드로 배우는 스프링 웹 프로젝트
'Tools > Spring' 카테고리의 다른 글
[Spring] Intellij로 Spring MVC Web 프로젝트 생성 방법 (Tomcat 서버, Log4j, Model and View 객체 설정) (0) | 2021.06.04 |
---|---|
[Spring] 스프링 기초: 의존성 주입 설정 (0) | 2021.04.06 |
[Spring] 스프링 프레임워크의 주요 특징 (0) | 2021.04.06 |