전체 글
-
JDBC Connection timeout: 가상 스레드의 함정백엔드 : 서버공부/Spring 2026. 7. 23. 19:18
이번 분기, 미뤄두었던 전자위임장 출력 개선이 드디어 정식 태스크로 잡혔다.그동안에는 운영 이슈가 발생할 때마다 필요한 부분을 조금씩 보완해 왔다. 하지만 이번에는 요청 생성부터 데이터 조회, 출력 아이템 처리와 Lambda 호출까지 전체 플로우를 처음부터 다시 살펴볼 수 있게 되었다. 이 글에서는 전자위임장 출력 과정에서 발생한 JDBC Connection timeout의 원인을 분석하고, 가상 스레드사용시 고려해야될 점을 정리해보려한다.JDBC Connection timeout임시 주주총회 시즌이 한창이던 시기, 전자위임장 출력 과정에서 JDBC Connection timeout 오류가 반복적으로 발생했다. 커넥션 획득 대기가 길어지면 출력 아이템을 처리하는 작업뿐 아니라 비동기 worker도 함께 ..
-
Java Record는 단순히 DTO를 짧게 쓰기 위한 문법일까?백엔드 : 서버공부/Spring 2026. 6. 4. 19:30
Java에서 객체를 구현하다보면 반복되는 코드가 많다.단순하게 데이터를 담는 목적인 DTO 같은 객체를 구현할때 조차 많은 보일러 플레이트 코드를 작성하게된다.필드를 선언하고, 생성자를 만들고, getter/setter 를 만들고, 심지어 equals(), hashCode(), toString()까지 만들때도있다. 물론 IntelliJ 같은 IDE나 AI agent들이 요즘 잘되어있어서 자동으로 만들어주기도 하고 Lombok라이브러리를 사용하면 이런 반복 코드를 많이 줄일 수 있다. 그러나 이런 환경에서도 개발을 하다보면 반복되는 코드때문에,이 클래스가 어떤 의도로 만들어졌는지 코드만 보고 명확하게 드러나지 않는다는 것을 느낄때가 있다. 아래 예시를 함께 살펴보자public class UserRespon..
-
전자위임장 대량 출력 결과: API Callback과 토큰 인증백엔드 : 서버공부/Spring 2026. 5. 15. 16:21
지난 글에서는 SQS 기반 큐를 이용해 비동기 작업 결과를 처리하는 구조를 소개했었다.SQS를 이용한 구조는 아래와 같았다. SQS를 사용했을때의 장점은 대략 다음과 같다.큐에 메세지를 일정시간 보관하기 때문에, Spring 서버가 잠시 내려가 있어도 처리 실패 시 재시도 모델도 쉽게 구현할 수 있다.또한 결과 전달을 HTTP callback에 직접 묶지 않아도 된다. 그런데 팀원들과 논의하면서 다른 관점이 나왔다.전자위임장 출력이라는 기능은 1년 내내 일정하게 호출되는 기능이 아니라, 특정 시기에만 많이 사용되는 기능에 가깝다는 것이다. 사실, 전자 위임장 출력이라는 것은 정기주주총회가 많은 3월이 아니면 쓰이지않는 기능이다.때문에 이 기능 하나를 위해 Spring 서버가 1년 내내 SQS를 polli..
-
Lambda invoke를 기다리지 않기: 전자위임장 출력 비동기화 개선기백엔드 : 서버공부/Spring 2026. 5. 10. 17:02
지난 글에서는 전자위임장 출력 기능을 Lambda로 분리한 과정을 정리했다.기존에는 Spring 서버가 직접 PDF 템플릿을 읽고, 값을 채우고, 서명과 신분증 이미지를 삽입하고, 여러 PDF를 병합했다.이 과정에서 CPU와 메모리 사용량이 크게 증가했고, 실제로 Datadog에서 CPU 알람이 발생하거나 메모리 부족으로 서버가 위험해지는 상황도 있었다.그래서 무거운 PDF 렌더링 작업을 Lambda로 분리했다.Spring 서버는 비즈니스 데이터를 정리하고, Lambda는 실제 파일 렌더링만 담당하도록 역할을 나누었다. 여기까지 보면 꽤 괜찮은 구조처럼 보인다. 하지만 막상 운영 관점에서 다시 바라보니, 아직 찝찝한 부분이 하나 남아 있었다.Lambda로 무거운 작업을 옮기긴 했는데, Spring 서버는..
-
성장 : 도망친 곳에 낙원은 없다잡다한 글 2026. 5. 7. 13:51
요즘 ‘성장’이라는 것에 대한 고민이 많다.어떤 날은 자신감이 넘치다가도, 또 어떤 날은 뒤처지고 있는 것만 같은 불안감에 휩싸인다.하루하루가 알차고 뿌듯하게 느껴지는 날도 있지만, 반대로 이런 일조차 버거워하는 나 자신이 원망스러워지는 날도 있다. 그런데 요즘 한 가지 분명히 깨달은 것이 있다. 하고 싶지 않은 일을 끝까지 해냈을 때 더 성장한다는 것이다.결국 사람은 익숙한 곳에 머물고 싶어 한다주변을 보면 딱 자기가 스트레스받지 않을 만큼만 노력하는 사람들이 있다.이미 해봤던 싸움, 다시 말해 해봤던 일만 반복하면서도 “왜 나는 안 될까”라는 질문을 입에 달고 산다.반면 내가 존경하고 존중하는 어떤 친구들은 늘 노력한다. 스트레스를 견디고, 자신이 원하는 것을 얻기 위해 그동안 해보지 않았던 일에 ..
-
람다로 무거운 작업 분리하기백엔드 : 서버공부/Spring 2026. 5. 2. 16:43
비사이드 코리아에서는 전자위임장을 대량으로 출력하는 기능을 제공하고 있다.기존 구조에서는 워드(docx) 파일을 양식으로 받아 지정된 위치에 값을 채워 넣고, 이를 PDF로 변환한 뒤 서명과 신분증 이미지를 삽입했다. 이후 여러 명의 전자위임장을 하나의 PDF 파일로 병합하는 방식이었다.이 구조에는 몇 가지 문제가 있었다.가장 큰 문제는 높은 CPU 사용량과 메모리 사용량이었다. 파일을 byte[] 형태로 메모리에 올려 작업했기 때문에, 출력 요청이 한 번에 몰리면 리소스 사용량이 급격히 증가했다.그 결과 Datadog에서 CPU 사용량 알람이 발생했고, 심한 경우에는 메모리 부족으로 서버가 다운되는 상황도 있었다.이 문제를 해결하기 위해 전자위임장 출력 기능을 별도의 Lambda 실행 환경으로 분리하기..
-
함수형 인터페이스를 알아보자백엔드 : 서버공부/Spring 2026. 4. 19. 17:50
최근 버전의 자바로 개발하다 보면 아래와 같은 코드를 보게 된다.load(semaphore, () -> userServicePort.getName()); 처음 이 문법을 보면 조금 생소하다. load 메서드에 semaphore 와 함께 람다식을 넘기고 있기 때문이다.기존 자바 문법에 익숙한 사람이라면 보통 값이나 객체를 파라미터로 넘기는 데는 익숙하지만, 이렇게 어떤 동작 자체를 전달하는 형태는 직관적으로 와닿지 않을 수 있다.하지만 이 코드는 단순히 문법이 새로워진 것이 아니라, 자바가 동작을 더 유연하게 다룰 수 있도록 만든 방식의 결과다. 그 중심에는 글의 주제인 함수형 인터페이스가 있다. 함수형 인터페이스는 추상 메서드가 하나만 있는 인터페이스를 말한다.자바는 메서드 자체를 다른 메서드의 파라미터..
-
고대 자바 개발자들은 완전히 멘탈이 나가버렸습니다 : NPE백엔드 : 서버공부/Spring 2026. 2. 18. 16:27
요즘 내 상황을 요약하는 그림이다. 백엔드 개발자로서 자바를 쓰다 보면 NullPointerException을 정말 자주 마주하게된다.이게 “가끔 만나는 버그”라기보다는, 어딘가 항상 숨어 있는 존재 같은 느낌이다.NULL의 역사: “편의 기능”이 “빚”이 되기까지NullPointerException 을 이해하려면 null을 먼저이해해야한다.쉽게말해서 Null 은 값이 없는 것을 표현하기위해 존재하는 값이다. 개념적으로는 숫자 0 으로 정의되어있지만, Null은 숫자인지 글인지 형식 조차 없는 것이다. null은 프로그래밍 언어 ALGOL W의 창시자 중 한 명인 토니 호어가 의도적으로 넣은 값이라고한다.왜 넣었을까?이유는 꽤 합리적이었다.“나중에 채워질 값”을 표현하기 쉬움 (인정 ㅇㅇ)초기화되지 않은..