Blog

CategoriesTags

2026

  1. 가끔만 실패하는 테스트는 왜 생길까

    네트워크로 가는 ack와 직접 호출한 되감기의 순서가 뒤바뀌던 테스트

  2. 터미널은 어떻게 작업 표시줄에 진행률을 그릴까

    OSC 9;4 신호와 WT_SESSION으로 Windows Terminal에서 Gradle 진행률을 표시하기

  3. executor를 닫으면 대기 중이던 작업은 어떻게 될까

    shutdownNow()가 대기 중인 작업을 버려서 future가 끝나지 않던 문제

  4. TableView에서 message 전체를 쓰고 싶을 때

    PIP-445, TableView에 message 전체를 받는 mapper를 더한 과정

2025

  1. try-with-resources 안에서 쓰이지 않던 stream

    BootZipCopyAction이 같은 파일을 한 번 더 열던 이유

  2. JWT의 typ 값은 왜 대소문자를 가리면 안 될까

    JwtTypeValidator가 typ 값의 대소문자를 구분하던 문제

  3. OIDC 1: OAuth 2.0과 ID Token, 공개키 검증 이해하기

    OIDC의 인증 역할과 ID Token의 클레임, JWK에서 RSA 공개키를 만드는 코드를 정리합니다.

2024

  1. Redis Lock으로 찜 토글 요청의 동시 접근 제어하기

    같은 회원과 병원의 찜이 중복 생성되어 Redisson 락을 적용한 과정을 기록합니다.

  2. JPA 컬렉션 Fetch Join과 메모리 페이징 문제

    컬렉션까지 EntityGraph로 조회한 뒤 발생한 메모리 페이징 경고와 조회 방식 변경을 기록합니다.

  3. Fixture Monkey로 만든 객체의 필드가 null일 때

    생성자와 빌더 방식으로 실패한 뒤 필드 리플렉션과 failover 설정을 적용한 기록입니다.

  4. CORS와 사전 요청: 브라우저가 다른 출처를 읽는 조건

    동일 출처 정책과 CORS, 사전 요청, 인증 정보가 포함된 요청의 차이를 정리합니다.

  5. ObjectMapper가 LocalTime을 JSON으로 변환하지 못할 때

    테스트 유틸리티의 ObjectMapper에 JavaTimeModule을 등록한 과정을 기록합니다.

2023

  1. ReflectionTestUtils로 단위 테스트의 엔티티 ID 설정하기

    DB에 저장하지 않은 엔티티의 ID를 테스트 안에서 설정해 작성자 검증을 수행한 기록입니다.

  2. Querydsl 페이징: PageImpl과 PageableExecutionUtils의 차이

    페이지 내용으로 전체 개수를 계산할 수 있을 때 count 쿼리를 생략하는 조건을 살펴봅니다.

  3. DataJpaTest에서 생성일이 null로 조회될 때

    JPA Auditing 설정을 테스트에 가져와 생성일이 기록되도록 한 과정을 정리합니다.

  4. Facade로 답변 생성 로직의 의존성 분리하기

    회원과 질문 조회를 AnswerFacade로 옮긴 리팩터링과 남은 고민을 기록합니다.

  5. Docker에서 Eureka Client가 접근할 수 없는 IP로 등록됐을 때

    Eureka 등록 정보의 IP를 확인하고 배포 환경에서 접근 가능한 주소를 지정한 문제 해결 기록입니다.

  6. H2 Console 화면이 X-Frame-Options에 막혔을 때

    내장 H2 Console 접속 중 프레임 차단을 확인하고 당시 보안 설정을 조정했던 기록입니다.

  7. LeetCode 133: 방문한 노드를 기억하며 그래프 복사하기

    깊이 우선 탐색과 원본 노드에서 복제 노드로의 매핑을 사용한 Clone Graph 풀이입니다.

  8. LeetCode 208: 단어와 접두사를 구분하는 Trie 구현

    문자별 자식 노드와 단어 끝 표시로 Trie의 삽입 및 검색을 구현한 기록입니다.