Java, Spring Boot, Tomcat 환경에서 파일 업로드 기능을 구현하면서 겪었던 임시 파일 삭제 문제에 대해 공유하고자 합니다. 특히, File.deleteOnExit() 메소드를 사용했을 때의 한계와 이를 해결하기 위해 Files.delete() 메소드로 전환한 경험을 공유합니다. 문제의 배경 파일 업로드 기능을 구현할 때, 사용자가 업로드한 파일은 일반적으로 서버의 임시 디렉토리에 저장됩니다. Tomcat은 요청이 완료되면 자동으로 이 임시 파일들을 삭제하는 기능을 제공하지만, 비동기 처리나 지속적인 파일 업로드가 이루어지는 환경에서는 이 기능이 제대로 작동하지 않을 수 있습니다. 이로 인해 임시 파일이 쌓여 서버의 디스크 공간을 차지하게 되는 문제가 발생했습니다. File.deleteO..
문제 상황 spring java 환경 내에서 SDK를 활용한 AWS S3 객체 목록 조회 한계와 대량 작업의 어려움 AWS S3는 수천 개의 객체를 대상으로 반복 작업을 수행할 때 AWS SDK의 listObjects API가 가진 고유한 제약 사항으로 원하는 결과를 얻지 못하는 경우가 발생. 제한된 반환 개수: listObjects API 호출은 기본적으로 한 번에 최대 1000개의 객체만 반환하도록 설계되어 있습니다. 해결방안Java AWS SDK v1 사용하는 경우(수동 while 루프 방식) 수동으로 while 루프와 withContinuationToken 토큰을 활용하여 페이지네이션을 구현 String continuationToken = null;do { ListObjectsRequest ..
로컬에 Elasticsearch를 처음 세팅하고 브라우저에서 https://localhost:9200에 접속하였는데 "이 사이트는 안전하지 않습니다"라는 SSL 오류 메시지가 확인되는 문제가 발생하였다. 로컬 개발 환경에서는 정식 인증서를 발급하기 번거롭기 때문에 빈번하게 발생하는 문제입니다.HTTPS 접근 비활성화로 문제 해결 ssl errorLog"error": "Internal Server Error","trace": "java.net.ConnectException: Connection refused: no further information\r\n\tat org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:934)\r\..
개발을 마치고 git commit 후 push를 실행한 순간, git push 거절 메시지에 대한 직접 겪고 해결한 과정을 공유합니다.✅ 문제 발생: Push가 거부되었습니다 작업을 완료하고 소스를 원격 저장소에 올리기 위해 commit 후 push를 실행했지만,아래와 같은 경고창의 메시지와 함께 실패했습니다.경고창의 메시지처럼 pull을 시도했지만 이미 로컬 저장소는 최신 상태였고"git 로그 확인" 버튼을 클릭하여 확인해 보기로 하였습니다.! [remote rejected] branch_name -> branch_name (push declined due to repository rule violations)error: failed to push some refs to 'git 주소'메시지는 저장소..
Spring에서 대부분의 Bean은 기본적으로 싱글톤(Singleton) 스코프로 관리됩니다. 즉, 애플리케이션 컨텍스트 내에서 해당 Bean의 인스턴스는 하나만 생성되고, 모든 요청에서 이를 공유해 사용합니다.이러한 구조는 성능 측면에서는 효율적이지만, 요청 간 자원 공유로 인해 사용자 정보가 노출되는 것이 아닌가? 하는 우려가 생길 수 있습니다.그러나 실제로는 잘 설계된 Bean이라면 싱글톤 방식에서도 사용자 정보 유출 없이 안전하게 동작할 수 있습니다. 그 핵심은 바로 Stateless 설계입니다. 싱글톤(Singleton) 방식이란?"싱글톤"이란 객체가 애플리케이션 전체에서 단 하나만 생성되어 재사용되는 디자인 패턴입니다. Spring에서는 기본 스코프가 Singleton이므로, 특별한 설정이 없..
Java 기반의 비동기 네트워크 프레임워크인 Netty는 고성능 서버/클라이언트 애플리케이션 개발에 자주 활용됩니다.이번 글에서는 총길이를 사전에 알 수 없는 바이트 스트림 데이터를 수신해야 하는 상황에서 Netty를 활용해 어떻게 문제를 해결할 수 있었는지 정리해 보겠습니다.Netty와 데이터 수신의 특징Netty는 비동기 이벤트 기반 네트워크 프레임워크로, TCP와 같은 연결 지향 프로토콜 기반의 통신에서 널리 사용됩니다.우리는 외부 기관과 통신할 때 Netty를 통해 데이터를 바이트 스트림 형태로 수신하고 있으며, 다음과 같은 상황을 마주하게 됩니다:데이터는 여러 조각으로 나뉘어 들어오며 한 번에 도착한다는 보장이 없다.연결을 유지하자니 언제 끝날지 모르고, 끊자니 데이터가 누락될 위험이 있다.즉,..
1. 개요 로컬 환경은 Spring Framework와 Tomcat 서버를 기반으로 개발되어 있었으며, 파일 업로드 기능은 MultipartFile을 활용하여 구현되어 있었다. 프로젝트의 서버 환경의 경우 WAS(Web Application Server)를 Tomcat이 아닌 Resin을 사용하는 것을 뒤늦게 확인하였고 이 과정에서 파일 업로드 기능에 문제가 발생하였다. 2. 문제 상황 Resin 서버로 이관 후, 클라이언트에서 전송한 파일이 서버에서 MultipartFile 객체로 정상적으로 매핑되지 않거나, transferTo() 호출 시 내부적으로 발생하는 권한/호환성 오류로 인해 업로드가 실패하였다. 대표적인 예외 메시지는 다음과 같았다. java.lang.NullPointerException :..
1. 오류 개요 PostgreSQL과 MyBatis를 사용하여 데이터베이스 작업을 수행하는 중 "invalid input syntax for type numeric" 오류가 발생하였다. 2. 오류 발생 위치 및 원인 분석 2.1 오류 발생 위치 오류가 발생한 위치는 MyBatis SQL을 선언한 XML 파일 내의 쿼리에서 확인되었다. 문제 발생 쿼리 (일부) update test_tableset num = nullif(#{paramNum}, '')::numericwhere id = #{id}2.2 오류 메시지 및 원인 분석 오류 메시지: invalid input syntax for type numeric : "" 파라미터 paramNum이 빈 문자열 ('')로 전달되는 경우 발생 이미 nullif(파라미..
- Total
- Today
- Yesterday
- Push
- TLS
- mybatis
- Windows
- Eclipse
- 프로그래밍
- JSON
- SpringBoot
- 깨짐
- SSL
- React
- 날짜
- html
- Linux
- jQuery
- gradle
- SQL
- vscode
- WAS
- JPA
- HTTPS
- Git
- spring
- Java
- parse
- Oracle
- web
- docker
- tomcat
- 컨테이너
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |

