• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

이중 select

21.06.17 23:00 작성 조회수 25

2

삭제된 글입니다

답변 1

답변을 작성해보세요.

0

ssdev님 안녕하세요 :)

좋은 질문이네요. ssdev님이 하시려는것처럼 비밀번호 같은 정보는 노출 시키지 않아야 됩니다. 혹은 API요청하는 유저의 권한에 따라 return되는 정보가 달라야할 때도 있고요. 

userWithPassword, userWithoutPassword를 Promise.all로 묶어서 불러오면 사용자 입장에서 응답시간은 개선이 될거에요. 하지만 이렇게 해도 디비에 여전히 불필요한 호출이 가서 좋은 해결책은 아니죠.(두번 연달아서 호출한걸 동시에 호출한걸로 바꾼거니깐요)

const  { password, ...userWithoutPassword } = user;

가능하면 select로 불필요한 필드를 제외하면 좋지만 이 경우 처음에 생각하셨던 방법으로 하시는게 좋을거 같아요.

다만 이렇게 하면 userWithoutPassword에 처음보는 이상한 정보들이 많을거에요. user document는 문서의 정보 말고도 document class가 가지고 있는 다른 정보들이 많기 때문이에요.

const  { password, ...userWithoutPassword } = user._doc;

이렇게 하시면 비밀번호를 제외한 유저 정보를 받을 수 있어요. ._doc를 하면 문서의 정보 자체만 받게 됩니다.

저 같은 경우는 GraphQL 백엔드를 두고 있는데요. 이 경우 더 쉽게(혹은 실수의 여지를 제거) 이 문제를 해결할 수 있어요. 외부가 데이터를 불러올 수 있는 GraphQL Schema정의가 따로 있는데요. Mongoose Schema와 매우 흡사합니다. 다만 여기서 비밀번호 같은 외부에 노출되지 말아야할 항목들은 GraphQL Schema에서 제외시켜요. 그러면 비밀번호가 포함된 회원정보를 리턴해도 서버에서 리턴하기 전에 GraphQL Schema에 비밀번호가 없기 때문에 해당 필드를 삭제해서 전달됩니다.

hhglng님의 프로필

hhglng

질문자

2021.06.19

상세한 답변 감사합니다! 큰 도움이 되었습니다! 

그런데 user._doc으로 뽑은 userWithoutPassword인 경우 더이상 Document 타입이 되지 않아서 문제가 가 있는 것 같습니다 ㅠㅠ 지금은 Rest API를 설계중인데 나중에 GraphQL을 한 번 고려해봐야 겠네요. 감사합니다! :)

아 그쵸 typescript 사용중이셨네요. 음 그러면 깔끔한 방법은 생각나지 않네요. Promise.all이용해서 두 가지 경우 불러오거나 아니면 리턴하기 전에 비밀번호 부분을 다른 임의의 string으로 수정하고 보내는 방법도 있지 않을까 싶어요(.save를 안하면 어짜피 변경된 부분이 디비에 반영되지 않으니)

hhglng님의 프로필

hhglng

질문자

2021.06.19

오 어차피 db에 반영이 되지 않으니 password를 임의의 string으로 변경하는 방법이 좋을 듯 하네요!   성능상으로는 이 방법이 제일 나은 방법 같습니다! 정말 감사합니다 ㅠㅠㅜ 😀😀😀