Spring
글 16편
-
예외를 잡았는데도 롤백됐다
문제: 부가 작업이 실패하면 본 작업까지 사라진다 LCA 승인 기능에 부가 작업이 둘 붙어 있다. baseline 저장 — 승인 시점의 지표를 스냅샷으로 남김 할당 스냅샷 — 같은 성격 둘 다 승인의 전제조건이 아니다. 없어도 승인은 유효하다. 그런데 이게 실패하면 승인 자체가 5...
-
트랜잭션을 쪼갰더니 잠들어 있던 버그가 깨어났다
문제: 최악 41시간짜리 단일 트랜잭션 운송 구간의 거리를 외부 API로 받아오는 배치가 있다. 이 배치의 트랜잭션 경계가 잘못돼 있었다. 구조 — resolveAll이 @Transactional 하나로 전량을 감쌈 상한 — run 당 최대 10,000건 외부 API read ti...
-
소프트 삭제 전환과 @Filter가 새는 곳
엔티티 14개를 하드 삭제에서 소프트 삭제로 배경 — 보고서에서 참조하는 데이터가 삭제되면 과거 보고서가 파손 작업 — 삭제를 is_delete 플래그로 전환 대상 — 엔티티 14개 개념은 단순한데 실제로 걸린 곳은 둘 — 유니크 제약, @Filter 미적용 경로 (a) 유니크 제...
-
동기 30초 타임아웃을 webhook 비동기로
30초로는 부족했다 기능: 문서 OCR 파싱 기존 구조: 내부 OCR 서비스에 HTTP 요청 → 결과 수신 → 응답 (동기) 30초 타임아웃에 계속 걸린 원인 두 가지: PaddleOCR 콜드스타트 — 모델 로딩 지연. 유휴 후 첫 요청이 특히 느림 페이지당 처리 지연 — 문서 길...
-
N+1 제거 4종 세트 — fetch join이 답이 아닐 때
N+1은 하나의 문제가 아니다 기간: 한 달 반 작업: 대시보드 조회 성능 개선 N+1 조우 횟수: 여러 번, 매번 처방이 상이 “N+1이면 fetch join” 반사가 통하지 않는 경우: 절반 이상 (a) fetch join을 못 쓸 때 — @BatchSize 첫 케이스 위치: ...
-
readOnly 트랜잭션에서 write를 잡아내는 테스트 가드레일
조회 API가 매번 write 트랜잭션을 만들고 있었다 발단 — 대시보드 조회 API 응답 지연 확인 결과 — eco-view의 배출원 조회 경로가 lcaStepService.updateStepOnly(write)를 부수효과로 호출 즉 대시보드를 열 때마다 write 트랜잭션 생성...
-
JWT를 걷어내고 Spring Session으로 — 그 뒤에 온 것들
전환 자체는 하루였다 내용: JWT 기반 인증 → Redis 기반 Spring Session 삭제: JwtFilter, JwtProvider 등 클래스 6개, 374줄 커밋 하나로 종료 정작 내용이 있는 구간: 그다음 3주 이 글의 주제: 세션 전환 후 드러난 문제들 (a) API...
-
비동기 API가 무조건 200을 반환하고 있었다
문제: “삭제 성공”이라는 거짓말 블록체인 네트워크 생성에 걸리는 시간 — 몇 분 수행 작업 — Kubernetes에 리소스 등록, pod 기동 대기, 채널 생성, peer 조인 그래서 채택한 방식 — 생성도 삭제도 비동기 처리 컨트롤러의 역할 — 작업 등록만 하고 즉시 응답 문제...
-
TOCTOU 한 건을 고치는 대신 버그 클래스를 없앴다
문제: SFTP 업로드가 동시에 들어오면 터졌다 프로젝트: 웹 버튼 클릭 → Hyperledger Fabric·Besu 네트워크를 Kubernetes 클러스터에 배포하는 플랫폼 인프라 계층: JSch로 원격 서버에 SSH/SFTP 접속 → bash 스크립트 전송 후 실행 해당 업로...
-
인증 필터가 매 요청 DB를 네 번 때리고 있었다
문제: TPS가 안 나온다 부하 테스트에서 목표 TPS 미달 애플리케이션 로직 자체는 가벼움 조사 방향: 비즈니스 코드가 아니라 모든 요청이 반드시 지나가는 경로 구성: Spring Security + JWT 필터 체인 추적 결과: DB 접근이 겹겹이 누적 지점 하는 일 JwtFi...
-
엑셀 업로드에서 이름이 모호할 때 사용자에게 되묻기
문제 엑셀 파일로 장비 수천 행을 조직에 일괄 배정하는 기능: 사용자가 하는 일 — 시트에 장비번호와 조직명 기입 후 업로드 서버가 하는 일 — 조직명으로 조직을 찾아 매핑 문제 지점 — 조직명이 유일하지 않음 조직 트리에서 서로 다른 부모 아래 동명의 하위 조직 존재 가능. 사용...
-
권한 체크를 세션에 캐싱하고, 무효화 지점을 찾기
문제 기존 권한 모델: user_level 정수 하나 숫자가 클수록 많은 권한 한계: “조회는 되는데 삭제는 안 되고, 다른 화면에서는 승인 권한이 있다” 같은 요구 → 정수 하나로 표현 불가 새 권한이 생길 때마다 숫자 구간 재해석 필요 그 해석이 코드 여기저기에 분산 결정: 권...
-
티켓 원정대 출발!
프로젝트 시작 TDD 책을 정독하고 읽었던 내용들을 사용해보는 프로젝트를 진행해보려고 한다. 나는 2,3번 프로젝트를 진행해봤는데 결과는 좋지 않았고 이번에는 결과물을 완성하고 싶은 마음이 크다. 설명 100명에게 Ticket을 배포하는 프로그램을 RESTful방식 개발합니다 *신...
-
엔티티 설정
고민 과연 Account 객체를 생성할 때 필요한 column명을 찾아서 적어봤다. Account @Getter @Builder @Entity @NoArgsConstructor @AllArgsConstructor public class Account { @Id @GeneratedV...
-
내가 적어보는 Hateoas 정리
Hateoas 티켓 프로젝트를 진행하면서 rest(ful?) api 문서화를 만드는 중, 우리는 hateoas를 당장 써서 만들어야 할지 아닐지 고민되었다. 그래서 일단 자료조사를 위해서 hateoas에 대해 알아보려고 한다. Hateoas 란? Wikipedia에서 ‘hateoa...
-
DTO 처리방법
티켓 프로젝트를 진행하다가 다들 DTO에 대한 처리방식이 있었는데 나도 하나 적고 싶어서 DTO에 대한 내용을 찾다가 DTO에 관한 고찰 이분에 대한 내용 글이 재미있어서 읽고 블로그에 정리하고 싶어졌다. DTO 란? Data Transfer Object 로 계층간의 데이터를 교환...