본문 바로가기

Coding/내일배움캠프

[내일배움캠프] 타입스크립트 개인 과제 1일차 | Node.js 4기 | Day 63 | 24.03.07.(목)

필수 기능 구현 리스트

  • 로그인/회원가입
  • 프로필 보기
  • 새 공연 등록
  • 공연 목록 보기
  • 공연 검색하기
  • 공연 상세보기
  • 좌석을 지정하지 않고 공연 예매하기

🏆 보너스 기능 구현 리스트

  • 공연의 좌석 예매 정보 확인하기
  • 좌석을 지정하여 예매하기
  • 동시성 처리하기 (이미 선택한 좌석입니다!)
  • 예매 취소하기
  • 테스트 코드 내용 채우기

💵 결제 관련 규칙

  1. 결제 관련된 기능은 구현하지 않습니다.
  2. 사용자는 가입시 100만 포인트를 지급받습니다.
  3. 공연을 예매할 때 1석에 최대 5만 포인트까지를 상한 금액으로 정하도록 하겠습니다.
  4. 사용자의 보유 포인트가 모자라는 경우 예매를 할 수 없습니다.
  5. 예매 취소 기능을 구현한 경우 지불한 포인트는 환불되어야 합니다.

🚨 주의사항

  • 필수 기능 구현 리스트는 전부 구현을 해주세요!
  • 서비스를 개발하면서 타입스크립트의 특징을 최대한 활용해 보세요!
  • 모든 데이터 구조와 함수에는 적절한 타입 정의를 적용하셔야 하는 것을 잊지 마세요.
  • 에러 처리는 적절하게 하도록 하세요!

📅 날짜별 기능 구현 요구 사항

03월 07일 (목)

프로젝트 세팅, ERD / API 설계, 웹 서버 구동하기

로그인 / 회원가입, 프로필 기능 구현

  • 로그인/회원가입 API
  • 프로필 API

새 공연 등록 기능 및 공연 목록 보기, 공연 검색하기, 공연 상세보기 기능 구현

  • 공연 등록 API
  • 공연 조회 API
  • 공연 검색 API
  • 공연 상세보기 API

03월 08일 (금)

좌석을 지정하지 않고 공연 예매, 예매 목록 확인 기능 구현

  • 좌석을 지정하지 않고 공연 예매하기 API
  • 예매 목록 확인 API

공연의 좌석 예매 정보 확인, 좌석 지정 예매, 동시성 처리 기능 구현 (보너스 기능)

  • 공연의 좌석 예매 정보 확인 API
  • 좌석을 지정하여 예매하기 API

03월 09일 (토)

공연의 좌석 예매 정보 확인, 좌석 지정 예매, 동시성 처리 기능 구현 (보너스 기능)

  • 동시성 처리

예매 취소 기능 구현 및 전체 서비스 테스트 (보너스 기능)

  • 예매 취소 API
  • 전체 서비스 테스트

03월 10일 (일)

예매 취소 기능 구현 및 전체 서비스 테스트 (보너스 기능)

  • 전체 서비스 테스트

03월 11일 (월)

03월 12일 (화)

03월 13일 (수) - 조기 제출

03월 14일(목) - 제출

모델링

사용자

  • id
    • dataType : int
  • email
    • dataType : varchar
  • userName
    • dataType : varchar
  • password
    • dataType : varchar

공연

  • id
    • dataType : int
  • concertName
    • dataType : varchar
  • date
    • dataType : varchar
  • time
    • dataType : varchar
      • varchar .. string으로 받아와서 파싱해주는 무언가가 필요할 듯?
      • 또는 받아올 때 다른 무언가를 사용해서 바로 처리될 수 있도록 작성할 것
  • detail
    • dataType : varchar

포인트

  • id
    • dataType : int
  • reservationId
    • dataType : int
  • userId
    • dataType : int
  • point
    • dataType : bigInt
  • paymentHistory
    • text
      • text와 string과 varchar의 차이에 대해 이해할 필요가 있겠다.
  • createdAt
    • dataType : datetime

사용자, 공연, 포인트 테이블을 생성했다.

 

 

각 테이블 간의 관계를 어떻게 지정해줘야 할까?

  • 사용자는 여러 콘서트를 예매할 수 있다.
  • 콘서트는 여러 사용자를 받아야 하나?
    • 굳이 필요 없을 것 같다.
    • 다만, 예약 가능 인원 수를 지정해두고 예약 가능 인원이 가득 찬 경우 예매가 불가능하도록 하는 기능 구현이 필요하다. → Concert는 최대로 예약 가능한 인원을 저장하는 maxReservation을 갖고 있어야 한다. ERD 수정해주도록 한다.

 

  • 최대 예약 가능한 인원 수를 담는 변수인 maxReservation과 현재 예약한 인원 수를 담는 변수인 currentReservation을 Concert 테이블에 추가해주었다.

다시 각 테이블 간의 관계에 대해 생각해보자.

  • 사용자는 여러 콘서트를 예매할 수 있다.
  • 사용자가 예매할 때, 예매하는 콘서트 테이블에 접근하여 currentReservation의 값을 하나 증가시켜주는 코드를 작성해야 한다.
  • 사용자가 예매를 취소할 때, 예매하는 콘서트 테이블에 접근하여 currentReservation의 값을 하나 감소시켜주는 코드를 작성해야 한다.

콘서트 예약 정보를 담는 테이블이 필요하다. RESERVATION 테이블을 추가로 작성해주었다.

 

 

  • 한 사용자는 여러 콘서트를 예매할 수 있고, 여러 사용자가 한 콘서트를 예매할 수도 있다.

이런 경우 연결용 엔티티를 작성해주도록 한다.

 

 

  • 한 사용자는 여러 예약 정보를 가질 수 있지만, 콘서트가 여러 예약 정보를 가질 필요는 없다.
  • 콘서트가 예약자 리스트를 갖게 된다면 콘서트→사용자→예약으로 타고타고 넘어갈 수 있기 때문에?
  • 근데 일단 연결해두는 게 더 깔끔할 거 같은데?

 

24.03.07.(목) 13:39 | 일단 1차 ERD 완성, 필요하면 추후 수정 예정

 

ERD

 

https://www.erdcloud.com/d/jKb7n7ztfJ3qLoYgy

 

onlineConcertTicketingService

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

API 명세서

 

 

프로젝트 세팅

lol-fan-community 프로젝트 세팅 명령어

npm i @nestjs/config @nestjs/jwt @nestjs/passport passport passport-jwt
@types/passport-jwt typeorm @nestjs/typeorm mysql2 multer bcrypt
@types/bcrypt class-validator class-transformer multer
@types/multer papaparse @types/papaparse joi typeorm-naming-strategies
lodash @types/lodash
설치 명령어에 포함된 패키지 설명

1. NestJS 관련 패키지

- @nestjs/config
: 환경 설정을 관리하는 패키지입니다.
- @nestjs/jwt
: JSON Web Token(JWT) 기반 인증을 지원하는 패키지입니다.
- @nestjs/passport
: Passport.js와 통합하여 다양한 인증 전략을 제공하는 패키지입니다.
- @nestjs/typeorm
: TypeORM과 통합하여 데이터베이스 액세스를 쉽게 하는 패키지입니다.

2. 인증 및 보안 관련 패키지

- passport
: 다양한 인증 전략을 지원하는 Node.js 라이브러리입니다.
- passport-jet
: Passport.js와 JWT를 함께 사용하기 위한 라이브러리입니다.
- @types/passport-jwt
: passport-jwt 패키지의 타입 정의 파일입니다.
- bcrypt
: 비밀번호를 해시화하는 라이브러리입니다.
- @types/bcrypt
: bcrypt 패키지의 타입 정의 파일입니다.

3. 데이터베이스 관련 패키지

- typeorm
: 다양한 데이터베이스를 지원하는 ORM(Object-Relational Mapping) 프레임워크입니다.
- mysql2
: MySQL 데이터베이스를 위한 Node.js 드라이버입니다.

4. 파일 처리 관련 패키지

- multer
: 파일 업로드를 처리하는 Node.js 미들웨어입니다.
- @types/multer
: multer 패키지의 타입 정의 파일입니다.

5. 데이터 유효성 검사 및 변환 관련 패키지

- class-validator
: 데이터 유효성 검사를 위한 라이브러리입니다.
- class-transformer
: 클래스 간 데이터 변환을 위한 라이브러리입니다.

6. 기타 패키지

- pappaparse
: CSV 파일을 파싱하는 라이브러리입니다.
- @types/papaparse
: papaparse 패키지 타입 정의 파일입니다.
- joi
: 데이터 유효성 검사를 위한 라이브러리입니다.
- typeorm-naming-strategies
: TypeORM에서 사용하는 테이블 및 컬럼 명명 규칙을 정의하는 패키지입니다.
- loads
: 유틸리티 함수를 제공하는 라이브러리입니다.
- @types/lodash
: loads 패키지의 타입 정의 파일입니다.

 

현재 프로젝트에 필요한 패키지?

- @nestjs/config
- @nestjs/jwt
- @nestjs/passport
- @nestjs/typeorm

- passport
- passport-jwt
- @types/passport-jwt
- bcrypt
- @types/bcrypt

- typeorm
- mysql2

- multer .. ~~파일 업로드가 불필요한 프로젝트이므로 제외해줘도 무관함~~ 
						공연 사진 업로드해야 하므로 필요함
- @types/multer .. ~~파일 업로드가 불필요한 프로젝트이므로 제외해줘도 무관함~~
									 공연 사진 업로드해야 하므로 필요함

- class-validator
- class-transformer

- papaparse .. ~~파일 업로드가 불필요한 프로젝트이므로 제외해줘도 무관함~~
							 공연 사진 업로드해야 하므로 필요함
- @types/papaparse .. ~~파일 업로드가 불필요한 프로젝트이므로 제외해줘도 무관함~~
							 공연 사진 업로드해야 하므로 필요함
- joi
- typeorm-naming-stragies
- loads
- @types/lodash

 

공연 이미지 업로드해야 하므로 명령어 수정 없이 전부 입력하면 된다.

프로젝트 초기 세팅

프로젝트 생성

nest new online_concert_ticketing_service

 

 

 

프로젝트 디렉토리 이동

cd online_concert_ticketing_service

 

초기 세팅 명령어

npm i @nestjs/config @nestjs/jwt @nestjs/passport passport passport-jwt @types/passport-jwt typeorm @nestjs/typeorm mysql2 multer bcrypt @types/bcrypt class-validator class-transformer multer @types/multer papaparse @types/papaparse joi typeorm-naming-strategies lodash @types/lodash

 

 

 

Gitmoji

 

⚡️ Gitmoji 사용법 정리 (+ 깃모지 툴 소개)

 

⚡️ Gitmoji 사용법 정리 (+ 깃모지 툴 소개)

Gitmoji 란? gitmoji란 git + emoji를 합쳐서 부르는 말로 emoji를 이용하여 commit message를 작성하는 tool이라고 보면 될 듯하다. 지금까지 그냥 글로만 커밋 메세지를 써왔겠지만, 메세지에 이모지(이모티

inpa.tistory.com

 

MySQL 데이터베이스 생성

  1. Terminal 실행
  2. 명령어 입력
cd /usr/local/mysql/bin

 

 

./mysql -u root -p

 

 

MySQL 접속 완료!

 

데이터베이스 생성

 

 

현재 보유한 데이터베이스 조회

show databases;

 

 

TypeScript와 Prisma의 차이점 (Generated. by GEMINI)

 

 

  • 가장 큰 차이점으로는 TypeORM은 TypeScript 클래스를 사용한다는 것이고 Prisma는 스키마 파일(.prisma)를 사용한다는 것이다.
  • 이는 TypeORM을 사용할 때 추가적인 파일 생성 없이 사용이 가능하다는 것을 의미한다.

속성과 함수의 차이

클래스 속성은 클래스 내에서 정의되는 변수와 유사하지만, 단순한 데이터 저장 용도를 넘어 객체의 상태나 특성을 나타내는 중요한 역할을 합니다. 함수와 비교했을 때 속성은 다음과 같은 특징을 가지고 있습니다.

  1. 데이터 저장
  2. 캡슐화
  3. 상속
  4. 객체 상태
  5. 메모리 할당
  6. 객체 지향 프로그래밍

속성과 함수의 관계

  • 함수는 속성의 값을 가져오거나 설정하는 데 사용될 수 있습니다.
  • 속성은 함수의 인수로 전달될 수 있습니다.
  • 속성과 함수는 서로 협력하여 객체의 기능을 구현합니다.

속성과 DTO의 관계 (Generated. by GEMINI)

클래스 속성과 DTO(Data Transfer Object)의 관계 심층 분석

클래스 속성과 DTO는 모두 데이터를 표현하는 데 사용되는 도구이지만, 서로 다른 역할과 특징을 가지고 있습니다.

1. 클래스 속성:

  • 역할: 객체의 상태나 특성을 나타냅니다.
  • 특징:
    • 캡슐화 가능
    • 상속 가능
    • 객체 지향 프로그래밍의 기본 개념
    • 다양한 데이터 유형 지원
    • 접근 제어자를 통해 접근 권한 제어 가능
    • getter/setter 메서드를 통해 값 조작 가능

2. DTO:

  • 역할: 서로 다른 시스템 또는 레이어 간에 데이터를 전송하는 데 사용됩니다.
  • 특징:
    • 데이터 직렬화 및 역직렬화 용이
    • 간결하고 명확한 데이터 구조
    • 네트워크 통신에 최적화
    • 데이터 유효성 검증 기능 제공 가능
    • 다양한 프레임워크와 라이브러리에서 지원

3. 관계 분석:

  • 데이터 표현:
    • 클래스 속성은 객체 내부적으로 데이터를 표현하는 데 사용됩니다.
    • DTO는 시스템 간 데이터 교환을 위해 데이터를 표현하는 데 사용됩니다.
  • 역할 분담:
    • 클래스 속성은 객체의 상태와 기능을 구현하는 데 중점을 둡니다.
    • DTO는 데이터 전송 과정에서 데이터 구조를 정의하고 직렬화/역직렬화를 지원하는 데 중점을 둡니다.
  • 중복:
    • 클래스 속성과 DTO는 동일한 데이터를 표현하기 위해 사용될 수 있지만, 서로 다른 목적을 가지고 있습니다.
    • DTO는 클래스 속성의 일부 또는 전부를 포함할 수 있으며, 추가적인 메타데이터나 기능을 포함할 수 있습니다.

4. 활용 예시:

  • 클래스 속성:
    • 사용자 정보를 저장하는 클래스: 이름, 나이, 이메일 등
    • 상품 정보를 저장하는 클래스: 가격, 재고, 설명 등
    • 게임 캐릭터 정보를 저장하는 클래스: 체력, 공격력, 방어력 등
  • DTO:
    • 사용자 로그인 정보 전송
    • 상품 주문 정보 전송
    • API 응답 데이터 전송

5. 결론:

클래스 속성과 DTO는 서로 보완적인 관계를 가지고 있습니다. 클래스 속성은 객체 내부적으로 데이터를 표현하고 기능 구현에 사용되고, DTO는 시스템 간 데이터 교환을 위한 데이터 구조를 정의하고 전송 과정을 지원합니다. 상황에 따라 적절하게 두 도구를 사용하여 데이터를 효과적으로 관리하고 활용해야 합니다.

— 어쩌구 ~ User부터 내일 다시 할 것