본문 바로가기

Coding/내일배움캠프

[내일배움캠프] RDB N:M 관계에 대한 이해, 3-Layered Architecture에 대한 이해 | Node.js 4기 TIL | Day 53 | 24.02.26.(월)

git checkout vs git switch

 

기능 git checkout git switch
브랜치 전환 가능 가능
작업 트리 변경 가능 가능
HEAD 위치 변경 기본적으로 브랜치 끝으로 이동 옵션에 따라 다름 (기본값, 브랜치 , —detach 옵션: HEAD 분리)
스테이징 영역 변경 가능 가능
로컬 변경 사항 손실 가능성 있음 (옵션에 따라 다름) 없음 (옵션에 관계없이 항상 로컬 변동 사항 보존)
옵션 다양 상대적으로 적음

 

* Generated by GEMINI

 

브랜치 끝이란 무엇일까요?

 

간단히 말하면, 브랜치 끝은 Git 브랜치에서 가장 최근 커밋이 있는 지점을 의미합니다. 즉, 브랜치에 추가된 모든 변경 사항이 포함된 지점입니다.

 

좀 더 자세히 설명하자면:

 

  • Git 브랜치는 마치 시간 여행을 하는 것과 같습니다. 각 브랜치는 특정 시점의 프로젝트 상태를 나타냅니다.
  • 브랜치 끝은 마치 시간 여행의 끝과 같습니다. 현재 브랜치에서 가장 최근에 도착한 시점입니다.
  • 브랜치 끝은 HEAD라는 특별한 포인터로 표시됩니다. HEAD 항상 현재 브랜치의 끝을 가리킵니다.

async (req, res) vs async (req, res, next)

 

async (req, res) async (req, res, next) Express.js 라우터 핸들러에서 비동기 처리를 가능하게 하는 사용된다. 하지만 작동 방식과 용도에 있어 미묘하지만 중요한 차이점이 존재한다.

 

1. next 매개변수의 역할

 

- async (req, res) : next 매개변수를 사용하지 않는다. 이 핸들러에서 발생하는 에러는 자동으로 다음 미들웨어로 전달되지 않는다.

- async (req, res, next) : next 매개변수를 사용하여 에러를 다음 미들웨어로 전달하거나 라우터 핸들러 체인을 중단할 수 있다.

 

2. 에러 처리

 

- async (req, res) : 핸들로 내부에서 발생하는 에러는 직접 처리해야 한다. 일반적으로 try-catch 블록을 사용하여 에러를 감지하고 적절하게 응답을 보낸다. 하지만 에러 처리 코드가 핸들러 로직에 섞여 가독성을 떨어뜨릴 수 있다.

- async (req, res, next) : next(err)를 사용하여 에러를 다음 미들웨어로 전달할 수 있다. 에러 처리 코드를 분리하여 코드 가독성을 높이고, 에러 처리 로직을 중앙에 집중 관리할 수 있다.

 

3. 미들웨어 체인

 

- async (req, res) : 핸들러가 항상 응답을 완료해야 한다. 즉, 핸들러 내부에서 다른 미들웨어를 실행하거나 라우터 체인을 조작할 수 없다.

- async (req, res, next) : next() 함수를 호출하여 다음 미들웨어로 제어를 전달할 수 있다. 라우터 체인을 자유롭게 조작하고 다양한 기능을 구현할 수 있다.

 

4. 결론

 

- async (req, res) : 간단한 비동기 처리에 적합

- async (req, res, next) : 에러 처리, 라우터 체인 조작, 코드 재사용 등에 유용

 

3-Layered Architecture

 

Controller

 

- 주요 역할

   - 비즈니스 로직을 구현한다.

   - Repository Layer와 상호 작용하여 데이터를 처리한다.

   - 여러 Repository 레이어를 통합하여 복잡한 비즈니스 로직을 수행한다.

- 핵심 기능

   - 데이터 검증 및 변환을 수행한다.

   - 비즈니스 규칙을 적용한다.

   - 여러 데이터 소스를 통합한다.

   - 트랜잭션 관리를 수행한다.

 

Service

 

- 주요 역할

   - 비즈니스 로직을 구현한다.

   - Repository Layer와 상호 작용하여 데이터를 처리한다.

   - 여러 Repository 레이어를 통합하여 복잡한 비즈니스 로직을 수행한다.

- 핵심 기능

   - 데이터 검증 및 변환을 수행한다.

   - 비즈니스 규칙을 적용한다.

   - 여러 데이터 소스를 통합한다.

   - 트랜잭션 관리를 수행한다.

 

Repository

 

- 주요 역할

   - 데이터베이스와 상호 작용하여 데이터를 추가, 조회, 수정, 삭제한다.

   - SQL 쿼리를 작성하고 실행한다.

   - 데이터베이스 쿼리를 최적화한다.

   - 데이터 접근 권한을 제어한다.

 

RDB의 1:N 관계

 

orderdetail에서는 전체에 대해서만 구분한다 주문됐냐? 배달 시작했냐? 등등

order에서는 메뉴 하나에서 등등 ..

 

1. 1:N 관계 정의

 

1.1 개념

RDB에서 1:N 관계는 하나의 테이블(부모 테이블)의 레코드가 다른 테이블(자식 테이블)의 여러 레코드와 연결되는 관계를 의미합니다. 부모 테이블의 하나의 레코드는 자식 테이블의 0개 이상의 레코드와 연결될 수 있지만, 자식 테이블의 하나의 레코드는 반드시 부모 테이블의 하나의 레코드와 연결되어야 합니다.

 

1.2 비유

1:N 관계는 현실 세계의 다양한 상황을 비유하는 데 사용됩니다. 예를 들어:

  • 학교: 한 명의 선생님은 여러 명의 학생을 가르칠 수 있습니다. (선생님: 학생 = 1:N)
  • 회사: 한 명의 부서장은 여러 명의 직원을 관리할 수 있습니다. (부서장: 직원 = 1:N)
  • 도서관: 한 권의 책은 여러 명의 독자가 빌릴 수 있습니다. (책: 독자 = 1:N)

2. 1:N 관계의 특징

 

2.1 주요 특징

  • 참조 무결성: 자식 테이블의 외래 키 값은 항상 부모 테이블의 주 키 값과 일치해야 합니다.
  • 부모 테이블 삭제: 부모 테이블의 레코드가 삭제되면 해당 레코드와 연결된 자식 테이블의 모든 레코드도 함께 삭제됩니다.
  • 자식 테이블 삭제: 자식 테이블의 레코드가 삭제되더라도 부모 테이블의 레코드는 영향을 받지 않습니다.

2.2 추가 특징

  • 부모 테이블의 역할: 부모 테이블은 자식 테이블에 대한 정보를 제공하는 역할을 합니다.
  • 자식 테이블의 역할: 자식 테이블은 부모 테이블에 대한 상세 정보를 제공하는 역할을 합니다.

3. 1:N 관계 구현

 

3.1 테이블 설계

1:N 관계를 구현하기 위해서는 두 개의 테이블을 설계해야 합니다.

  • 부모 테이블: 부모 테이블은 1:N 관계에서 "1"에 해당하는 테이블입니다. 부모 테이블은 주 키를 가지고 있어야 합니다.
  • 자식 테이블: 자식 테이블은 1:N 관계에서 "N"에 해당하는 테이블입니다. 자식 테이블은 외래 키를 가지고 있어야 합니다.

3.2 외래 키

 

3.2.1 정의

자식 테이블은 부모 테이블과의 관계를 나타내는 외래 키를 가지고 있습니다. 외래 키는 부모 테이블의 주 키와 일치하는 값을 가지고 있어야 합니다.

 

3.2.2 종류

  • 필수 외래 키: 자식 테이블의 모든 레코드는 반드시 부모 테이블의 주 키 값과 일치하는 외래 키 값을 가지고 있어야 합니다.
  • 선택적 외래 키: 자식 테이블의 일부 레코드는 부모 테이블의 주 키 값과 일치하지 않아도 됩니다. 이 경우, 외래 키 값이 NULL일 수 있습니다.

 

* Generated by GEMINI

 

RDB의 N:M 관계

 

1. N:M 관계 정의

 

1.1 개념

RDB에서 N:M 관계는 두 테이블 사이에서 다대다 관계를 나타냅니다. 즉, 한 테이블의 하나의 레코드는 다른 테이블의 여러 레코드와 연결될 수 있으며, 반대로 다른 테이블의 하나의 레코드도 첫 번째 테이블의 여러 레코드와 연결될 수 있습니다.

 

1.2 비유

N:M 관계는 현실 세계의 다양한 상황을 비유하는 데 사용됩니다. 예를 들어:

  • 학생과 수업: 한 명의 학생은 여러 수업을 수강할 수 있으며, 한 수업은 여러 학생이 수강할 수 있습니다.
  • 영화와 배우: 한 영화는 여러 배우가 출연할 수 있으며, 한 배우는 여러 영화에 출연할 수 있습니다.
  • 사람과 취미: 한 사람은 여러 가지 취미를 가질 수 있으며, 한 가지 취미는 여러 사람이 가질 수 있습니다.

2. N:M 관계의 특징

 

2.1 주요 특징

  • 참조 무결성: N:M 관계는 직접적으로 구현되지 않습니다. 대신, 연결 테이블이라는 중간 테이블을 사용하여 구현됩니다. 연결 테이블은 두 테이블의 주 키를 외래 키로 가지고 있습니다.
  • 데이터 중복: N:M 관계는 데이터 중복을 발생시킬 수 있습니다. 예를 들어, 학생과 수업 관계에서 학생 정보는 학생 테이블과 수강 테이블에 모두 저장됩니다.

2.2 추가 특징

  • 다대다 관계의 표현: ERD(Entity Relationship Diagram)에서 N:M 관계는 다이아몬드 모양으로 표현됩니다.
  • 연결 테이블의 역할: 연결 테이블은 두 테이블 간의 관계에 대한 추가 정보를 저장하는 데 사용될 수 있습니다.

3. N:M 관계 구현

 

3.1 테이블 설계

N:M 관계를 구현하기 위해서는 다음과 같은 세 개의 테이블이 필요합니다.

  • 두 개의 주 테이블: N:M 관계에 참여하는 두 테이블입니다. 각 테이블은 각각의 엔터티를 나타내는 주 키를 가지고 있어야 합니다.
  • 연결 테이블: 두 주 테이블의 주 키를 외래 키로 가지고 있는 중간 테이블입니다. 연결 테이블은 두 테이블 간의 관계를 나타냅니다.

3.2 연결 테이블

  • 구성: 연결 테이블은 두 주 테이블의 주 키를 외래 키로 가지고 있으며, 추가적인 속성을 가질 수도 있습니다.
  • 주 키: 연결 테이블은 일반적으로 두 외래 키를 조합한 복합 주 키를 가지고 있습니다.
  • 참조 무결성: 연결 테이블의 외래 키는 항상 두 주 테이블의 주 키 값과 일치해야 합니다.

 

* Generated by GEMINI

 

 

order는 status만 알 수 있다.

detail은 각각에 대해서만 알 수 있다.

id orderId 연결하여 타고타고 이동해서 다른 테이블에 접근하여 값을 파악한다.

 

3계층 api URL 설정!

 

  • app.js에서 1차 라우팅 설정

- routes/index.js에서 2차 라우팅 설정

- menus.router.js에서 3차 라우팅 설정

- restaurant.router.js에서 3차 라우팅 설정

- users.router.js에서 3차 라우팅 설정

 

api/menu - 2차

Api/menu/menuId - 3차

 

 

CRUD … POST/GET/PATCH/DELETE

굳이 api URL로 해줄 필요 없다 ~ …

 

3차에서 가공 모듈 함수로 넘어가면 된다.