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

빵빵님의 프로필 이미지
빵빵

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

08-05 게시판 CRUD API

객체 createBoardInput을 왜 한번 더 { } 객체로 감싸서 보내는지 궁금합니다.

해결된 질문

작성

·

197

0

boards.resolver.ts 파일에서

 

createBoard 함수에서 boardsService클래스에 인자를 전달할때

createBoardInput 객체를 보내는데

낱개로 된 writer,title,contents 도 아닌데

왜 굳이 한번 더 {createBoardInput} 객체로 감싸서 보내는지 이해가 잘 되지 않습니다.

 

@Mutation(() => String)  
  createBoard(
  
    @Args('createBoardInput') createBoardInput: CreateBoardInput,
  ): string {
   
    return this.boardsService.create({ createBoardInput });
    //**차이점??
    return this.boardsService.create(createBoardInput);

  }

 

boards.service.ts 파일에서는

create({ createBoardInput }: IBoardsServiceCreate): string {
//**차이점??
 create(createBoardInput: CreateBoardInput): string {




    //1.브라우저에서 보내준 데이터 확인하기

    console.log(createBoardInput.writer);
    console.log(createBoardInput.title);
    console.log(createBoardInput.contents);

    //2. DB에 접속 후, 데이터를 저장 => 데이터 저장했다고 가정.

    //3. DB에 저장된 결과를 브라우저에 응답(response) 주기.
    return '게시물 등록에 성공하였습니다.';
  }

굳이 IBoardsServiceCreate의 인터페이스를 안만들어도

이미 CreateBoardInput 이라는 Class를 타입으로 적용해서 받으면 되는데

createBoardInput을 왜 한번 더 { } 객체에 감싸서 보내는지 궁금합니다.

 

답변 2

1

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! 빵빵님!

해당 부분에서 굳이 객체로 감싸지 않아도 된답니다!

다만, 굳이 객체로 감싼 이유는 크게 3가지가 있는데요!
============================================================

  1. 기존에 배웠던 내용을 복습하기 위함이에요!

     

  2. 현재는 간단한 서비스이지만, 실무 환경에서 일반적으로 여러 input(게시판, 파일, 태그 등)을 묶어서 보내게 되는데, 이 때는 하나의 input이 아니므로 객체로 묶어서 전달하는 것이 좋아요!
    따라서, 본 과정에서는 "확장성을 위해서 비록 하나의 input이지만 객체로 감쌌다" 정도로 봐주시면 좋을 것 같아요!

     

  3. 마지막으로, 비록 객체가 아닌 하나의 단일 데이터일지라도, 번거롭지만 객체로 감싸는게 추후 안정성을 위해서 더 유리할 것 같아요!
    이유는 id: string을 받는 서비스의 경우, name이 인자로 들어와도 name 역시 동일한 string타입이므로 에러를 캐치하기 어렵기 때문이랍니다!

0

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

빵빵님의 질문에 답변드리겠습니다.

여기서 {createBoardInput}이 추가적으로 객체로 감싸진 이유는 TypeScript의 Destructuring(구조 분해 할당) 기능 때문입니다. 이러한 방식은 함수에 객체를 전달할 때 그 객체의 특정 프로퍼티만을 추출하여 사용하고자 할 때 사용합니다.

예를 들어, boardsService.create() 함수가 다음과 같이 CreateBoardInput 타입의 데이터와 함께 추가적인 옵션을 받을 수 있는 IBoardsServiceCreate 인터페이스를 사용하는 경우에는 구조 분해 할당을 활용하여 여러 값들을 한번에 전달할 수 있습니다.

create({ createBoardInput, ...otherOptions }: IBoardsServiceCreate): string {
  // ... 함수 로직
}

그러나 샘플 코드 상에서 boardsService.create() 함수는 CreateBoardInput 타입만 받도록 설계가 되어 있는 듯 보입니다. 이 경우에는 {createBoardInput} 대신에 createBoardInput을 직접 전달하는 것이 더 적절할 수 있습니다.

create(createBoardInput: CreateBoardInput): string {
  // ... 함수 로직
}

즉, createBoardInput{}로 한 번 더 감싸지 않고 바로 전달하는 것이 더 간결하고, 현재 코드의 설계에 맞게 사용된 것으로 보입니다.

필요에 따라 꼭 IBoardsServiceCreate 인터페이스를 사용하지 않고도, 직접 CreateBoardInput 타입의 인자를 받아 처리하는 것이 가능합니다.

항상 더 나은 코드 구조를 고민하고 작성하는 것은 개발자에게 중요한 일입니다. 질문하신 내용이 잘 해결되셨길 바라며, 다른 궁금한 점이 있으시면 언제든 질문해 주세요.

빵빵님의 프로필 이미지
빵빵

작성한 질문수

질문하기