본문 바로가기
  • Coding & Book
Back-End/Springboot

[Spring boot] war배포시 404 ERROR 해결 방법

by 루이3 2024. 1. 8.

문제가 일어난 부분

프로젝트를 맡게 되어 Local에서 테스트를 진행한  후 war 파일을 tomcat에 배포하였습니다.

 

평소와 다를 게 없어 war 파일을 넣고 tomcat이 실행됐다고 나와 문제가 없는 줄 알았습니다.

 

 

하지만 서버에서 테스트를 하기 위해 postman에서 값을 넣고 전송해 보았지만 404 에러가 발생했습니다.

웹사이트
postman

 

 

여기서 처음 보는 오류라 많이 당황하였습니다.

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 등을 많이 공부하게 되었던 것 같습니다.