Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions keyword/chapter00/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
- PK, FK란?
- **PK (Primary Key, 기본키): 테이블 내에서 각 행을 유일하게 식별할 수 있는 값**
- 중복 불가 (Unique)
- 빈 값 불가 (Not Null)
- **FK (Foreign Key, 외래키): 한 테이블의 필드 중 다른 테이블의 PK를 참조하는 값**
- 참조 무결성: FK는 반드시 참조하는 테이블에 실제로 존재하는 PK 값만 가질 수 있음
- 중복 가능
- ERD란?
- **ERD (Entity-Relationship Diagram): 데이터베이스의 설계도**
1. ERD의 세 가지 구성 요소
- **엔티티 (Entity)**: 관리하고자 하는 대상
- **속성 (Attribute):** 엔티티가 가진 정보
- **관계 (Relationship):** 엔티티 간의 연결 고리
- 연관관계란? 그리고 연관관계를 설정하는 방법은?
- **연관관계:** 두 개 이상의 테이블이 서로 논리적으로 연결되어 있는 상태
- **1:1 관계:** 하나의 데이터가 다른 하나와만 연결됨
- **1:N 관계:** 하나의 데이터가 여러 개의 데이터와 연결됨
- **N:M 관계:** 여러 데이터가 서로 여러 개씩 연결됨
- **연관관계 설정**
- 데이터 베이스 설계 시 핵심은 외래키(FK)를 어디에 두는가?
- 왜 연관관계를 설정하는가?
- 데이터 무결성: 존재하지 않는 정보를 입력하는 실수 방지
- 조인(JOIN)활용
- 관리 효율
- 정규화란?
- **정규화(Normalization):** 관계형 데이터베이스 설계에서 중복을 최소화하고 데이터 무결성을 유지하기 위해 데이터를 구조화하는 프로세스
- 왜 하는가?
- 삽입 이상, 갱신 이상, 삭제 이상을 방지하기 위해
- 단계
1. **제1정규화 (1NF): 원자값 확보**
- 각 컬럼은 하나의 값만 가져야 한다
2. **제2정규화 (2NF): 부분 함수 종속 제거**
- 기본키 (PK)가 여러 컬럼의 조합일 때, PK의 일부에만 종속되는 컬럼을 분리
3. **제3정규화 (3NF): 이행적 함수 종속 제거**
- 기본키가 아닌 컬럼들끼리 서로 종속되는 관계를 분리
- 정규화의 장단점
- 장: 데이터 중복 감소, 무결성 유지
- 단: 조인(JOIN) 증가, 설계 복잡도 상승
- 반 정규화란?
- **반정규화(Denormalization):** 정규화된 데이터베이스에서 성능 향상을 위해 의도적으로 중복을 허용하거나 테이블을 합치는 과정
- 왜 하는가?
- 조회 속도 향상, 쿼리 단순화, 시스템 부하 감소
- 반정규화 기법
1. 테이블 통합 (Table Merge)
- 1:1 관계나 1:N 관계인 테이블을 하나로 합침
2. 테이블 분할 (Table Partitioning)
- 수직 분할: 한 테이블에 컬럼이 너무 많을 때, 자주 쓰는 컬럼과 안 쓰는 컬럼을 나눔
- 수평 분할: 행이 너무 많을 때 기간이나 지역별로 테이블을 쪼갬
3. 중복 컬럼 추가 (Duplicate Column)
- 조인을 피하기 위해 다른 테이블의 컬럼을 복사
4. 파생 컬럼 추가 (Derived Column)
- 계산이 필요한 값을 미리 구해서 저장
- DB에서의 상속 관계 표현은 어떻게 하는가?
1. 조인 전략 (Joined Strategy)
- 각 엔티티를 모두 개별 테이블로 만들고, 자식 테이블이 부모 테이블의 PK를 받아와서 PK이자 FK로 사용
- 장점: 테이블이 정규화되어 있고, 저장 공간을 효율적으로 사용
- 단점: 데이터를 조회할 때 JOIN이 많이 발생하여 쿼리가 복잡해지고 성능이 저하
2. 단일 테이블 전략 (Singly Table Strategy)
- 서비스 규모가 작을 때 많이 사용하며, 모든 자식 엔티티의 속성을 하나의 커다란 테이블에 다 몰아넣는 방식
- 장점: JOIN이 필요 없어서 조회 성능이 가장 빠르고 쿼리가 단순
- 단점: 자식 엔티티가 가진 특성 속성 외의 컬럼들은 모두 NULL을 허용해야하며, 테이블이 너무 커질 수 있음
3. 구현 클래스마다 테이블 전략 (Table-per-class Strategy)
- 부모 테이블 없이, 자식 엔티티마다 독립적인 테이블을 만드는 방식. 각 테이블은 부모의 공통 속성까지 모두 가지고 있음
- 장점: 특정 자식 데이터를 조회할 때 성능이 좋음
- 단점: 여러 자식 테이블을 한꺼번에 조회할 때 UNOIN을 써야 해서 매우 느려지며, 데이터 관리가 어려움.
- 인덱스란?
- 인덱스(Index): 방대한 양의 데이터 속에서 특정 데이터를 빠르게 찾기 위해, 데이터의 주소값을 미리 정해두는 별도의 정보 공간
- 장점: 조회 속도(SELECT) 향상, 시스템 부하 감소
- 추가 저장 공간 필요, 수정 속도(INSERT/UPDATE/DELETE) 저하
26 changes: 26 additions & 0 deletions keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
- DB Join이란?
- **DB Join:** 두 개 이상의 테이블을 서로 연결하여 하나의 결과 집합으로 만드는 연산.
- Join 종류들
- **Inner Join:** 양쪽 테이블 모두에 매칭되는 데이터가 있는 행만 반환
- **Left (Outer) Join:** 왼쪽 테이블의 모든 행과, 오른쪽 테이블에서 매칭되는 행을 반환
- **Right (Outer) Join:** 오른쪽 테이블의 모든 행과, 왼쪽 테이블에서 매칭되는 행을 반환
- **Full (Outer) Join:** 양쪽 테이블 중 어느 한쪽에라도 데이터가 있으면 모든 행을 반환
- **Cross Join:** 두 테이블의 모든 행을 서로 한 번씩 다 연결
- 트랜잭션이란?
- **트랜잭션(Transaction):** 하나의 논리적 기능을 수행하기 위한 작업의 단위
- **원자성(Atomicity):** 트랜잭션 내의 모든 연산은 반드시 전체가 성공하거나, 전체가 취소 (All or Nothing)
- **일관성 (Consistency):** 트랜잭션이 성공적으로 완료되면 데이터베이스는 언제나 일관된 상태를 유지
- **격리성 (Isolation):** 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 결과를 방해할 수 없음
- **지속성 (Durability):** 성공적으로 완료된 트랜잭션의 결과는 시스템 장애가 발생하더라도 영구적으로 반영
- 트랜잭션 제어어 (TCL)
- **Commit:** 모든 작업이 정상적으로 처리되었다고 확정하는 명령어. 이 명령을 실행해야 DB에 영구 저장
- **Rollback:** 작업 중 오류가 발생했을 때, 지금까지 한 모든 작업을 취소하고 트랜잭션 시작 전 상태로 돌리는 명령어
- **Savepoint:** 트랜잭션 내에 ‘책갈피’를 만드는 것. 전체 롤백 대신 특정 지점까지만 되돌릴 수 있게 해줌
- Join on 과 where의 차이점
- 모두 데이터를 필터링하는 역할을 하지만 “언제 필터링을 하느냐”의 시점에서 큰 차이가 발생
1. On 절 (Join 전 필터링)
- 두 테이블을 연결하기 전에 조건을 확인
- Outer Join 시 특징: On 절에 조건을 추가하면, 그 조건에 맞는 데이터만 연결. 하지만 기준이 되는 테이블( Left Join의 경우 왼쪽 테이블)의 행은 필터링되지 않고 그대로 남으며, 연결되지 않은 부분만 NULL로 채워짐
2. Where 절 (Join 후 필터링)
- Join이 완료된 결과 집합을 대상으로 조건에 맞지 않는 행을 아예 삭제함
- Outer Join 시 특징: Where 절에 오른쪽 테이블의 컬럼에 대한 조건을 걸면, On 절에 의해 생성된 NULL 값들이 필터링 과정에서 제거됨. 결과적으로 Inner Join과 동일한 결과가 나올 수 있어서 주의가 필요
35 changes: 35 additions & 0 deletions mission/chapter00/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
### 워크북 캡쳐
유리->에반

![0주차.png](../../../../%EC%9B%8C%ED%81%AC%EB%B6%81%20%EB%A6%AC%EB%B7%B0/0%EC%A3%BC%EC%B0%A8.png)

### 워크북 리뷰

<aside>
🌟

정규화 과정을 단순히 말로만 표현 한 것이 아니라 before→after 표로 배치하여 한눈에 이해하기 쉽게 설명해 놓으셨고 화살표 다이어그램을 활용하여 데이터 간의 관계를 시각적으로 잘 들어왔다.

</aside>

### 미션 기록
![erd.png](../../../../%EC%9B%8C%ED%81%AC%EB%B6%81%20%EB%A6%AC%EB%B7%B0/erd.png)

### **1. 사용자 중심의 확장형 설계**

모든 기능의 중심인 **사용자(Member)** 테이블을 정중앙에 배치하고, 사용자가 하는 여러 활동을 효율적으로 관리하도록 설계

- **약관 및 선호 음식 (N:M 관계)**: 사용자가 여러 약관에 동의하거나 여러 음식을 좋아할 수 있으므로, 중간에 **매핑 테이블**을 두어 데이터가 꼬이지 않게 만듦.
- **리뷰 및 사진 (1:N 관계)**: 한 개의 리뷰에 여러 장의 사진을 올릴 수 있도록 테이블을 분리하여 '리뷰 사진' 테이블과 연결.

### **2. 지역 기반 미션 시스템**

홈 화면에서 '안암동' 같은 지역별 미션을 보여주기 위한 구조입니다.

- **지역 → 가게 → 미션**: 지역 아래에 여러 가게가 있고, 각 가게는 여러 미션을 내걸 수 있는 계층 구조로 설계.
- **미션 수행 기록**: 사용자가 어떤 미션을 '진행 중'인지 '성공'했는지 상태를 체크할 수 있도록 별도의 수행 기록 테이블을 만듦

### **3. 포인트 및 상태 관리**

- **포인트**: 사용자 테이블에 포인트 컬럼을 두어 미션 성공 시 즉시 반영.
- **상태 값**: 계정의 활성화 상태나 미션의 완료 여부를 enum이나 bit 타입을 사용해 명확히 구분
52 changes: 52 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
### 워크북 캡쳐

유리 -> 에반
![1주차.png](../../../../%EC%9B%8C%ED%81%AC%EB%B6%81%20%EB%A6%AC%EB%B7%B0/1%EC%A3%BC%EC%B0%A8.png)

### 워크북 리뷰
트랜잭션의 4가지 특징에 대해서 잘 정리하였고 COMMIT이랑 ROLLBACK을 딱 대비시켜서 정리해 주시니까 두 개념 차이가 명확하게 잘 보여요!

### 미션
1. INSERT INTO review (member_id, store_id, score, content, created_at, updated_at)
VALUES (1, 101, 5.0, '음 너무 맛있어요 포인트도 얻고 맛있는 맛집도 알게 된 것 같아 너무나도 행복한 식사였답니다. 다음에 또 올게요!!', NOW(), NOW());

2. SELECT name, email, phone_number, point
FROM member
WHERE member_id = 1;

3. SELECT m.reward_point, [s.name](http://s.name/) AS store_name, m.conditional, mm.status, mm.created_at
FROM member_mission mm
JOIN mission m ON mm.mission_id = m.mission_id
JOIN store s ON m.store_id = s.store_id
WHERE mm.member_id = 1
AND mm.status IN ('CHALLENGING', 'COMPLETE')
ORDER BY mm.created_at DESC
LIMIT 10 OFFSET 0;

4. <유저 미션 현황>

SELECT

COUNT(CASE WHEN mm.is_complete = 1 THEN 1 END) AS complete_count,

COUNT(*) AS total_attempt_count

FROM member_mission mm

WHERE mm.member_id = 1;

---

<도전 가능한 미션 목록>

SELECT m.mission_id, m.store_id, m.point, m.conditional, m.deadline, m.created_at
FROM mission m
WHERE m.mission_id NOT IN (
SELECT mission_id
FROM member_mission
WHERE member_id = 1
)
ORDER BY m.created_at DESC
LIMIT 10 OFFSET 0;