2025/06 11

Transaction(3) - Isolation Level (격리 수준)

🔐 격리 수준과 이상 현상트랜잭션의 ACID 속성 중 Isolation은 여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않고 독립적으로 작동해야 함을 의미한다. 하지만 완벽한 격리를 구현하려면 성능 저하가 발생할 수 있어DBMS는 다양한 Isolation Level을 제공하여 성능과 정합성 사이의 트레이드오프를 가능하게 한다. 💥 Isolation이 약할 때 발생하는 이상 현상1️⃣ Dirty Read (더티 리드)커밋되지 않은 데이터를 읽는 현상아직 확정되지 않은 변경값을 읽어 잘못된 결과를 낼 수 있음🧪 예시:A사용자가 키를 171 → 177로 변경 (커밋 전),B사용자가 조회 → 177로 보임→ 나중에 A가 롤백하면 B는 존재하지 않는 값을 읽은 셈 2️⃣ Non-Repeatable Rea..

CS/Database 2025.06.23

Transaction (2) - 동시성 제어

🔒 Serializability & Recoverability트랜잭션의 ACID 속성 중 'Isolation(격리성)'을 보장하기 위한 두 핵심 개념인 Serializability와 Recoverability에 대해 알아보자.🧩 동시성 제어 (Concurrency Control)여러 트랜잭션이 동시에 실행되더라도 데이터 정합성과 무결성을 보장하는 기능DBNS는 이 기능을 위해 2가지 속성을 보장해야 한다.✅ Serializability (직렬 가능성)✅ Recoverability (회복 가능성)1️⃣ Serializability (직렬 가능성)📌 개념여러 트랜잭션이 병렬로 실행되더라도, 결과는 마치 순차적으로 실행된 것처럼 나와야 한다. 즉, non-serial schedule이라 하더라도 seri..

CS/Database 2025.06.23

Transaction (1)

🔄 트랜잭션(Transaction)이란? 데이터베이스에서 하나의 논리적 작업 단위여러 SQL 쿼리를 묶어 하나의 작업처럼 처리할 수 있게 한다. ✅All or Nothing트랜잭션 내의 작업은 모두 성공(Commit)하거나,하나라도 실패하면 모두 취소(Rollback) 해야 한다. 📌 트랜잭션의 목적데이터 정합성 유지부분 적용 방지장애/예외 상황에서의 복구 가능성 확보✅ 트랜잭션 제어 명령어명령어설명START TRANSACTION트랜잭션 시작 (autocommit 비활성화)COMMIT지금까지의 작업을 DB에 반영하고 트랜잭션 종료ROLLBACK지금까지의 작업을 취소하고 이전 상태로 복원SET AUTOCOMMIT = 1/0트랜잭션 자동 커밋 여부 설정 (MySQL은 기본값이 1)🏦 예시: 계좌 이체 ..

CS/Database 2025.06.23

데이터베이스 정규화

📚 데이터베이스 정규화 (Normalization)데이터베이스 내의 중복을 최소화하고, 데이터의 일관성과 무결성을 유지하기 위해 테이블 구조를 체계적으로 분해해 나가는 과정이다. 즉, 중복 데이터를 제거하고, 수정/삽입/삭제 시 이상 현상이 발생하지 않도록 테이블을 설계하는 기법 🎯 정규화의 목적목적설명중복 제거데이터를 효율적으로 저장하고 용량 낭비를 방지삽입 이상 방지일부 데이터만 입력할 때 생기는 문제 예방삭제 이상 방지일부 정보만 삭제하려다 관련된 다른 정보까지 날아가는 문제 예방수정 이상 방지중복 데이터 수정을 일일이 하지 않아도 되게끔데이터 무결성 방지논리적으로 일관성 있고, 오류 없는 데이터 관리 가능🔹 제1정규형 (1NF: First Normal Form)✔️ 속성의 원자성(Atomic..

CS/Database 2025.06.23

ERD (Entity Relationship Diagram)

🧩 ERD란? 엔티티와 속성들의 관계를 그림으로 나타낸 개체-관계 모델이다. 테이블과의 관계를 설명하는 다이어그램이며 이를 통해 데이터베이스의 구조를 한눈에 파악할 수 있다. 데이터베이스 구축 시 뼈대 역할을 하며 효율적인 API를 뽑아낼 수 있다. 🎨 ERD 구성 요소구성 요소설명DB 대응 요소예시 (학생 엔티티 기준)엔티티 (Entity)현실 세계에서 정의 가능한 사물이나 개념테이블학생 테이블속성 (Attribute)엔티티가 가지는 고유한 정보들컬럼학번, 이름, 주소, 전공도메인 (Domain)속성이 가질 수 있는 값의 범위 및 타입데이터 타입 + 제약 조건전공 → VARCHAR(30)🧾 Entity 분류 엔티티는 저장하는 데이터 정보 주제에 따라 종류가 다양하다. 엔티티 분류 구분을 잘 해주어..

CS/Database 2025.06.21

🗝️ Database Key

🗝️ Key키는 각 레코드(튜플)를 고유하게 식별하거나 릴레이션 간의 관계를 정의하는 기준이 되는 속성이다. 📘 데이터베이스 기본 용어 정리용어 쉽게 말하면 현실 비유 예시용어쉽게 말해서현실 비유예시릴레이션 (Relation)테이블(table)엑셀 시트 하나회원 정보, 상품 목록튜플 (Tuple)한 줄(row), 하나의 데이터 행한 사람의 이력서회원번호=001, 이름=말랑이속성 (Attribute)열(column), 필드항목 이름회원번호, 이름, 등급도메인 (Domain)속성이 가질 수 있는 값의 범위칸에 들어갈 수 있는 값의 종류등급 → 실버/골드/플래티넘레코드 (Record)= 튜플 (같은 의미, 용어만 다름)--📚 데이터 무결성 제약 조건✅ 개체 무결성 (Entity Integrity)기본키는..

CS/Database 2025.06.20

JPA Cache

⚡ 1차 캐시 JPA의 영속성 컨텍스트 (Entity Manager) 내부에 있는 메모리 저장소이다. 엔티티가 영속 상태가 되면 JPA는 이를 1차 캐시에 저장하고이후 동일한 ID로 조회되는 엔티티는 DB를 거치지 않고 메모리에서 바로 반환한다. ✔️ 1차 캐시에 엔티티가 있는 경우 조회 과정엔티티 조회1차 캐시에서 결과 반환Member m1 = em.find(Member.class, 1L); // → DB에서 조회, 1차 캐시에 저장Member m2 = em.find(Member.class, 1L); // → 1차 캐시에서 즉시 반환System.out.println(m1 == m2); // true (객체 동일성 보장) ✖️ 1차 캐시에 엔티티가 없는 경우 조회 과정엔티티 조회DB 조회1차 캐시에 결과..

CS/JPA 2025.06.17

N+1 문제

🔸 N+1 문제1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것ex) 1000개의 주문을 조회했을 때, 그 주문자를 찾기 위해 1000개의 멤버를 찾는 쿼리도 함께 발생예상했던 것보다 더 많은 쿼리가 진행되기 때문에 예상치 못한 큰 비용 발생// 예시 상황: 주문 1000건 조회List orders = orderRepository.findAll(); // 1번 쿼리for (Order order : orders) { System.out.println(order.getMember().getName()); // N번 쿼리 발생}위처럼 각 Order에 대해 Member를 접근하면 select member where id = ? 쿼리가 매번 발생 → N+1 쿼리 문제 🔹EAG..

CS/JPA 2025.06.12

Eager Loading / Lazy Loading

@ManyToOne 연관관계N: 1 관계이며, DB에서는 N쪽이 FK를 가진다.ex) Board(N) → Member(1) 관계에서 Board 테이블에 member_id FK가 존재JPA는 Member를 Board에서 참조(연관관계 주인) 하게 된다. @ManyToOne의 경우 FK쪽의 Entity를 가져올 때 PK쪽의 Entity도 같이 가져오게 된다. 실무에서는 서비스 규모가 대부분 크기 때문에 연관된 데이터를 한번에 가져오는 행동은 부담이 크다. 🔸 Fetch TypeJPA에서 연관된 엔티티를 조회할 때, 언제 데이터를 불러올지를 결정하는 전락(값)Fetch TypeEAGER(즉시 로딩) : 연관된 엔티티도 함께 즉시 조회(기본 값: @ManyToOne, @OneToOne)LAZY (지연 로딩)..

CS/JPA 2025.06.06

Persistence Context

🌿Persistence Context (영속성 컨텍스트)Entity의 영속화에 관여하며 Entity들이 DB로 바로 가지 않고 Entity를 저장하는 환경으로서의 역할을 한다. 영속성 컨텍스트는 논리적인 개념이며 EntityManager를 통해서 영속성 컨텍스트에 접근하게 된다. @Repositorypublic class MemberRepository { @PersistenceContext private EntityManager em; public Long save(Member member) { em.persist(member); // Entity 저장 return member.getId(); } public Member find(Long id) {..

CS/JPA 2025.06.06