내 팀 프로젝트를 예전에 Spring으로 구현을 했었는데 이것을 스프링부트로 마이그레이션 해보았다. 더불어 Maven 의존성을 Gradle로 바꾸면서 마이그레이션을 한 것이다.
오류들이 상당히 많았지만 남들과 같은 오류인지는 잘 모르겠다.🤣
어떤 오류들이 있었는지 알아보자
Lombok
일단 Jar로 빌드하게되면 SpringBoot는 WEB-INF안의 jsp파일을 읽을수가 없다. 그래서 war로 빌드를 해주어야한다.
추후에 Mybatis로 db연결을 하는 방식을 JPA로 변경할 예정이다.
우선 제일 먼저 gradle 을 의존성 관리 툴로 추가하기 위해서
pom.xml 이 있는 경로로 가서 gradle init
을 시켜주었다.
gradle init --type pom
이것으로 pom.xml의 내용이 Gradle로 변환이된다.
그다음 war파일이 있어야 실행할 수 있는 환경이 되기 때문에
apply plugin: 'war'
를 해준다.
이왕이면 최신버전으로 마이그레이션 하자 생각해서 다 최신버전으로 엮어주었다.
여기서 에러가 발생했던건 lombok이었는데
implementaion만으로 lombok을 추가하는 것이 아니라annotationProcessor
로도 lombok을 추가해줘야 했었다.
간략하게 gradle 지시어를 정리하자면
compileOnly: 해당 의존성을 컴파일시에만 포함한다.
runtimeOnly: 해당 의존성을 런타임시에만 포함한다.
compile: 해당 의존성을 직/간접적으로 의존하고 있는 모든 의존성을 재빌드한다.
implementation: 해당 의존성을 직접 의존하고 있는 의존성만 재빌드 한다.
기본적으로 포함이 되어있지 않은 어노테이션이 바로 lombok이기 때문에
annotationProcessor로 명시적 추가를 해줘야한다.
Mybatis
탈 xml을 하기 위해서 이것도 다 Java의 @Bean
으로 설정을 해주었다.
여기서도 에러가 조금 많이 발생했다.
@Configuration
@MapperScan(
sqlSessionFactoryRef="dataSource",
sqlSessionTemplateRef="sqlSessionFactoryBean")
public class MapperConfig {
@Value("${spring.datasource.driver-class-name}")
String driverClassName;
@Value("${spring.datasource.url}")
String url;
@Value("${spring.datasource.username}")
String userName;
@Value("${spring.datasource.password}")
String password;
@Bean(name="dataSource")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setVfs(SpringBootVFS.class);
sessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/Configuration.xml"));
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sessionFactoryBean;
}
@Bean(name="sqlSessionTemplate")
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
application.properties
여기에는 web.xml을 제거하고 application.properties에
server.port=8080
server.servlet.context-path=/
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.mvc.static-path-pattern=/resources/static/**
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/테이블명
spring.datasource.username=계정명
spring.datasource.password=비밀번호
이렇게 진행했다. 그래서 파일 구조도 resources의 static 안으로 js, css 등 여러 정적 파일들을 넣어주고 불러오는 것으로 경로를 잡았다.
그러면서 동시에 WEB-INF폴더는 src/main/webapp
하위에 넣어주고 밖으로 빠져있던 jsp파일도 안으로 넣어주었다.
Tomcat
org.apache.catalina.webresources.Cache.getResource []에 위치한 리소스를 웹 애플리케이션 []을(를) 위한 캐시에 추가할 수 없습니다.
이런 에러도 Tomcat 구동시에 에러를 뱉었는데
이것은
tomcat경로중 apache-tomcat/conf/context.xml
에
아래와 같은 문구를 넣어준다.
<Resources cachingAllowed="true" cacheMaxSize="100000" />
이렇게 보면 단순한 에러들이었는데 Mybatis가 얽히고 조금만 건드리면 바로 에러가 나고 마이그레이션 경험이 생겨서 좋은것 같다. 앞으로도 레거시를 업데이트 해야할 경우에 오류들을 상기시키면서 잘 진행해보면 한번 더 성장할 수 있을것 같다.
'Spring' 카테고리의 다른 글
Spring -> Spring Boot 마이그레이션 2 (0) | 2022.08.06 |
---|---|
Spring Data JPA (0) | 2022.08.06 |
[Spring] MockMvc Bean 주입 에러 (0) | 2022.08.04 |
[Spring] Spring Security (0) | 2022.08.03 |