오늘은 몰랐으면 내일은 알면 된다
2022-12-17 (1) Spring Boot 계속 본문

@SpringBootApplication을 좀 살펴보자.

@ComponentScan에서의 excludeFilters 속성은, 이 클래스들은 제외하겠다는 뜻이다.
즉 속성 내에 적힌 것을 제외하고 현재 패키지와 하위 패키지들의 Component들(@Configuration, @Component, @Controller, @Service, @Repository)을 모두 scan 하겠다는 뜻이다.
@SpringBootConfiguration은 Spring Boot용 컨테이너를 구동하기 위한 속성값이다.
Spring Boot 컨테이너와 Spring Legacy 컨테이너는 다르진 않고, 다만 Boot가 좀 더 편의성이 좋아진 것 뿐이다.
@EnableAutoConfiguration은 Component Scan을 통해 기본 Bean을 자동 등록시키겠다는 뜻이다.
TestRepository를 만들고 어노테이션을 붙인다. 이것만으로 Bean 객체로 관리가 알아서 잘 되고 있는걸까?

ApplicationContext가 잘 관리되고 있는지 알아보자. 먼저 ApplicationContextAware 구현클래스를 만든다.
ApplicationContextAware는 ApplicationContext에 대한 정보를 받아올 수 있게하는 인터페이스이다.
@Component
public class ApplicationContextProvider implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
applicationContext = ctx;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
Boot Application Class의 내용도 바꾼다. 컨테이너에 TestRepository Bean이 있는지 찾아볼 것이다.
@SpringBootApplication
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
System.out.println(getBean(com.example.repository.TestRepository.class));
}
public static Object getBean(Class<?> classType) {
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
return applicationContext.getBean(classType);
}
}
구동시켜보면, Bean이 잘 관리되고 있는 것을 확인할 수 있다.

Bean은 싱글톤으로 관리되기 때문에, 두번 호출해도 동일한 빈이 출력되는 것을 확인할 수 있다.


기본적으로는 Application 클래스가 있는 패키지와 하위 패키지를 ComponentScan 하지만, 다른 패키지의 빈을 등록하고 싶을 수도 있다. 그럴때는 Application 클래스의 선언부에 앞서 했던 예제처럼 어노테이션을 붙여줘야한다.
com.example은 원래 읽어오는 패키지이지만, com.example의 하위 패키지가 아닌 service를 포함시키려면 한번 더 써줘야 한다.

그리고 간단히 클래스를 만들어보자.


테스트야 성공하였으나, 위와 같이 Root Package 외에 다른 Package를 만드는 것은 권장되지 않는다.
Boot의 프로젝트는 Root Package의 아래에 서브 패키지를 만드는 방식으로 이루어져야 한다.
이제 DB와 작업을 할건데, 현재는 DB관련 라이브러리가 하나도 없는 상태이다. 추가를 해보자.
Add Starter를 사용하여 다음의 라이브러리를 추가해주자.

추가한 라이브러리에 대한 설정은
Application 클래스
application.properties
새로운 Configuration 클래스로 가능하다.
그러나 application.properties에는 간단한 설정만 넣는 것이 좋다.
여기서는 legacy때 했던 것 처럼 MyApplicationContext를 만들 것이다.

DB Pool을 사용하기 위하여 Hikari CP, DriverSpy를 쓰기 위하여 log4jdbc 라이브러리가 필요했었기 때문에 해당 라이브러리도 추가해준다.
이 두가지는 starter가 찾아주지 못하기 때문에 직접 pom.xml에 추가해준다.
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
<!-- SQL구문이 log로 출력 : DriverSpy클래스 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
log4jdbc용 properties와 xml파일도 추가해준다.

MyBatis용 파일도 추가해준다.

VO는 Bean으로 관리되지 않기 때문에 굳이 Root Package 아래에 있을 필요가 없다. 별도의 패키지를 만들어준다.

앞서 WebInitializer를 사용했던 것 대신, 내장 Tomcat 서버의 설정을 제어하기 위해서는 ServletInitializer가 필요하다.
다음의 클래스를 만들어준다. 경고는 무시하고 일단 만들어 놓는다.

Add Starter에서 Spring Web을 추가해준다. 그러면 추가된 라이브러리에 SpringBootServletInitializer가 있을 것이다.

그 이후 컨트롤러 테스트까지 마쳐주는데, 테스트는 전 포스팅에 했기때문에 생략하겠다.
Spring Framework에서 WebInitializer와 MyApplicationContext MyServletContext가 있었던 것 처럼,
Spring Boot에서도 ServletInitializer와 MyApplicationContext MyServletContext가 필요하다.

MyServletContext를 보면 아래와 같은 설정이 있다.
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/view/");
resolver.setSuffix(".jsp");
return resolver;
}
dynamic web project를 만든것이 아니기 때문에, webapp 및 WEB-INF 폴더를 직접 만들어준다.

그러나 단순히 이렇게 했다고 요청이 가지는 않는데, Boot에서는 MVC를 지양하는 추세이기 때문에 jsp 관련 라이브러리가 기본 내장되어있지 않다. (jsp의 대안인 타임리프 엔진도 마찬가지이다.)
그러나 실습용도이기 때문에 굴러가게 해보자면, 디펜던시가 추가되어야 한다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
그 다음 요청을 보내보면 정상 작동되는 것을 확인할 수 있다.

'Java > JAVA 개발자 양성과정' 카테고리의 다른 글
| 2022-12-19 (2) Spring Boot 단위테스트 (0) | 2022.12.19 |
|---|---|
| 2022-12-19 (1) logging (0) | 2022.12.19 |
| 2022-12-16 (5) Spring Boot 시작 (0) | 2022.12.16 |
| 2022-12-16 (4) Dynamic SQL을 이용한 실습 (0) | 2022.12.16 |
| 2022-12-16 (3) Transaction (0) | 2022.12.16 |