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 |