티스토리 뷰
정확히는 AWS EC2에서 뿐만아니라 Tomcat을 베이스 이미지로 생성한 Docker 컨테이너에 war 파일을 배포할 때 발생하는 문제이다.
배포는 에러없이 진행된다. 그러나 서버로 요청을 날리면 404가 발생한다.
localhost_access_log에는 요청이 제대로 들어오는 것이 확인 됐고, contextpath도 정상적으로 지정했는데도 말이다.
해결방안
프로젝트 파일을 jar로 묶어서 배포하면된다.
문제가 저것 뿐이고, 해결방안이 저것 뿐이면 따로 포스팅하진 않았을 것 같다.
왜 404가 나는지 문제를 알아보면, war파일로 배포를 진행하게 되면 별도의 web.xml이 생성되지 않는다.
그래서 web.xml이 하는 대표적인 역할인
URL 경로와 해당 경로의 요청을 처리하는 서블릿 사이의 매핑을 정의
를 할 수 없게 되어,
애플리케이션의 진입점인 기본 클래스를 제대로 감지하고 실행하지 못함 + Servlet 컨텍스트를 제대로 구성하지 못해 모든 요청에 404 에러가 나게 되는 것이다.
그래서 기존의 web.xml이 하던 역할을 하는 부분을 만들어주면 된다.
서버를 기동하는 Application.java 에서 SpringBootServletInitializer 을 상속받고 configure를 오버라이드한 매서드를 작성하면 된다.
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
이렇게 하면, 서블릿 컨테이너가 정상적으로 초기화되어 HTTP 요청을 정상적으로 처리할 수 있게 된다.
이 외에도 404 에러가 자주 발생하여, 내가 경험 했던 것들을 추가적으로 몇 개를 더 작성해봤다.
1. port 매핑을 정상적으로 했는지 확인해야 한다.
웹 서버의 포트를 변경 하기 위해 application.properties 에 아래와 같이 작성했다.
server.port = 8081
이렇게만 작성하고, 도커를 아래와 같이 실행할 경우
docker run -d -p [HOST PORT]:8081 [IMGAE NAME]
요청을 정상적으로 받을 수 없다.
이는 Tomat의 설정은 default인 8080을 유지하고 있기 때문이다.
위처럼 Docker에 접속해 Tomcat의 web.xml에 접근 한 후 설정을 변경하여 재시작해야 입력 port가 정상적으로 변경된다.
2. context path 설정을 잘해주어야 한다.
Docker Tomcat에서는 context path가 webapps 아래의 폴더 이름으로 변경된다. 만약 contextpath를 "/"로 지정하고 싶다면 폴더 이름을 ROOT로 변경하고 도커를 재시작한다.
명심해야할 것은 Spring boot에 내장된 tomcat을 이용하는 것이 아니라는 것이다.
때문에 대부분의 설정은 Docker Tomcat의 설정을 변경해 주어야 정상적으로 반영된다는 것을 명심해서 작업하자
'개발 > 개발팁' 카테고리의 다른 글
SQL Error [1044] [42000]: Access denied for user ~~ (0) | 2023.04.10 |
---|---|
Dockerfile 작성 권장 사항들 (0) | 2023.03.02 |
포스트맨(Postman) Pre-Request Script / Tests로 API 순서대로 자동 요청하기 (0) | 2023.01.27 |
Error instantiating class 에러 (0) | 2023.01.25 |
포스트맨(Postman) API 반복 요청하기 (0) | 2023.01.22 |
- Total
- Today
- Yesterday
- S3
- Elastic cloud
- docker
- 오블완
- java
- 스프링부트
- AWS
- serverless
- AWS EC2
- Kotlin
- Log
- cache
- OpenFeign
- 람다
- CloudFront
- AOP
- 후쿠오카
- ChatGPT
- terraform
- 티스토리챌린지
- Spring
- EKS
- JWT
- OpenAI
- MySQL
- springboot
- lambda
- elasticsearch
- GIT
- openAI API
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |