전체 글 81

트랜잭션 제어와 에러 전파 방지, 그리고 이벤트 처리

이번에 신규 기능을 개발했다.모든 유저들에게 일괄적으로 편지를 작성하여 보내는 기능인데,비록 크지 않은 규모였지만 트랜잭션 제어와 이벤트 처리, DB 커넥션 등에 대해 조금 신경 쓴 내용이 있어서 기록한다. 기능 정의 : 기존에는 유저가 무지개다리를 건넌 반려동물에게 편지를 써야만 답장이 오는 구조였다면, 해당 기능은 반려동물이 먼저 편지를 작성하는 신규 기능. 먼저 신규 기능에 대해 간단히 흐름을 정리하자면 아래와 같다. 19:30이 되면 선편지 기능을 ON 해놓은 유저 및 반려동물들을 조회하여 리스트를 생성한다.유저는 각각 여러 마리의 반려동물이 있을 수 있음. 선편지를 받을 반려동물을 각각 설정할 수 있게 설계.19:30 - 20:00은 기능 ON/OFF 설정 제어를 막은 상태.선편지 기능을 ..

[Spring] MultipartFile 비동기 처리 시 NoSuchFileException 해결기

최근, 이미지 비동기 업로드 및 변환 처리 로직에서 에러가 발생해 슬랙 알림이 왔다. java.nio.file.NoSuchFileException: /tmp/tomcat.8080.18151067895986732166/work/Tomcat/localhost/ROOT/upload_4616b6d9_72a7_4eaf_8506_474054e15679_00000000.tmp 이전에는 Kotlin 코루틴으로 처리하던 부분이었지만, 새로운 테스트 서버에서 Java의 @Async 기반으로 옮기면서 예기치 못한 문제가 발생했다. 그 문제를 해결하고 구조를 개선한 경험을 기록해본다. 현재 구조Controller -> ImageService.uploadImage() -> 이벤트 발행 (MultipartFile 포함..

에러 기록 2025.05.30

이미지 업로드 비동기 처리 개선 - Kotlin

이전에 이미지 관련 비용 최적화를 통해 약 88% 개선한 경험이 있다. (개선 후에 한 달이 지나고 나서 이전 비용 평균과 비교한 수치)https://hyunco.tistory.com/82 CloudFront 적용기 [AWS - S3]이전 이미지 관련 최적화 포스팅이다.https://hyunco.tistory.com/78 현재는 라즈베리파이로 이동해 있음. 명확한 해결은 없는 상" data-og-host="hyunco.tistory.com" data-og-source-url="https://hyunco.tistory.com/78" data-og-uhyunco.tistory.com 간단히 요약하자면 원본 이미지 파일을 업로드하고 조회하던 방식에서,업로드 시 webp 형식으로 변환, 압축, 리사이징 + 조..

Slack Webhook을 활용한 자동화 레포트 전송 - Spring Boot

문제 정의현재 서비스에서 가장 중요한 기능은 편지 작성과 AI 답장 생성이다.사용자가 편지를 작성하면, AI가 답장을 생성하여 다음 날 오전 10시에 전달하는 것이 핵심 플로우인데,만약 외부 API의 예상치 못한 문제로 인해 AI 답장이 생성되지 않는 경우가 발생할 수 있다면?이 경우 사용자들은 두 가지 문제를 겪을 수 있게 된다.빈 편지 봉투를 받게 되거나답장 자체를 받지 못하는 상황이 발생이러한 문제는 심각한 서비스 신뢰도 저하로 이어지며, 문제를 인지할 수 있는 방법 또한 매우 제한적이었다.운영자가 로그를 직접 조회해야 하거나DB를 일일이 확인해야 했으며최악의 경우, 이미 사용자로부터 CS 문의가 들어온 뒤에야 문제를 인지하게 되는 상황이 발생   해결 과정 문제를 해결하기 위해 두 가지 방법을 고..

Java 15 - 멀티라인 문자열, 특수 이스케이프 문자

이번에 개선 중인 서비스에서 카카오 알림톡 템플릿을 수정하기 위해 코드를 뒤적거리다가 새로운 지식을 알게 되어 기록한다.  @Override public String content(final Object... args) { validateTemplateParameters(4, args); return """ (...템플릿 내용...) \s 안녕하세요, %s %s님! \s 아래 '답장 보러 가기' 버튼을 누르시면 편지함으로 이동합니다. \s (...템플릿 내용...) """.formatted(ar..

운영 서버 스웨거 사용 제한

운영 서버에서 스웨거를 닫게 설정해줬다.간단하지만 기록 현재 상황- 스프링 프로파일 prod인 운영 서버, dev인 개발 서버로 운영 중이며 두 개의 서버 모두 한 개의 통합 배포 파일로 CI/CD를 관리하고 있다. 우선 docker-compose.yml에 아래의 값을 추가해준다. springserver: environment: - SPRING_PROFILES_ACTIVE=prod해당 설정으로 인해, application.yml의 프로파일을 읽을 수 있다.yml의 프로파일이 prod인 설정 파일만 읽고 배포를 실행한다.   그리고 SwaggerConfig에 Spring 어노테이션인 @Profile을 등록해서, 프로파일이 dev인 어플리케이션에만 해당되게 적용시킨다.@Profile("dev..

AWS 해킹 기록..

이번에 곧 런칭하려던 서비스의 AWS 계정이 해킹을 당했다.하루만에 75달러가 찍혔다..! 보안을 위해 꼭 해야 할 일들 (결론)더보기무조건 루트 계정에는 액세스 키를 생성하지 말고, 각 사용자마다 IAM을 발급받고 최소한의 권한만 생성하여 각각 기기별 MFA를 추가해줘야 한다. 이번 AWS 계정에는 루트 계정도 MFA를 추가했고 액세스 키를 생성하지 않았는데,문제는 다른 개발자들 쓰기 편하게 IAM을 하나 만들었는데, MFA 없이 과한 권한을 주었던 게 큰 실수였다. 그리고 급한 것들은 모두 처리 했으면, 꼭 예산 생성해서 알림이 오게끔 설정하자.  찾아보다가 본 유튜브 영상 - 현재 상황과 매우 비슷하다.https://youtu.be/vqDmY1UV_hM?si=ijn07SVOJeMkVPBi   우선 ..

CloudFront 적용기 [AWS - S3]

이전 이미지 관련 최적화 포스팅이다.https://hyunco.tistory.com/78 현재는 라즈베리파이로 이동해 있음. 명확한 해결은 없는 상" data-og-host="hyunco.tistory.com" data-og-source-url="https://hyunco.tistory.com/78" data-og-url="https://hyunco.tistory.com/78" data-og-image="https://blog.kakaocdn.net/dna/1Jqhs/hyYci1OLos/AAAAAAAAAAAAAAAAAAAAAHicDLfNzfLCbm2-S1ZAKeTbZZT1304C2H1ScVRgMJ5b/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1788188399&allow_ip=&allow_referer=&signature=xhaRLozrZVErUBk%2BUy6imn1LjZM%3D