db 11

[쇼핑몰 프로젝트 - 리팩토링] 상품 목록 조회 최적화: N+1 해결 & 인덱스로 31% 개선

0. 개요기존 쇼핑몰 프로젝트의 카테고리별 도서 조회에서 N+1 문제와 조회 속도가 느리다는 문제점이 있었다.리팩토링을 통해 N+1 문제를 해결하고, 인덱스를 통해 조회 속도를 개선했다.이 글은 그 과정을 정리한 글이다.1. 기존 구조의 문제점먼저 프론트를 보면, 해당 페이지에서 필요한 데이터는 bookId, title, price, salePrice, amount 5개다. 하지만 백엔드는 아래 메서드로 엔티티(Page) 자체를 반환했다. 이러한 문제 때문에 N+1 문제가 발생했다.한 번의 리스트 쿼리로 books_categories를 가져온 뒤, 행마다 Book을 개별 조회했다.Book.publisher가 EAGER라 출판사까지 매번 조인됐다.20개의 책을 가져오는데, 결과적으로 요청 1번에 쿼리 23..

[쇼핑몰 프로젝트] 외부에 노출되는 PK, 어떤 전략을 사용해야 할까?

0. 개요쇼핑몰 프로젝트를 진행하며 회원 테이블의 PK 생성 전략에 대해 고민했던 내용을 공유하려고 한다.DB는 MySQL을 사용했다.1. 문제프로젝트 요구사항에서 DB는 확장 가능하고, 인증을 위해 회원의 PK는 외부에 노출되어도 문제 없어야 했다.이를 위해 기본키 생성 전략으로 아래의 5가지 방법에 대해 고민했고, 결론부터 말하자면 TSID를 사용했다.Auto_IncrementUUIDULIDSnowflake IDTSID2. 생성 전략들1) Auto_Increment개요데이터베이스에서 자동 증가(시퀀스) 값을 사용하여 유일한 식별자(Primary Key) 를 생성하는 방식.보통 INTEGER 또는 BIGINT 타입의 값을 사용하며, 새로운 레코드가 추가될 때마다 1씩 증가함.특징간단한 구현: 데이터베이..

[쇼핑몰 프로젝트] 외래 키(FK), NULL이어도 괜찮을까?

1. 문제 ERD 설계 중 비회원도 장바구니를 이용할 수 있어야 한다고 생각했다.비회원의 장바구니도 DB에 저장할 것인가?비회원의 장바구니도 DB에 저장하기로 했다.-> 비회원도 잠재적인 고객이기 때문에, 장바구니를 DB로 저장하도록 결정했다.     (Redis에 저장 후 스케줄러와 배치로 DB에 백업하는 방식)DB에 저장한다면 비회원의 장바구니는 어떻게 식별할 것인가?UUID를 장바구니 PK로 사용하고, 고객(회원/비회원)에게 해당 UUID를 할당하는 방식으로 해결하고자 했다.-> 장바구니 테이블은 회원 테이블과 연결되어 있지만, 비회원의 경우 회원 FK를 어떻게 처리할 것인가? 2. 시행착오"고객 테이블을 만들고, 회원은 고객 테이블에 의존하는 관계로 설계하면 어떨까?" 그런데 이렇게 되면 비회원도..

[Spring Boot] DB 연결하기 - MySQL, H2, Redis

1. MySQL(0) MySQL 로컬 서버 활성화/종료# 서버 활성화mysql.server start# 서버 종료mysql.server stop (1) 터미널로 연결하기로컬에 설치된 MySQL 서버에 root 사용자로 접속하는 명령어.mysql -u root -p MySQL 원격 접속을 위한 명령어.-h: 호스트. 111.111.111.111은 MySQL 서버의 IP 주소.-P: 포트 번호.-u: 사용자 이름.-p: 비밀번호 입력을 요청.mysql -h 111.111.111.111 -P 3306 -u nhn_exam_17 -p (2) Spring Boot 에서 properties 파일로 연결하기의존성 추가. com.mysql mysql-connector-j runtime 2. pr..

Spring 2024.11.30

[Relational database] 07. 보안과 뷰 ***

Chapter 1: 데이터베이스 보안데이터베이스 보안 개요User 개체접근 제어재량 접근 제어특권(Privilege)필수 접근 제어실습 7-1: 사용자 생성 및 권한 제어Chapter 2: ViewView 개요View 생성과 삭제View에 대한 갱신실습 7-2: 뷰의 생성과 사용 및 보안 설정Chapter 1: 데이터베이스 보안데이터베이스 보안 개요안전한 DB 응용 설계시 고려하는 목표 3가지.보안(Securty): 정보가 권한 없는 사용자에게 누출되어서는 안된다.무결성(Integrity): 권한이 있는 사용자에 대해서만 데이터 수정이 허용되어야 한다.가용성(Availability): 권한 있는 사용자의 접근이 거부되어서는 안된다. User 개체DB의 개체에 대한 접근/삭제/갱신에 대한 권한이 부여.DB..

DB 2024.10.12

[Relational database] 06. SQL ***

Chapter 1: SQL 개요SQL 개요SQL 구성Chapter 2: DDL - Data Definition LanguageDDL: Data Definition LanguageSQL에서 DDL 구문테이블 생성, 수정, 삭제 DDL문실습: 테이블 생성 (MYSQL)Chapter 3: DML - Data Manipulation Language, SQL 질의 기본 구조SQL 질의 형식SELECT 절SELECT 명령 내의 수식과 문자열FROM절WHERE절Chapter 4: 집합 연산UNIONINTERSECTEXCEPTChapter 5: 서브 쿼리서브 쿼리 개요포함된 서브쿼리(Nested subquery)인라인 뷰(Inline view)스칼라 서브쿼리(Scalar subquery)상호 연관 서브쿼리(Correl..

DB 2024.10.04

[Relational database] 05. 관계 대수 *

Chapter 1: 관계 대수관계 해석관계 대수 개요셀렉션과 프로젝션집합 연산이름 바꾸기조인Chapter 1: 관계 대수 이 3가지 식 중에서 실행 계획을 구현할 때, 관계 대수식을 가장 많이 사용한다.관계 대수식.관계 해석식.도메인 해석식.관계 대수 개요관계 대수(Relational Algebra): 관계 모델에 관한 두 가지 형식 질의어 중 하나.관계 대수식 (Relational Algebra Expression): 연산자들의 모임을 사용해서 구성된 대수식.기존의 Relation으로 부터 새로운 Relation을 생성.필수 관계 연산자연산자표기법단항 또는 이항셀렉션(selection)δ단항프로젝션(projection)π단항합집합(union)∪이항차집합(difference)-이항카티션 프로덕트(cart..

DB 2024.10.04

[Relational database] 04. 파일 조직과 인덱스

Chapter 1: 비용 모델과 파일 조직법비용 모델 개요파일 조직법 비교 기준 연산힙 파일정렬 파일해시 파일파일 조직 선택Chapter 2: 인덱스인덱스 개요클러스터드 인덱스(Clustered Index)넌 클러스터드 인덱스(Non-Clustered Index)밀집 인덱스(Dense Index)와 희소 인덱스(Sparse Index)기본 인덱스(Primary Index)와 보조 인덱스(Secondary Index)복합 키 인덱스실습: 인덱스 생성(MySQL)Chapter 1: 비용 모델과 파일 조직법 DB는 Query가 요청될 때 여러 실행 계획을 세우고 비교하여 최적화된 방법으로 query를 실행한다.(Query Optimizer) 그 중 가장 많이 쓰이는 방법이 Cost Model이고, 파일 조직은..

DB 2024.10.03

[Relational database] 03. 디스크와 파일

Chapter 1: 기억장치 계층 구조디스크와 파일 개요기억장치 계층구조 개요Chapter 2: 디스크HDDSSD디스크의 성능Chapter 3: 디스크 공간 관리 (Disk Manager)비어있는 블록의 추적 감시운영체제 파일 시스템을 이용한 디스크 공간 관리Chapter 4: 버퍼 관리자 (Buffer Manager)버퍼 풀버퍼 교체 전략버퍼 관리 기법 비교Chapter 5: 레코드 형식고정 길이 레코드(Fixed-length Record)가변 길이 레코드(Variable-length Record)Chapter 6: 페이지 형식페이지 형식고정 길이 레코드가변 길이 레코드Chapter 7: 파일과 인덱스Heap 파일인덱스 개요ISAM 파일B+ 트리Chapter 8: 시스템 카탈로그시스템 카탈로그 Chap..

DB 2024.10.03