2025-08-10 NestJS UsersService CRUD 구현 및 DTO 작성

1. 오늘 한 것 (What I Did)

  • UsersService에 CRUD 기능 만들기
  • DTO 파일 작성하기
  • TypeORM 사용법 배우기

2. 새로 이해한 것 (What I Learned)

2-1. Service vs Repository 차이

Service - 비즈니스 로직

async create(createUserDto: CreateUserDto) {
  // "고객이 성인인지 확인하고, 재고 체크하고, 할인 적용해서 판매해"
  const user = await this.repository.save({ ...createUserDto });
  return user;
}

Repository - 데이터 접근

// "그냥 데이터 가져오고, 저장하고, 삭제만 해"
repository.save()    // 저장
repository.find()    // 전체 조회
repository.findOne() // 하나 조회

 

2-2. DTO 사용법

2-2-1. CreateUserDto

  • id 필드 제외: 데이터베이스가 자동 생성하므로 불필요
  • readonly 사용: 데이터 변경 방지로 안전성 보장
  • 선택적 필드 (?): 필수가 아닌 항목은 ? 사용

2-2-2. PartialType

// CreateUserDto
{
  providerId: string;    // 필수
  email: string;         // 필수
  name: string;          // 필수
}

// PartialType(CreateUserDto) 결과
{
  providerId?: string;   // 선택적으로 변환
  email?: string;        // 선택적으로 변환
  name?: string;         // 선택적으로 변환
}

2-2-3.  스프레드 연산자 (...)

const createUserDto = {
  providerId: "kakao123",
  email: "test@test.com",
  name: "홍길동"
};

// { ...createUserDto } 결과
{
  providerId: "kakao123",  // 박스를 뜯어서 내용물을
  email: "test@test.com",  // 새 박스에 복사
  name: "홍길동"
}
  • 왜 쓰나면? 원본 객체 보호 + TypeORM 호환성

2-3. async/await vs Promise

// async 없음 - 단순 작업
findAll() {
  return this.repository.find();  // Promise 바로 반환
}

// async 있음 - 복잡한 작업
async create(createUserDto: CreateUserDto) {
  const step1 = await this.validateUser();     // 단계별 처리
  const step2 = await this.repository.save();
  return step2;
}
  • 단계가 있는 복잡한 작업에서는 async/await를 써준다. 그 외 경우는 없어도 됨. 

2-4. CRUD 메서드별 매개변수 차이점

findAll()           // 전체 조회 - 조건 불필요
findOne(id)         // 특정 조회 - ID 필요
create(data)        // 생성 - 데이터 필요
update(id, data)    // 수정 - ID + 데이터 필요
remove(id)          // 삭제 - ID 필요
  • 대상이 "전체" vs "특정 하나"인지에 따라 매개변수 결정

3. 실수했던 부분들 (What I Struggled With)

클래스 vs 함수 vs 메서드 vs 변수 구분 어려움

  • 처음에는 모든 게 비슷해 보였음
  • "어디에 있는지"로 구분하는 방법 학습
  • 클래스 안에 있으면 메서드, 밖에 있으면 함수

4. 여전히 잘 모르겠는 부분

  • 데코레이터(@) 문법: 그래도 지난 주보다는 좀 익숙해지는 것 같음. 
  • Repository가 어떻게 자동으로 들어오는지: 마법 같아서 신기한데 원리를 모르겠음. 알아야 하나? 그냥 그런가보다 해야할까? 
  • PartialType : 필드를 선택적으로 만드는 거라고 하는데....?
    • readonly name: string; 와 readonly name?: string; 차이를 직접 실행해봐야겠음 
  • async/await vs Promise: 정확히는 잘 모르겠음. 
  • 스프레드 연산자 (...): 객체를 보호하기 위해 쓴다는데 와 닿지는 않음. 객체 지향 프로그래밍에 대해서 몰라서 그런가?

 

 

 

 

'TIL' 카테고리의 다른 글

2025-8-12 NestJS 구글 소셜 로그인 & JWT 인증 시스템 구현  (2) 2025.08.12
2025-08-11 NestJS API 테스트 및 문제 해결  (3) 2025.08.11
2025-08-09 NestJS + TypeORM DB 연동  (4) 2025.08.10
2025-08-06  (6) 2025.08.10
2025-08-03  (10) 2025.08.03