Spring/Java 18

Spring에서 Cache를 사용해보자! (with Caffine)

🎈 Cache란캐시(Cache)는 임시 장소(Memory)에 데이터나 값을 미리 복사해 놓는 행위를 가리킵니다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용됩니다. 캐시를 사용하면 인기글, Auth의 사용자 확인과 같이 자주 조회되는 데이터를 메모리에 저장 후 사용하기 때문에 DB의 부하는 낮춰 리소스를 절약할 수 있습니다.하지만 캐시를 사용할 때 주의해야하는 부분도 있습니다.정합성https://tech.kakaopay.com/post/local-caching-in-distributed-systems/ 분산 시스템에서 로컬 캐시 활용하기 | 카카오페이 기술 블로그분산 시스템에서 로컬 캐시를 설계하고 구현한 경험을..

Spring/Java 2025.01.21

H2를 사용한 Test Code의 초기 데이터 설정

🎈 구현이유지난 포스팅에서 안드로이드 기기에 가상화 에뮬레이터를 사용해 docker의 사용 방법을 학습했습니다. 하지만 이후 Prometheus에서 지속적인 에러가 발생하고 현재 프로젝트에서 트래픽이 적기 때문에 termux에서 gradle을 사용해 빌드하기로 결정했습니다. 이후 트래픽 증가하면 prometheus를  docker가 아닌 직접 설치하여 운용할 예정입니다. 그래서 github에서 프로젝트를 clone후 빌드과정에서 테스트 코드의 최신화가 안되어있어 해당 부분을 점검 중 초기 데이터를 data.sql을 사용해 넣는 방식이 아닌 빌드 과정에서 PostConstruct 어노테이션을 사용해 save하는 방식으로 데이터를 설정하는 코드를 발견했습니다.  해당 방식은 Transcation 어노테이션..

Spring/Java 2025.01.13

Redis Test Code를 위한 Redis Test Container 사용법

🔥 문제상황Redis Cache 적용 후 테스트를 돌릴 때 redis에 접속할 수 없다는 로그 출력.org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis...개발, 배포 서버에서는 docker를 사용해 redis container를 올려 사용중이지만 테스트도 해당 container를 필요로합니다. 하지만 pr 리뷰를 해주는 sonarcloud같은 툴을 사용하면 다른 환경에서 테스트를 실행하게 되는데 이런 환경에서는 직접 test container를 올릴 수 없으니 환경에 독립적으로 테스트를 수행할 수 있어야합니다. 👀 해결방법embedded redis 사용test container 구현embe..

Spring/Java 2024.09.01

[Spring] Supplier를 사용한 람다식 간략화

🔥문제상황repo.findById 같은 메서드를 사용할 떄 Optional를 사용하여 데이터가 없을 시 예외처리를 하는 방법을 자주 사용합니다.return userRepository.findById(id).orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND));그리고 예외 코드 중 중복되는 경우가 많으니 ErrorCode와 같은 Enum 클래스를 구현하여 예외처리에 필요한 메세지들을 모아두었습니다. 그리고 실제 코드를 작성하다보면 위와 같이 람다식을 자주 사용하게 되는데 매개변수가 없는 람다식이 그렇게 좋아 보이진 않았습니다.👀 해결방법 public T orElseThrow(Supplier exceptionSupplier) throws X { ..

Spring/Java 2024.08.22

[Spring] JaCoCo를 사용한 커버리지 체크

JaCoCo(Java Code Coverage)는 Java 애플리케이션의 코드 커버리지를 측정하고 보고서를 생성해주는 오픈 소스 도구입니다. JaCoCo는 Java 프로젝트의 테스트 범위를 분석하여 코드의 테스트 커버리지 비율을 제공함으로써, 개발자가 테스트가 충분히 수행되지 않은 부분을 식별하고 개선할 수 있게 도와줍니다. 또 테스트 결과를 다양한 보고서 형식으로 변환해 추가적인 작업에도 사용할 수 있습니다.HTML: 시각적으로 보기 쉽게 제공XML: CI/CD 파이프라인과 통합 가능CSV: 데이터 분석용적용// JaCoCo 플러그인 적용plugins { id 'jacoco'}// JaCoCo 설정jacoco { toolVersion = "0.8.8" // JaCoCo 도구 버전 설정}// ..

Spring/Java 2024.07.29

[Spring] flyway를 사용한 db 형상관리

성능 개선을 위해 고민하던 중 우테코에서느는 어떤 기술들을 사용하나 궁금해서 프로젝트 깃허브들을 훑어보며 여러가지 새롭게 알게된 것들과 이번 프로젝트에 적용하면 좋을 기술들을 찾았습니다.그 중 하나가 이번 포스팅의 주제인 flyway 데이터베이스 형상 관리 라이브러리입니다.spring에서는 jpa, hibernate를 많이 사용하고 entity들이 바뀌면 ddl-auto를 사용하여 db를 업데이트합니다.하지만 이 방법은 테이블들에 대한 기록들이 안남아 커밋내역을 찾아봐야한다는 단점이 있습니다.  설치 implementation 'org.flywaydb:flyway-core' implementation "org.flywaydb:flyway-mysql"저는 mysql을 사용하므로 mysql에 관한..

Spring/Java 2024.07.20

[Spring] QueryDsl Dto반환 및 sub query

안녕하세요. 오늘은 최근 진행한 게시글 조회 API의 성능 최적화 경험을 자세히 공유하고자 합니다. 특히 서브쿼리 활용과 기존 batch size 설정의 한계를 넘어선 새로운 접근 방식에 대해 이야기하겠습니다.1. 문제 상황우리 서비스의 게시글 목록 조회 API는 다음과 같은 문제점을 가지고 있었습니다:엔티티를 조회한 후 DTO로 변환하는 과정에서 불필요한 데이터 로딩N+1 문제로 인한 추가적인 쿼리 발생복잡한 정렬 로직으로 인한 애플리케이션 레벨에서의 추가 연산찬성/반대 투표 수 집계를 위한 별도의 쿼리 실행2. 이전의 개선 시도: 전역 Batch Size 설정초기에는 N+1 문제를 해결하기 위해 application.yml 파일에서 전역으로 batch size를 설정했습니다.spring: jpa: ..

Spring/Java 2024.07.19

[Spring] @BatchSize, default_batch_fetch_size

먼저 @BatchSize, default_batch_fetch_size 모두 N+1 문제를 해결하기 위한 방법들입니다. 그래서 N+1이 무엇인지부터 알아봅시다.N+1 문제란?N+1 문제는 ORM(Object-Relational Mapping)을 사용할 때 흔히 발생하는 성능 이슈입니다. 이는 하나의 쿼리로 N개의 결과를 가져온 후, 각 결과에 대해 추가적인 쿼리를 수행하여 총 N+1번의 쿼리가 실행되는 현상을 말합니다.Fetch Join으로 N+1 문제 해결하기Fetch Join은 일반적으로 N+1 문제를 해결하는 효과적인 방법입니다. 하지만 OneToMany 관계에서는 주의가 필요합니다.@Query("SELECT p FROM Post p JOIN FETCH p.comments") List findAll..

Spring/Java 2024.07.17

[Spring] test report

spring rest docs적용하다 새로 알게된 작은 꿀팁...?입니다.gradle test를 돌리면 build/reports안에 저렇게 index.html파일이 생깁니다.이 html파일을 브라우저로 실행시키면!!사진과 같이 작성한 테스트 코드에 대한 요약이 있습니다!!!저에겐 굉장히 도움이 될 예정인데 여러분에게도 조그마한 도움이 될까 싶기도 하고 너무 신기해서 포스팅으로 올렸습니다 :)

Spring/Java 2024.07.05