강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

Gyuri Kim님의 프로필 이미지
Gyuri Kim

작성한 질문수

프론트 개발자를 위한 백엔드 101 (NestJS, TypeORM)

[실습] 블로그 포스트 API 구현 (Module, Controller, Service, DTO)

PostRepository 구현

작성

·

9

0

image.png

상위 레이어의 정보를 알면 안되기 때문에, repository에서는 dto가 아니라 모델을 받아야 한다고 하는데, 모델의 타입이 어떻게 되는 건가요?

 

그리고 위의 예제에서 service의 create 메서드는 아래와 같이 dto를 인자로 넘겨주고 있는데, 그러면 dto로 타입을 맞춰야 하지 않나요?

 

  async create(createPostDto: CreatePostDto): Promise<Post> {
    const post = this.postRepository.create(createPostDto);
    return this.postRepository.save(post);
  }


그리고 글 수정 api 컨트롤러에서 put 메서드를 사용하신 것 같습니다.

  @Put(':id')
  update(
    @Param('id', ParseIntPipe) id: number,
    @Body(ValidationPipe) updatePostDto: UpdatePostDto,
  ) {
    return this.postService.update(id, updatePostDto);
  }

제가 생각했을 때는 일부분을 수정하는 케이스니까 restful 하도록 바꾼다면, patch 메서드가 적합하다고 생각이 드는데, 이해한게 맞을까요?

 

감사합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. Gyuri Kim님.

질문해주신 사항에 대해 답변 드리도록 하겠습니다.

  1. Repository에서 DTO 대신 모델 사용:

    • 일반적으로 Repository 계층에서는 DTO(Data Transfer Object)가 아닌 엔티티(또는 모델)를 다루는 것이 바람직합니다. 이는 Repository 계층이 데이터베이스 연산을 담당하기 때문에, DTO보다는 실제 데이터베이스와 연관된 엔티티 클래스가 필요합니다. 모델의 타입은 일반적으로 Post 엔티티일 것입니다. 이렇게 하면 데이터베이스와 상호작용시 필요한 모든 필드를 갖출 수 있습니다.
  2. Service의 create 메서드:

    • Service 계층에서는 DTO를 받아 관계된 엔티티로 변환하여 Repository로 넘깁니다. 그래서 아래의 코드는 일반적으로 통용됩니다:
      
      async create(createPostDto: CreatePostDto): Promise<Post> {
      const post = this.postRepository.create(createPostDto);
      return this.postRepository.save(post);
      }
      

    • 여기서 this.postRepository.create(createPostDto) 호출은 TypeORM이 DTO를 엔티티로 변환해주는 역할을 합니다.
  3. PUT vs PATCH:

    • 말씀하신 대로, RESTful API 설계 원칙에 따라 일부분의 리소스를 업데이트할 때는 PATCH 메서드를 사용하는 것이 더 적합합니다. PUT은 전체 리소스를 교체할 때 사용하는 것이 일반적입니다. 질문에서 말씀하신 상황이라면, PATCH 메서드를 사용하는 것이 더 RESTful한 설계일 것입니다.

관련 질문 URL:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Gyuri Kim님의 프로필 이미지
Gyuri Kim

작성한 질문수

질문하기