Blog
2026
- 가끔만 실패하는 테스트는 왜 생길까
네트워크로 가는 ack와 직접 호출한 되감기의 순서가 뒤바뀌던 테스트
- 터미널은 어떻게 작업 표시줄에 진행률을 그릴까
OSC 9;4 신호와 WT_SESSION으로 Windows Terminal에서 Gradle 진행률을 표시하기
- executor를 닫으면 대기 중이던 작업은 어떻게 될까
shutdownNow()가 대기 중인 작업을 버려서 future가 끝나지 않던 문제
- TableView에서 message 전체를 쓰고 싶을 때
PIP-445, TableView에 message 전체를 받는 mapper를 더한 과정
2025
- try-with-resources 안에서 쓰이지 않던 stream
BootZipCopyAction이 같은 파일을 한 번 더 열던 이유
- JWT의 typ 값은 왜 대소문자를 가리면 안 될까
JwtTypeValidator가 typ 값의 대소문자를 구분하던 문제
- OIDC 1: OAuth 2.0과 ID Token, 공개키 검증 이해하기
OIDC의 인증 역할과 ID Token의 클레임, JWK에서 RSA 공개키를 만드는 코드를 정리합니다.
2024
- Redis Lock으로 찜 토글 요청의 동시 접근 제어하기
같은 회원과 병원의 찜이 중복 생성되어 Redisson 락을 적용한 과정을 기록합니다.
- JPA 컬렉션 Fetch Join과 메모리 페이징 문제
컬렉션까지 EntityGraph로 조회한 뒤 발생한 메모리 페이징 경고와 조회 방식 변경을 기록합니다.
- Fixture Monkey로 만든 객체의 필드가 null일 때
생성자와 빌더 방식으로 실패한 뒤 필드 리플렉션과 failover 설정을 적용한 기록입니다.
- CORS와 사전 요청: 브라우저가 다른 출처를 읽는 조건
동일 출처 정책과 CORS, 사전 요청, 인증 정보가 포함된 요청의 차이를 정리합니다.
- ObjectMapper가 LocalTime을 JSON으로 변환하지 못할 때
테스트 유틸리티의 ObjectMapper에 JavaTimeModule을 등록한 과정을 기록합니다.
2023
- ReflectionTestUtils로 단위 테스트의 엔티티 ID 설정하기
DB에 저장하지 않은 엔티티의 ID를 테스트 안에서 설정해 작성자 검증을 수행한 기록입니다.
- Querydsl 페이징: PageImpl과 PageableExecutionUtils의 차이
페이지 내용으로 전체 개수를 계산할 수 있을 때 count 쿼리를 생략하는 조건을 살펴봅니다.
- DataJpaTest에서 생성일이 null로 조회될 때
JPA Auditing 설정을 테스트에 가져와 생성일이 기록되도록 한 과정을 정리합니다.
- Facade로 답변 생성 로직의 의존성 분리하기
회원과 질문 조회를 AnswerFacade로 옮긴 리팩터링과 남은 고민을 기록합니다.
- Docker에서 Eureka Client가 접근할 수 없는 IP로 등록됐을 때
Eureka 등록 정보의 IP를 확인하고 배포 환경에서 접근 가능한 주소를 지정한 문제 해결 기록입니다.
- H2 Console 화면이 X-Frame-Options에 막혔을 때
내장 H2 Console 접속 중 프레임 차단을 확인하고 당시 보안 설정을 조정했던 기록입니다.
- LeetCode 133: 방문한 노드를 기억하며 그래프 복사하기
깊이 우선 탐색과 원본 노드에서 복제 노드로의 매핑을 사용한 Clone Graph 풀이입니다.
- LeetCode 208: 단어와 접두사를 구분하는 Trie 구현
문자별 자식 노드와 단어 끝 표시로 Trie의 삽입 및 검색을 구현한 기록입니다.