• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

도커와 async/await 질문입니다.

23.06.07 18:05 작성 23.06.07 21:25 수정 조회수 276

0

안녕하세요? 강의 계속 잘 듣고 있습니다.

  1. 아래 그림같이 도커강의 듣던중 docker-compose.yaml 파일에서 포트번호가 주석처리된 것을 취소하는 수정작업뒤, 다시 빌드를 하지않고 실행을 해도 된다고 하셨는데 잘 이해가 가지않습니다.

    Dockerfile안에서 COPY . /myfolder/ 명령어를 실행할 때 docker-compose.yaml 파일도 같이 카피되는 것 아닌가요? 그러면 다시 빌드 해줘야 할것같은데 js파일만 해당하는 건가요? 아직 빌드 개념이 잘 안잡히네요..

 

2. 아래 코드는 몽고DB에서 데이터 조회와 등록하는 코드입니다. 여기서 get 메서드에서는 Board.find에 await를 붙이는 것은 이해했습니다. 그런데 post 메서드에서 board.save()에 await를 붙이는 것이 잘 이해가 안갑니다. board.save()에서 response값을 받아오는것도 아니고 단순히 저장작업만 하는 것처럼 보이는데요. 실제로 await를 안 써줘도 정상적으로 저장이 되었습니다. async/await를 어떤 상황에 써야할지 좀 헷갈리네요

  1. 아 그리고 퀴즈9 하다가 질문합니다.

    1) 밑에 코드에서 116번줄 Phone.findOne({ phone })에서 Phone.findOne({ phone }).token 이런 식으로 뒤에 .token을 붙이면 userToken에 값이 저장이 안되고 밑에 if문에서 userToken.token 으로하면 token값이 제대로 나오는데 왜 그런가요?

    2) 다음 질문은 위에 2번질문과 비슷할 수도 있는데 120번줄 await Phone.updateOne({ phone: phone }, { isAuth: true }) 에서 await를 안 붙였더니 db에서 isAuth가 true로 바뀌지 않더라구요. response는 제대로 왔습니다. db에 업데이트하는 과정과 response하는 과정이 독립적일줄 알았는데 그게 아닌가요?

 

-과제하느라 머리가 어질어질해서 질문이 좀 정돈된 것 같지 않은데 양해부탁드립니다. ㅠ ^^;;

답변 1

답변을 작성해보세요.

1

안녕하세요! nya님!
하나하나 따져가며 공부하시는 것을 보니, 굉장히 빠르게 성장하실 것 같아서 보기 좋아요!

  1. 우리가 실행하는 파일은 사실 index.js 예요!
    따라서, 도커 안에서 index.js와 관련된 녀석들만 복사하시면 된답니다!^^

    COPY ./index.js /myfolder/
    COPY ./phone.js /myfolder/
    ...

    하나하나 카피는게 번거롭다면 모든 파일(.)을 카피하면 되겠죠?!^^

    COPY . /myfolder/

    따라서, 현재 수업에서는 docker-compose.yaml 파일, .gitignore파일 등 모든 파일들을 다 카피하고 있지만 사실은 이런 파일들은 index.js를 실행시키는 것과 무관하므로 복사하지 않아도 된답니다!
    그러므로, docker-compose.yaml 파일을 수정했다고 index.js를 다시 빌드하실 필요는 없습니다^^

     

  2. board.save()로 저장을 하시고, await를 앞에 붙이든 붙이지 않든 상관 없이 정상적으로 response를 받으셨을 거예요!

    하지만 board.save() 앞에 await를 붙이지 않는 경우거짓말을 하고 계신 것이랍니다!
    왜냐면 board.save()시에 DB에 저장해줘! 라는 요청을 보내고, 아직 끝나길 기다리지도 않은 상태에서 response로 정상적으로 등록됐습니다! 라는 메시지를 보내고 있는 것이니까요!!
    반대로 await board.save()를 하시게 되면, 저장이 완료될 때까지 기다리기 때문에 0.1초라도 더 시간이 걸리긴 하지만 등록이 다 완료되고나서, response를 보내주게 되겠죠?!

    만약, await 없이 board.save()라는 요청을 보냈는데 실패했다면...?
    네! 맞아요! 실패했더라도 정상적으로 등록됐습니다! 라는 메시지를 response로 받게 되실거예요! 그러니, await를 붙여서 정상적으로 등록될 때까지 기다렸다가 response를 보내주시면 좋겠죠?!

     


  3. 3-1) 해당 원리는 await에 있습니다!
    image위 사진을 보시면, userToken에는 데이터(토큰)가 들어있겠죠?!


    하지만, 아래의 사진처럼 await로 아직 기다리지 않은 상태에서 Phone.findOne({ phone }).token 과 같이 작성하시게 되면, 아직 DB에서 꺼내오지도 못한 token을 가져올 수는 없어요!
    findOne() 메서드가 DB에 접속하여 데이터를 요청하는 로직을 포함하고 있답니다!
    image

    3-2) db업데이트 과정과 response과정은 독립적인 과정이 맞아요!
    제대로 이해하고 계시며, 테스트 과정에서 실수가 있으신 것 같습니다!^^

    DB에 제대로 반영되었는지 mongodb-compass 에서 새로고침을 해보시는 등 다시 한 번 확인해 보세요!