본문 바로가기

전체 글170

N+1 문제 해결을 위한 최고의 선택은? 현재 상황기존 코드의 경우, 키워드를 통한 Blueprint를 검색하는 JPQL을 사용하고 있다. 이 경우에 당연하게도 Blueprint에 있는 연관관계에 의해 N+1이 발생하게 된다.// Blueprint@OneToMany(mappedBy = "blueprint")private List orderBlueprints = new ArrayList();@OneToMany(mappedBy = "blueprint")private List cartBlueprints = new ArrayList();// BlueprintRepository@Query(value = "SELECT b FROM Blueprint b WHERE (b.blueprintName LIKE %:keyword% OR b.creatorName LI.. 2025. 3. 13.
북마크 구현에 관한 고민 현재 프로젝트에선 기업, 로드맵의 각 단계, 강의에 대한 북마크 기능을 지원하려고 한다. 북마크라는 테이블을 만들어 사용자가 북마크한 정보들을 저장하려고 하는데 어떤 식으로 저장하는 것이 합리적일까? 일단 내가 생각한 구현 방법은 2가지 이다. 1. 북마크 테이블을 만들고 기업, 로드맵, 강의 테이블가 각각 북마크 테이블과 연관관계를 가지도록 구현한다.2. 북마크 테이블의 칼럼을 JSON으로 만들어 한 번에 저장한다. 1. JOIN vs. JSON type 먼저, 북마크 조회 시 JOIN을 3개 사용하는 경우와 JSON을 통째로 저장하여 사용하는 경우 성능적으로 얼마나 차이가 나는지 검증해보도록 하자.  기업, 강의 영상, 로드맵 각 10,000개의 데이터가 있는 상황에서 업데이트는 한 번에 하나의 데이.. 2025. 3. 13.
[DB] Redis에서의 Persistence Redis Database (Snapshotting)주기적으로 RDB의 스냅샷을 만들고 백업하여 필요 시 롤백하는 방식장점장애 복구 탁월단일 파일로 파일 전송이 쉬움AOF보다 빠른 재시작 가능단점스냅샷 사이의 텀 발생 시, 데이터 유실 가능자식 프로세스를 통해 디스크에 스냅샷을 지속시킨다. 데이터 셋이 큰 경우 fork()가 오래 걸리기에 CPU 성능에 좋지 않음 (AOF는 fork()를 덜 자주 실행함)AOF (Append Only File)트랜잭션 커밋 시 RAM과 redo 로그(Append Only File)에 모두 저장fsync 정책을 통해 파일과 장치를 동기화한다. 기본적으로 1초마다 fsync를 하고 백그라운드 스레드로 동작한다. 메인 스레드는 fsync가 진행 중이지 않을 때 쓰기 작업을 받.. 2025. 2. 13.
[DB] Soft Delete 도입에 관해 논리적 삭제를 통해 얻게되는 장단점을 먼저 정리해보자📌 Soft Delete 개요Soft Delete 장점정보 보존에 따른 복구 가능DELETE 보다 빠른 속도의 UPDATE데이터를 활용한 추후 서비스 및 활용이 가능Soft Delete 단점데이터베이스 용량 증가모든 쿼리에서 소프트 딜리트된 데이터를 제외시켜야 함🤔 도입해야 할까?우리 서비스에 필요한가?현재 서비스에서 제공되는 기능 중 주요한 데이터라고 생각되는 것은 도면과 결제, 주문, 회원이라고 생각된다.도면의 경우, 추후 도입될 업로드 기능이 생길 경우 복구가 불가피할 것으로 보인다. 또한 삭제한 데이터도 가지고 있어 도면에 대한 데이터를 축적할 수 있다는 장점을 가진다.회원의 경우도 회원가입 시 선택되는 직업, 나이에 대한 정보가 우리 서비스.. 2025. 2. 12.
[DB] MySQL과 PostgreSQL의 격리 수준 (w/ 이상 현상) 👻 이상 현상이름설명Dirty Read다른 트랜잭션에서 Flush되지 않은 변경사항이 반영되는 현상Non-Repeatable Read같은 조회 쿼리 사이에 다른 트랜잭션의 커밋된 내용이 반영되어 조회 결과가 달라지는 현상Phantom Reads다른 트랜잭션에서 추가된 행이 반영되는 현상Lost Update현재 트랜잭션에 의해 다른 트랜잭션의 커밋된 변경사항이 사라지는 현상PostgreSQLPG는 MVCC를 통해 격리 수준을 구현한다. MVCC는 특정 시점에 커밋된 데이터를 읽는 것이다. 따라서 내부적으로 read uncommitted를 제공하지 않는다.1️⃣ SERIALIZABLE특정 트랜잭션이 사용 중인 모든 행을 다른 트랜잭션 접근 못하도록 잠금 (가장 엄격)마치 순차적으로 실행하는 것처럼 보여, .. 2025. 2. 11.
BOJ 1106 - 호텔 https://www.acmicpc.net/problem/1106그리디로 풀 수 없는 이유그리디로 처음에 시도를 했다. 그러나 이 문제는 그리도로 절때 풀 수 없다.원 당 모집 인원 수가 가장 많은 것을 고른다고 가정해보자.1번 예시에서 반례가 발생한다.```12 23 51 1```3원 - 2명은 원 당 1.66666667명을 모집한다.따라서, 그리디에선 3원을 3번 선택하여 9가 정답이지만예시의 예상 출력 값은 8이다.따라서, 이 문제는 그리디 대신 `dp`를 이용하는 것이 옳바르다.DP 풀이DP[i]를 i명 모집 시의 최소 비용으로 두자. 호텔 A가 3원 당 5명이고 호텔 B가 1원 당 1명이라고 하자. DP[i]는 DP[i-3] + 5 일 수도 있고, DP[i-1] + 1 일 수도 있다. 이전 인원.. 2024. 10. 29.