한 것
1. nest 프로젝트 초기화(nest new post-subject)
2. 'prettier/prettier': 0, eslintrc에 추가(CR DELETE오류 방지?)
3. 깃허브 레포지토리 연결
4. npm run start:dev로 동작 확인
5-1. nest g resource user로 파일 생성
5-2. nest g resource qustion
5-3. nest g resource answer
6. 엔티티 작업 + npm i로 의존성 패키지들 최신화?
7. 엔티티 작성을 위한 npm i typeorm TypeORM 다운로드
8. 유저 엔티티 작성
9. 유저 엔티티에 사용하기 위한 eum UserRole을 파일 만들어서 작성, 유저 엔티티에 임포트 후 사용
@Column({ type: 'enum', default: [UserRole.USER] }) => 이 부분은 DBMS를 위해 적어주는 부분임.
roles: UserRole[]; => 이 부분은 타입스크립트를 위해 자료형을 명시해주는 부분임.
10. 퀘스천 엔티티 작성 및 유저, 퀘스천 엔티티 nullable 값 추가
11. 유저, 퀘스천 엔티티 관계 맺어줌.
12-1. 데이터 베이스 연결을 위한 패키지 다운로드
- $ npm install --save @nestjs/typeorm typeorm mysql2
** npm i --save: package.json의 dependency에 해당 모듈을 추가하겠다는 의미인데
이제는 --save를 사용하지 않아도 자동으로 추가가 된다.(이제는 옵션이 되어버림.)
- app.module.ts 파일에 이것저것? 작성, .env, .gitignore파일 생성
- npm i @nestjs/config joi 다운로드
** @nestjs/config: .env역할, joi = 해당 스키마를 사용하지 않는 .env가 들어오면 서버를 동작 못하게 함
*** app.module에 작성한 코드 관련한 거 오피셜독스에서 못찾겠음...
12-2. .env 파일에 내용 채우기 + gitignore파일에 .env 추가
12-3. mysql> create database nest-post 명령어로 데이터 베이스 만들기
데이터 베이스 연결ing....... 일단 포기
13. 엔서 엔티티 작성, (유저, 퀘스천, 엔서 관계 까지 맺어줌)
14. dto 작성할 꺼임 npm install @nestjs/class-validator 설치
회원가입 dto 작성 완료, 로그인 dto 작성 완료(dto에 readonly 사용하는 것 발견 => 수정)
퀘스천 dto 중 질문 작성 부분 작성함
궁굼한 거 질문
1. 코딩할 때 필요한 패키지들을 어떻게 알고 다운을 받는 건지
npm 공식 문서에서 내가 구현하고자 하는 기능의 키워드를 검색해본다.
엔티티 데코레이터
enum값을 유저 테이블에 직접 작성해서 사용하는 것 보다 다른 파일을 새로 만들어서 임포트 해오는 방식이 좋음
(다른 곳에서도 사용할 수도 있기 때문에)
파일을 하나 만들어 준 뒤에 아래 처럼 깔끔하게 작성을 한다.
그 후 사용하고자 하는 파일에 임포트를 해준 뒤 아래와 같이 코드를 작성해준다.
생성할 컬럼의 타입을 enum으로 정의하고 기본값을 UserRole에 정의한 USER로 설정한다는 의미임
아래의 roles는 컬럼 이름을 설정해주고 타입을 UserRole에서 여러 값을 받을 수 있으니 배열 형태로 해준다는 것.
enum을 엔티티에서 사용 할 때 type: 'set', enum: UserRole, default: ['user'] set 유형의 타입을 지정해준다고 하는데
type에 enum도 있던데 무슨 차이가 있는가?
DBMS의 종류에 따라 옵션 값이 달라짐.(공식 문서 확인.)
set은 자료구조중에 하나임 Arrary [ 1 ,2 3, 3, 4] SET [ 1, 2 , 3 , 3, 4 ] SET [ 1 , 2 , 3 4]
중복된 데이터가 있으면 데이터 베이스에 저장을 하지 않음.
엔티티에서 createdAt같은 Date를 보여줄 때
createdAt은 만든 시간을 보여주고 싶어서 timestamp를 사용했는데 Timestamp는 unix time stamp가 원래 이름이다.
1960년 부터 흘러온 시간을 밀리세컨드로 표현을 해주기 때문에 사람이 보기 힘듦(우리가 보는 시간: ISO format)
아래 코드로 바꾸면 ISO format으로 시간을 볼 수 있게 해줌
@CreateDateColumn({ type: 'timestamp' })
createdAt: Date;
// Timestamp; // === unix time stamp(인간이 보기 힘든 시간)
@Column()
updatedAt: Timestamp; // 원래 쓴 코드
관계를 맺어주는 방법 중 조인을 하는 방법
@JoinColumn({ referencedColumnName: 'userId' }) referencedColumnName 참조할 컬럼 이름을 적어줌
userId는 pk값이므로 굳이 적어주지 않아도 괜찮음.(pk값인 userId를 사용하려고 하면 @JoinColumn()만 적어줘도 된다.)