문제가 일어난 부분
프로젝트를 맡게 되어 Local에서 테스트를 진행한 후 war 파일을 tomcat에 배포하였습니다.
평소와 다를 게 없어 war 파일을 넣고 tomcat이 실행됐다고 나와 문제가 없는 줄 알았습니다.
하지만 서버에서 테스트를 하기 위해 postman에서 값을 넣고 전송해 보았지만 404 에러가 발생했습니다.
여기서 처음 보는 오류라 많이 당황하였습니다.
Local에서는 실행이 되므로 코드문제는 아닌데 서버에서 돌리기만 하면 문제가 생겨 멍 해졌던 것 같습니다.
해결방법
몇 시간을 헤맨 결과 SpringBootServletInitializer 클래스가 없어서 생긴 것이라는 것을 깨달았습니다.
Spring Boot는 내장형 서버를 사용하여 독립적으로 실행이 가능한데 이 때문에 Local 환경에서는 실행이 된다고 합니다.
하지만 외부 서블릿 컨테이너(Tomcat, Apache 등)에 호스팅 하여 실행하는 경우
SpringBootServletInitializer 클래스가 외부 서블릿 컨테이너 배포를 위한 설정을 제공하여 이를 활용해 war 파일로 패키징하고 배포가 가능하게끔 도와준다고 합니다.
해결해 보기
main 클래스에 바로 SpringBootServletInitializer를 상속받게 하여 해결하는 방법도 있다고 하지만
저는 클래스를 따로 만들어 상속시켜 사용하겠습니다
ServletInitializer 클래스를 만들어 주고 SpringBootServletInitializer를 상속받게 해 줍니다.
그 후 오버라이딩까지 해주시면 됩니다.
여기서 sources(자신의 주요 애플리케이션 클래스)로 바꿔주셔야 합니다.
//패키지 이름
package com.example.social;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SocialApplication.class);
}
}
해결 결과
다시 war 파일을 넣고 서버에서 돌려주니
postman에서도 정상적으로 실행이 된 것을 확인할 수 있었고
웹페이지 부분에서 404 페이지가 안 뜬 것을 확인할 수 있었습니다.
후기
Springboot 프로젝트에서 SpringBootServletInitializer는 보통 자동으로 생성이 되는데
Spring Initializr에서 프로젝트를 생성할 때 Packaging 옵션에서 war 가 아닌 Jar를 선택한 경우 생성되지 않을 수 있다는데
제가 Jar를 선택하여 이런 문제가 생겼던 것 같습니다...
너무 오랫동안 삽질을 해서 힘들었지만
해결하기 위해 web.xml, logging.properties 등을 많이 공부하게 되었던 것 같습니다.
'Back-End > Springboot' 카테고리의 다른 글
[Spring boot] 간단한 회원가입 코드 구현해보기 (0) | 2024.03.13 |
---|---|
[Spring boot] 간단한 회원가입 구현해보기 (2) | 2024.03.09 |
IntelliJ IDEA와 Git 연결하기 (0) | 2023.12.11 |
스프링부트 & 자바 - findAll() 메서드 오류 해결 방법 (0) | 2023.10.29 |
스프링부트 war파일 만들기 (2) | 2023.09.24 |