Spring Legacy To SpringBoot
이번 포스트에서는 Spring Legacy Project를 SpringBoot로 변경하는 과정을 살펴보자.
기본 설정
빈 스켄과 자동 설정
SpringBoot를 하면서 처음 살펴볼 녀석은 당연히 main 메서드가 작성된 @SpringBootApplication이다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
이 녀석은 @SpringBootConfiguration을 가지고 있는데 이는 내부적으로 @Configuration을 포함한다. 따라서 @Bean을 통한 명시적인 빈 등록이 가능하다.(하지만 일반적으로는 역할마다 @Configuration을 따로 작성한다.)
@EnableAutoConfiguration은 자동 설정을 진행한다. 예를 들어 Spring Web dependency를 추가하면 자동으로 tomcat 서버를 내장하고 구성한다. MyBatis나 JPA를 추가하면 자동으로 DataSource를 설정하려고 한다.
@ComponentScan은 현재 @SpringBootApplication이 선언된 클래스의 하위 패키지를 자동으로 스켄한다. 따라서 향후 @Component들은 가급적 이 하위 패키지에 선언하면 신경쓸 필요가 없어진다.
기본 빈 교체
필요에 따라 교체가 가능하기 때문에 필수적인진 않지만 기본적으로 적용되는 빈들도 살펴보자.
- mybatis-spring-boot-starter가 가져오는 spring-boot-starter-jdbc는 datasource로 HikariCP를 가져온다. 만약 기존에 commons.dbcp2를 사용중이면 교체해주자.
- spring-boot-starter-web이 가져오는 spring-boot-starter-json은 message converter로 jackson-databind를 사용한다. 만약 기존에 gson을 사용한 경우라면 교체해주자.
- spring-boot-starter가 가져오는 spring-boot-starter-logging은 logback을 기본으로 사용한다.
properties를 통한 설정
application.properties
애플리케이션을 만들면서 사용했던 여러 설정 파일들을 그대로 사용할 수도 있지만 application.properties 하나로 통합 관리할 수 있게 되었다. 예를 들어 dbinfo.properties 등은 그대로 application.properties에서 사용 가능하며 추가적인 @PropertySource는 필요가 없다.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?serverTimezone=UTC~~
spring.datasource.username=user_name
spring.datasource.password=user_pass
추가로 위 설정에 의해 DataSource나 TransactionManager는 자동으로 구성되므로 명시적으로 등록할 필요가 없으며 @EnableTransactionManagement도 삭제한다.
로깅과 관련해서 logback.xml 에 했던 설정들도 application.properties에서 대부분 설정이 가능하다. 대표적으로 포멧과 레벨을 들 수 있는데 아래와 같이 설정해볼 수 있다.
# com.quietjun의 하위 패키지에서 발생하는 로그는 debug 부터 출력한다.
logging.level.com.quietjun=debug
# ansi 형태로 출력 - 컬러 지원
spring.output.ansi.enabled=always
mybatis 관련 설정
mybatis 관련 설정도 application.properties로 이동한다. 따라서 SqlSessionFactory, SqlSessionTemplate도 필요 없다.
# config 파일을 사용하는 경우
mybatis.config-location=classpath:/mybatis/mybatis_config.xml
# config 파일을 사용하지 않는 경우
mybatis.type-aliases-package=com.quietjun.demo.model.dto
mybatis.mapper-locations=classpath:mapper/*.xml
웹 사용 설정
application.properties
jsp를 위한 view resolver 설정을 application.properties에 설정한다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
따라서 명시적인 view resolver는 삭제하면 되고 @EnableWebMVC도 필요 없다.
jsp를 위한 추가적인 의존성
기본적으로 내장된 tomcat에는 jasper가 없기 때문에 jsp를 위한 추가적인 의존성이 필요하다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
폴더 구성
기본적으로 springboot는 template엔진(thymeleaf, mustache 등)은 template에 작성하지만 JSP는 예외다. JSP를 위해서 src/main 아래에 webapp/WEB-INF를 구성하고 기존 코드를 가져온다. 단 스프링 설정 파일들이 있던 spring 폴더는 필요 없다.
web.xml 파일도 필요가 없는데 encodingFilter는 기본으로 내장되어있고 404 오류에 대한 추가적인 작업도 필요 없다.
정적 파일들은 src/main/resources/static 폴더에서 관리한다. 따라서 resources 내용은 static으로 이동해주고 addResourdeHandlers를 제거해준다.
error handling
상태코드별 에러 페이지
spring boot는 was를 내장하기 때문에 모든 예외에 대해 편리하게 처리할 수 있다.
- 일단 에러가 발생하면 /error 경로로 forward가 진행된다. 따라서 error.jsp가 있으면 모든 오류가 다 취합된다.
- 상태코드별로 예외를 처리하고 싶다면 /error/{상태코드}.jsp를 작성하면 된다.
- 프로그래밍적인 처리가 필요하다면 BasicErrorController를 상속 받아서 빈으로 등록한다.