개발자
안녕하십니까 선배님들. 스프링부트 API 서버를 개발하고 배포하였는데 다음과 같은 문제가 발생하였습니다. 로컬 환경에서는 잘 작동하지만, 배포 환경에서 특정 POST 요청에서 404에러가 발생하는 문제였습니다. 해당 요청은 JSON을 반환하는 컨트롤러입니다. 서핑을 하던 중, Spring Security의 CSRF의 문제일 수도 있다고 하던데 저는 현재 Security를 사용하지도 않고 다른 POST 요청은 잘 응답하여 뭐가 원인인지 잘 모르겠습니다. 아래는 application.yaml과 Controller 코드입니다. 감사합니다. // application.yaml spring: application: name: tika servlet: multipart: max-file-size: 50MB max-request-size: 50MB
1// controller
2@Slf4j
3@RestController
4public class TikaController {
5 @Autowired
6 private TikaService tikaService;
7
8 // 작동하지 않는 코드
9 @RequestMapping(value = "/api/v1/uploadFiles", method = RequestMethod.POST)
10 @ResponseBody
11 public ResponseEntity<String> requestFileAPI(){
12
13 return ResponseEntity.ok("잘 되어라!");
14 }
15
16 // 정상 작동하는 코드
17 @PostMapping("/upload")
18 public String uploadFile(MultipartFile file, Model model, HttpServletRequest request) {
19 String clientIp = getClientIp(request);
20
21 if (file.isEmpty()) {
22 model.addAttribute("message", "Please select a file to upload.");
23 log.warn("IP: {} tried to upload an empty file.", clientIp);
24 return "index";
25 }
26
27 long maxFileSize = 50 * 1024 * 1024;
28 if (file.getSize() > maxFileSize) {
29 model.addAttribute("message", "File size exceeds the maximum limit (50MB). Please upload a smaller file.");
30 log.warn("IP: {} attempted to upload a file exceeding the size limit ({} MB). File size: {} bytes.",
31 clientIp, maxFileSize / (1024 * 1024), file.getSize());
32 return "index";
33 }
34
35 try {
36 File tempFile = new File(System.getProperty("java.io.tmpdir"), file.getOriginalFilename());
37 file.transferTo(tempFile);
38
39 StringBuilder metadataOutput = new StringBuilder();
40 String extractedText = tikaService.extractText(tempFile, metadataOutput);
41
42 model.addAttribute("fileName", file.getOriginalFilename());
43 model.addAttribute("extractedText", extractedText);
44 model.addAttribute("metadata", metadataOutput.toString());
45
46 log.info("IP: {} uploaded file: {} (size: {} bytes). Metadata: {}",
47 clientIp, file.getOriginalFilename(), file.getSize(), metadataOutput);
48
49 // System.out.println("Filename: " + file.getOriginalFilename());
50 // System.out.println("Extracted Text: " + extractedText);
51 // System.out.println("Metadata: " + metadataOutput);
52
53 tempFile.delete();
54 } catch (Exception e) {
55 model.addAttribute("message", "Failed to process file: " + e.getMessage());
56 log.error("IP: {} failed to process file upload. Error: {}", clientIp, e.getMessage());
57 }
58
59 return "index";
60 }
61
62 private String getClientIp(HttpServletRequest request) {
63 String ip = request.getHeader("X-Forwarded-For");
64 if (ip == null || ip.isEmpty()) {
65 ip = request.getRemoteAddr();
66 }
67 return ip;
68 }
69}
답변 1
404라는 것은 URL을 아예 찾지 못했다는 뜻이죠. uploadFile 펑션 내에 log를 찍어보실때 나오지 않는다면, 클라에서 서버로 전달은 되지만 서버에서 동작이 안되는 겁니다. 그러면서 default response로 404를 떨구게 되겠죠. 로컬 환경에선 아무 이상이 없으나 배포 환경에서 서버단에서 404가 발생한다면 원인이 몇가지 추정됩니다. 아주 단골적인 문제이죠. 일단 CORS (Cross Origin Resource Sharing) 을 의심해 보시죠. 클라단과 서버단이 쓰는 도메인이 같은지 IP로 쓰고 있지는 않은지요. IP로 쓴다면 클라단과 서버단에 config에 해당 IP들을 인식할 수 있도록 해주어야 합니다. Nginx 예를 들면 Access-Control-Allow-Origin 이죠. Spring 단에서도 Config등에 Allow Origin 처리해줘야 합니다. 그렇게 한다면 CORS가 해결되어 통신이 정상 가능할 것입니다. 확인해보시기 바라겠습니다.
익명
작성자
1월 16일
선배님 신경써주셔서 감사합니다. 원인은 Docker image 캐싱 문제였습니다 ㅠㅠ 좋은 하루 보내세요
박정환
시니어 엔지니어 • 1월 16일
네, 해결하셔서 다행입니다. CORS가 아니어서 더 다행이네요. 수고하세요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
1월 15일
해당 질문에서 문제 해결을 위해 고려해볼 수 있는 몇 가지 사항들이 있습니다. 1. 배포 환경에서의 로깅: 로컬 환경에서 아무 문제 없이 동작하고, 배포 환경에서만 404 에러가 발생하는 경우라면, 일단 배포 환경에서 무슨 일이 일어나고 있는지 파악하는 것이 우선입니다. 따라서 서버 로그를 확인하여 어떤 요청에 대해 404 에러가 발생하는지, 그리고 그 요청을 수행하려는 URL은 무엇인지 등의 정보를 확인하세요. 2. 프로젝트 구조와 Controller 위치: 예시로 제공한 Controller 코드 자체에 문제가 있는 것은 아닌지 다시 한 번 확인해보세요. 스프링 부트 애플리케이션은 보통 메인 클래스(Application.java)가 있는 패키지를 기준으로 해당 패키지 및 하위 패키지에 존재하는 컴포넌트들(예: @Controller, @Service 등)을 인식합니다. 따라서 만약 컨트롤러 클래스가 메인 클래스가 위치한 패키지나 하위패기지 외부에 있다면 그것이 원인일 수 있습니다. 3. HTTP Method와 Endpoint 문제: 간혹 실수로 POST 요청을 GET 요청으로 보내거나, 혹은 엔드포인트에 오타가 있어서 404 에러가 발생하는 경우도 있습니다. 이를 방지하기 위해 Postman과 같은 API 테스트 도구를 사용하여 요청을 수동으로 한 번 보내보세요. 4. 서버/배포환경 설정: 아파치, Nginx 등의 웹 서버를 사용하시는지, 또는 클라우드 서비스(AWS 등)에서 어떤 설정을 하셨는지도 중요합니다. 특정 경로나 포트에 대한 접근 제한이 있으면 그것 때문에 404 에러가 발생할 수 있습니다. 위 사항들을 확인해보시고, 필요하면 관련 코드나 설정 정보를 수정해보세요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!