본문 바로가기

개발/SpringBoot

(6)
N+1 문제 해결을 통한 와인 목록 조회 성능 개선 1. 문제 상황 파악하기먼저 기존 코드에서 발생하는 N+1 문제를 정확히 파악했습니다. 로그 분석 결과, 다음과 같은 문제점이 확인되었습니다:와인 목록을 조회하는 초기 쿼리 1회각 와인마다 위시리스트 확인을 위한 쿼리 N회 (existsByUserIdAndWineId)각 와인마다 와인 타입 정보를 가져오기 위한 쿼리 N회 (wine.getWineType())2. 성능 측정을 위한 AOP 설정먼저 성능 측정을 위해 AOP를 설정하여 메서드 실행 시간과 SQL 쿼리 수를 측정했습니다.@Componentpublic class PerformanceAspect { private static final Logger log = LoggerFactory.getLogger(PerformanceAspect.class..
AOP와 Redis 캐싱을 활용한 OpenAI API 호출 성능 측정 및 최적화 사례 Spring AOP(Aspect-Oriented Programming)와 Redis 캐싱을 활용하여 OpenAI API 호출 성능을 측정하고 최적화한 경험을 공유하고자 합니다. 와인 추천 서비스에서 OpenAI API를 사용하여 유사 음식을 찾거나 와인 설명을 생성하는 과정에서 성능을 개선하기 위한 여정을 소개합니다.1. 문제 정의: OpenAI API 호출 시 성능 이슈우리 서비스에서는 사용자에게 맞춤형 와인을 추천하기 위해 다음과 같은 OpenAI API 호출을 사용합니다:유사 음식 검색: 사용자가 입력한 음식과 유사한 음식을 데이터베이스에서 찾기 위해 OpenAI의 텍스트 유사성 분석 사용와인 설명 생성: 추천된 와인에 대한 매력적인 설명문 생성이 과정에서 몇 가지 이슈가 발생했습니다:응답 시간 지..
[JPA] Entity 설계 시 ID 값을 Integer 대신 Long 타입으로 지정하는 이유 JPA 공부 중 많은 코드들이 Entity 설계 시 ID 값을 Long 타입으로 지정해주는 것을 보았다. NULL값을 처리해주기 위해 원시 타입인  int, long 대신 wrapper 클래스를 사용하는것은 알고 있었지만 Integer 을 써도 될것같은데 굳이 Long을 쓰는 이유를 알아보았다. Long과 Integer의 주요 차이점값의 범위Integer: -2,147,483,648 ~ 2,147,483,647 (약 21억)Long: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (약 922경)ID 값으로 Long을 선호하는 이유:확장성: 데이터가 증가해도 ID 값이 부족할 걸정이 없음안정성: Integer 최대값 도달 시 오버플로우 발생 가능일관성: ..
깃허브로 그룹 프로젝트 하는 법 3: 브랜치와 이슈 만들기 1. Develop 브랜치 만들기프로젝트의 안정성을 확보하기 위해 main 브랜치에서 작업하는것이 아닌 develop 브랜치에서 기능 작업을 한다. develop 브랜치를 만들기 위해 다음과 같은 명령어를 입력한다. git checkout -b develop이러면 로컬에서 브랜치가 생기고 이것을 github에 올리기 위해 git push --set-upstream origin develop명령어를 입력한다. 그 뒤 선택적으로 main 브랜치를 보호하는 전략을 짜고 그 이후 pull request하는 방법을 알아보자 나는 private로 리포지토리를 생성했기 때문에 브랜치 보호를 할 수 없었다. 보호하고 싶다면 유료계정으로 업그레이드 하거나 public으로 리포지토리를 바꿔야 한다. 2. 프로젝트 보드 만..
깃허브로 그룹 프로젝트 하는 법 2 : 프로젝트 환경 세팅 리포지토리가 있다는 가정하에 프로젝트 환경 세팅하는 법을 알아보겠다. 만약 리포지토리가 없다면 https://dwshin-dev.tistory.com/188 이글을 보고 리포지토리를 만들어오면 된다. 1. 프로젝트 환경 세팅하기 Spring Boot를 이용하여 백엔드 프로젝트를 할 예정이기 때문에 우선 프로젝트가 있어야한다. 프로젝트에 마우스 우클릭은 한 뒤 Open Git Bash here를 클릭한다. 그러면 Git Command 창이 뜨는데 아래의 명령어를 입력한다. 현재 이 프로젝트를 깃 로컬 저장소로 사용하겠다는 의미이다. 항상 해줄 필요는 없고 맨 처음에 프로젝트를 깃에 올릴때만 해주면된다. git init 그렇게 되면 현재 폴더명 뒤에 (master)가 생기게되는데 이후 다음 명령어를 순차적으..
깃허브로 그룹 프로젝트 하는 법 1 : 리파지토리 생성 및 팀원 초대 기본적인 깃 명령어를 안다는 전제 하에 진행합니다. 기존에 깃허브 아이디가 있고 혼자 개인 리파지토리에서 커밋을 한번이라도 한 경험이 있으시다면 따라오시는데 문제 없으실꺼같습니다.  1. 깃허브 리파지토리 만들기 기존에 organizations가 있으시다면 그 안에서 만드셔도 되고 없으시다면 개인 리파지토리를 만들어서 초대해도 괜찮습니다.   리포지토리 이름같은 경우에는 소문자와 하이픈을 섞어서 많이 쓴다고 합니다.https://stackoverflow.com/questions/11947587/is-there-a-naming-convention-for-git-repositories Is there a naming convention for git repositories?For example, I have..