20240216

귤금·2024년 2월 16일

Node.js 4기 TIL

목록 보기
37/86

Today?

Node.js 심화주차 1주차

객체 지향 프로그래밍의 핵심 원칙

  1. 캡슐화(Encapsulation)
    • 객체 내부의 세부적인 사항을 감추는 것, 즉 중요한 정보를 외부로 노출시키지 않도록 만드는 것
    • 자바스크립트는 완벽한 캡슐화를 지원하지 않음...
TYPESCRIPT 예제

/** Encapsulation **/
class User {
  private name: string; // name 변수를 외부에서 접근을 할 수 없게 만듭니다.
  private age: number; // age 변수를 외부에서 접근을 할 수 없게 만듭니다.

  setName(name: string) { // Private 속성을 가진 name 변수의 값을 변경합니다.
    this.name = name;
  }
  getName() { // Private 속성을 가진 name 변수의 값을 조회합니다.
    return this.name;
  }
  setAge(age: number) { // Private 속성을 가진 age 변수의 값을 변경합니다.
    this.age = age;
  }
  getAge() { // Private 속성을 가진 age 변수의 값을 조회합니다.
    return this.age;
  }
}

const user = new User(); // user 인스턴스 생성
user.setName('이용우');
user.setAge(30);
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 30
console.log(user.name); // Error: User 클래스의 name 변수는 private로 설정되어 있어 바로 접근할 수 없습니다.

private라는 접근 제한자(Access modifier) 사용

접근 제한자?

타입스크립트에는 접근 제한자(Access modifier)인 public, protected, private를 지원

반대는 public

어디에서나 접근할 수 있으며 생략 가능한 default 값

class Hello {
  name: string

  constructor(name: string) {
    this.name = name
  }

  // public 생략 가능
  public greet() {
    console.log(`hi! ${this.name}`)
  }
}

const hello = new Hello('kmj')
hello.greet() // output: 'hi! kmj'
name을 선언해주기 위해서 꽤나 많은 양의 코드를 작성해야 하는데, 이를 constructor에서 한 번에 선언할 수 있다.

class Hello {
  constructor(public name: string) {}
  // 생략
}

아키텍처 패턴 (Architecture Pattern)

소프트웨어의 구조를 구성하기위한 가장 기본적인 토대를 제시
각각의 시스템들과 그 역할이 정의되어 있고, 여러 시스템 사이의 관계와 규칙 등이 포함

MVC 패턴(Model View Controller Pattern)
출처: https://developer.mozilla.org


📒 3-Layered Architecture (3계층 아키텍처)

주로 아래의 3가지 계층으로 구성됨

  1. 컨트롤러(Controller) : 어플리케이션의 가장 바깥 부분, 요청/응답을 처리
    • 클라이언트의 요청(Request)을 수신 한 후 서버에서 처리된 결과반환(Response)해주는 역할을 담당
  2. 서비스(Service) : 어플리케이션의 중간 부분, API의 핵심적인 동작이 많이 일어나는 부분
    • 아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분
  3. 저장소(Repository) : 어플리케이션의 가장 안쪽 부분, 데이터베이스와 맞닿아 있음.
    • 실제 데이터베이스와 통신하는 계층

📌 3-Layered Architecture 로직 수행 플로우

1️⃣  클라이언트(Client)가 어플리케이션에 요청(Request)

2️⃣  요청(Request)을 URL에 알맞은 컨트롤러(Controller)가 수신

3️⃣  컨트롤러(Controller)요청처리하기 위해 서비스(Service)를 호출

4️⃣  서비스(Service)는 필요한 데이터를 가져오기 위해 저장소(Repository)에게 데이터를 요청

5️⃣  서비스(Service)저장소(Repository)에서 가져온 데이터를 가공하여 컨트롤러(Controller)에게 데이터를 전달

6️⃣  컨트롤러(Controller)서비스(Service)결과물(Response)클라이언트(Client)에게 전달

서버에서의 처리과정이 대부분 유사하다! 이를 Controller, Service, Repository 라는 3개의 계층으로 분리

  • 컨트롤러

    • 클라이언트의 요청(Request) 수신
    • 요청에 대한 처리는 서비스에게 위임
    • 클라이언트에게 응답(Response)을 반환
  • 서비스

    • 사용자의 요구사항을 처리하는 실세 중에 실세!!!
    • 현업에서는 서비스 코드가 계속 확장되는 문제가 발생할 수 있음
    • DB 정보가 필요할 때는 Repository에게 요청
  • 저장소(레포지토리)

    • 데이터베이스 관리 (연결, 해제, 자원 관리) 역할을 담당
    • 데이터베이스의 CRUD 작업을 처리

개인과제 세팅

기존 프로젝트 복사 후 강의를 보면서 리팩토링을 하기 시작했다. 일단 구조를 변경하기 위해 컨트롤러 폴더와 레포지토리, 서비스 폴더를 생성했다.
prisma 대신 TypeORM으로 변경하는 작업을 위해 필요한 패키지와 드라이브를 설치했다.

typeorm reflect-metadata mysql2 //mysql을 사용할 예정..

회고

0개의 댓글