From 8090f572dce713b053bc91e72d23737604f64a8e Mon Sep 17 00:00:00 2001 From: Kohseoyoung Date: Wed, 18 Mar 2026 17:33:18 +0900 Subject: [PATCH 1/4] =?UTF-8?q?keyword:=200=EC=A3=BC=EC=B0=A8=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter00/keyword.md | 69 ++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 keyword/chapter00/keyword.md diff --git a/keyword/chapter00/keyword.md b/keyword/chapter00/keyword.md new file mode 100644 index 0000000..da30e0c --- /dev/null +++ b/keyword/chapter00/keyword.md @@ -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) 저하 \ No newline at end of file From dcbd8efb10f874fba714ad11e184301f8d9f08a9 Mon Sep 17 00:00:00 2001 From: Kohseoyoung Date: Wed, 18 Mar 2026 17:39:10 +0900 Subject: [PATCH 2/4] =?UTF-8?q?mission:0=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter00/mission.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 mission/chapter00/mission.md diff --git a/mission/chapter00/mission.md b/mission/chapter00/mission.md new file mode 100644 index 0000000..c101f1e --- /dev/null +++ b/mission/chapter00/mission.md @@ -0,0 +1,33 @@ +### 워크북 캡쳐 +![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) + +### 워크북 리뷰 + + + +### 미션 기록 +![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 타입을 사용해 명확히 구분 \ No newline at end of file From 496ec3737d4e9768f2aba8bb0ce236b11d22305f Mon Sep 17 00:00:00 2001 From: Kohseoyoung Date: Wed, 18 Mar 2026 18:02:43 +0900 Subject: [PATCH 3/4] =?UTF-8?q?keyword,=20mission:=201=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=20=ED=82=A4=EC=9B=8C=EB=93=9C,=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter01/keyword.md | 26 +++++++++++++++++++ mission/chapter01/mission.md | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 keyword/chapter01/keyword.md create mode 100644 mission/chapter01/mission.md diff --git a/keyword/chapter01/keyword.md b/keyword/chapter01/keyword.md new file mode 100644 index 0000000..5c7c319 --- /dev/null +++ b/keyword/chapter01/keyword.md @@ -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과 동일한 결과가 나올 수 있어서 주의가 필요 \ No newline at end of file diff --git a/mission/chapter01/mission.md b/mission/chapter01/mission.md new file mode 100644 index 0000000..dc81dec --- /dev/null +++ b/mission/chapter01/mission.md @@ -0,0 +1,50 @@ +### 워크북 캡쳐 + + +### 워크북 리뷰 + + +### 미션 +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; + + From 7ede6b542eb6a8cee659bcc68c09360c80f32a7b Mon Sep 17 00:00:00 2001 From: Kohseoyoung Date: Wed, 18 Mar 2026 22:54:52 +0900 Subject: [PATCH 4/4] =?UTF-8?q?mission:=200,1=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=EB=B6=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter00/mission.md | 4 +++- mission/chapter01/mission.md | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mission/chapter00/mission.md b/mission/chapter00/mission.md index c101f1e..eba323b 100644 --- a/mission/chapter00/mission.md +++ b/mission/chapter00/mission.md @@ -1,4 +1,6 @@ -### 워크북 캡쳐 +### 워크북 캡쳐 +유리->에반 + ![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) ### 워크북 리뷰 diff --git a/mission/chapter01/mission.md b/mission/chapter01/mission.md index dc81dec..3219fa0 100644 --- a/mission/chapter01/mission.md +++ b/mission/chapter01/mission.md @@ -1,8 +1,10 @@ -### 워크북 캡쳐 +### 워크북 캡쳐 +유리 -> 에반 +![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)