Recent Posts

Backend & Spring·7월 7, 2026

15초 걸리던 API: JPA N+1 문제가 보낸 청구서

통역 직원이 상자 하나씩만 들고 책상과 창고 사이를 수없이 왕복하며 발자국 트레일을 남기는 일러스트.

 “목록 화면이 느려요” 목록 화면은 서비스의 현관이다. 사용자가 하루에도 수십 번 여닫는 문이고, 그래서 이 문이 무거워지면 불만은 가장 먼저, 가장 크게 들어온다. 내가 운영에 참여하는 시스템(농산물 생산 이력 관리, Spring Boot + JPA/Hibernate + PostgreSQL)에도 그런 문이 하나 있었다. 수확 이력 목록 API. 조회 버튼을 누르면 응답까지 '10초에서 15초'가 걸렸다. 페이지가 죽은 게 … 더 읽기

Backend & Spring·7월 3, 2026

SQL을 직접 짜본 게 언제였더라: AI의 리팩토링 계획을 뒤집은 날

읽기 문과 쓰기 문이 나란히 달린 창고 앞에 두 직원이 서 있는 일러스트. 한 명은 통역용 헤드셋을, 한 명은 SQL 쪽지를 들고 있다.

편리함의 청구서 오늘 하루 짠 코드를 돌아보자. repository.save()를 몇 번 호출했고, findBy로 시작하는 메서드 이름을 몇 개 지었는가. 그리고 SQL은 몇 줄 직접 썼는가. 나는 마지막 질문 앞에서 오래 멈췄던 적이 있다. 메서드 이름만 지으면 쿼리가 알아서 만들어진다. 복잡한 조회는 이미 있는 XML을 복사해 조건 하나만 바꾼다. 막히면 AI에게 물어본다. 요즘 백엔드의 데이터 접근은 대개 … 더 읽기

Backend & Spring·4월 30, 2026

WebSocket 채팅 실무: Spring STOMP + SockJS로 만드는 실시간 채팅

Spring Boot로 WebSocket 채팅을 실제로 만드는 방법을 정리합니다. STOMP/SockJS 역할 구분, 주소 치트시트, 메시지 흐름, MVP 코드, 인증 두 갈래(Spring Security/JWT), 그리고 MVP 이후 운영 체크리스트까지.