본문 바로가기

개발

(20)
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의 텍스트 유사성 분석 사용와인 설명 생성: 추천된 와인에 대한 매력적인 설명문 생성이 과정에서 몇 가지 이슈가 발생했습니다:응답 시간 지..
한 리포지토리에서 Back, Front CI/CD 배포하기 (Feat. Gitlab, Jenkins, Docker, NginX, React, Springboot) 우선 EC2 인스턴스가 생성되있다고 가정을 하고 진행해보겠다. 만약 인스턴스가 없다면 AWS에 가입을 하고 인스턴스를 생성해야되는데 다음 글에 자세히 나와있다. https://velog.io/@kyj311/AWS-EC2-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0 [AWS] EC2 알아보기 + 인스턴스 생성하기AWS EC2 알아보기velog.io  또한 나는 기존에 AWS 해킹이 빈번하게 일어난다는 얘기를 들어서 다음 글을 보고 많이 참고하였다. https://www.lgcns.com/blog/cns-tech/aws-ambassador/56822/ 해킹과 과다 요금 발생을 방지하는 AWS 계정 보안 강화 노하우 - LG CNSIntro 최근 AWS Account 탈취로 인한 AWS ..
[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..
[Java] 싱글톤 패턴(Singleton Pattern) - 인터페이스 타입 vs 구현체 타입 싱글톤(Singleton) 패턴은 객체의 인스턴스를 하나만 생성하고, 해당 인스턴스에 전역적으로 접근할 수 있게 하는 디자인 패턴입니다. 즉, 시스템 내에서 해당 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 구조를 제공합니다.1. 싱글톤 패턴의 필요성자원의 낭비를 방지: 여러 개의 인스턴스가 필요 없는 상황에서 불필요한 메모리 낭비를 줄입니다. 예를 들어, 데이터베이스 연결을 관리하는 클래스나 로깅 시스템은 여러 개의 인스턴스가 필요하지 않습니다. 이러한 클래스는 단 하나의 인스턴스만 있어도 충분합니다.전역적 접근: 싱글톤 인스턴스는 애플리케이션 어디에서든지 접근할 수 있습니다. 이는 클래스 내에 객체를 전역적으로 관리하고자 할 때 유용합니다.2. 싱글톤 패턴의 구현자바에서 싱글톤 패턴은 보통 정..