분류 전체보기116 일급 컬렉션 (First-Class Collection)으로 코드 품질 향상 도전하기 문제 상황제가 느낀 문제는 다음과 같았습니다:서로 다른 도메인이 같은 컬렉션 타입을 사용하고 있어, 구분하기 어렵다같은 컬렉션 타입의 비즈니스 로직들이 서비스 레이어에 흩어져 있어서 관리가 어렵고 직관적으로 이해하기 어렵다예를 들면, 두 개의 도메인이 같은 Map(적절한 예시인지는 모르겠지만..) 타입을 사용하고 있었던 겁니다.서비스 레이어에서 이 타입의 변수를 만들고 수정하는 작업을 하는데, 이게 어떤 도메인과 관련된 코드인지 구분하기가 어려웠어요.심지어 제가 직접 작성한 코드인데도 다시 보면 이해하는데 시간이 걸렸기에..나도 보기 힘든데, 다른 사람은 더 힘들겠다는 생각에 개선하기로 마음먹었습니다..! 개선 방법일급 컬렉션 도입제가 시도한 개선은 일급 컬렉션을 도입하는 것이었습니다. 같은 타입을 사용.. 2025. 4. 23. Bulk Update 성능 개선: JPA에서 JdbcTemplate으로 전환 이번 포스팅에서는 제가 실제 프로젝트에서 겪었던 대량 데이터 처리 성능 이슈와 이를 해결한 경험을 적어보고자 합니다.JPA의 saveAll()을 사용하던 로직을 JdbcTemplate의 Bulk Update로 전환하면서 얻은 성능 개선 경험을 기록해보고자 합니다. 겪었던 성능 이슈프로젝트를 진행하면서 다음과 같은 성능 문제에 직면했습니다:JPA의 saveAll()을 사용한 대량 데이터 업데이트 시 심각한 성능 저하 발생약 8,000건의 데이터 처리에 약 18분이라는 긴 시간이 소요각 엔티티마다 개별 UPDATE 쿼리가 실행되어 데이터베이스 부하 증가실제 처리해야 할 데이터는 10,000건 미만이었지만, 단순 데이터 적재 외에도 여러 부가적인 처리 작업이 필요했기 때문에 꽤나 긴 시간이 소요되었습니다.이러.. 2025. 4. 7. OpenFeign에서 Java Record 사용 시 직렬화 실패 문제 OpenFeign에서 Java Record 사용 시 직렬화 실패 문제문제 상황OpenFeign 클라이언트에서 @SpringQueryMap과 함께 Record를 사용하다가 문제가 발생했습니다:예시코드)@FeignClient(...)public interface NewsClient { @GetMapping("/news") Response getNews(@SpringQueryMap NewsRequest request);}public record NewsRequest( int limit, Integer offset, String keyword) {}쿼리 파라미터가 누락되어 서버로 전송됨원인OpenFeign GitHub Issue #1927과 Spring Cloud OpenFeign #.. 2025. 4. 1. 엔티티 조회 대신 존재 여부만 확인하기 특정 조건의 데이터가 DB 에 존재하는지 알기 위해선 직접 엔티티를 조회해서 그 값을 확인해볼수있고, 존재하는지만 체크할 수 있습니다.DB에 존재하는지만 알고 싶은데 굳이 엔티티를 조회해와야하나? 싶은 마음에 DB에 존재하는지만 체크해보기로 했습니다.리팩토링 전기존에는 알림의 존재 여부를 확인할 때 엔티티를 조회하고 있었습니다:@Query(value = """ SELECT * FROM notification WHERE type = :type AND user_id = :userId AND is_active = true AND created_at >= :timeLimit ORDER BY id DESC LIMIT 1""", nativeQuery = true.. 2025. 3. 7. OpenSearch 페이징 문제 및 해결 안녕하세요. 이번에는 OpenSearch를 사용하면서 겪었던 페이징 관련 이슈와 그 해결 과정에 대해 공유드리고자 합니다.문제 상황OpenSearch를 통해 데이터를 페이징하는 과정에서 다음과 같은 문제가 발생하였습니다:실제 데이터는 10,000개 이상 존재하나, size 10 기준으로 1,000 페이지(총 10,000개)까지만 데이터가 표시되었습니다.10,000개 이상의 데이터는 조회가 불가능한 상황이었습니다.결과적으로 페이징 처리 중 데이터 유실이 발생하였습니다.문제 해결 과정1차 시도: max_result_window 설정 확인먼저 Elasticsearch의 기본 검색 제한인 10,000건 제한과 관련이 있을 것으로 판단하여 max_result_window 설정을 확인해보았습니다.GET {index.. 2025. 2. 27. JPA Custom Query Method 사용 시 트랜잭션 이슈 및 해결 문제 상황JPA Repository에서 커스텀 쿼리 메소드로 데이터를 삭제하려 했을 때 트랜잭션 관련 예외가 발생하였습니다.구체적으로는 No EntityManager with actual transaction available for current thread 에러가 발생하였습니다.특이한 점은 JPA에서 기본으로 제공하는 delete 메소드들(deleteById, delete 등)은 정상적으로 동작하였으나, 커스텀 메소드에서만 문제가 발생하였습니다.원인JPA의 SimpleJpaRepository에서 제공하는 기본 삭제 메소드들에는 @Transactional 어노테이션이 기본적으로 포함되어 있습니다.실제 SimpleJpaRepository의 구현부를 보면 다음과 같이 모든 삭제 메소드에 @Transacti.. 2025. 2. 24. 이전 1 2 3 4 ··· 20 다음