AWS

[AWS] serverless webSocket을 이용해 DM 앱 만들기 - 1

폭풍저그김탁구 2021. 12. 27. 20:40

디엠 기능을 만들어야 하는 상황이 생겼다. 

보통 채팅 기능이라고들 한다. 나는 DM이라는 말이 더 편해서 DM으로 사용 중.

처음엔 nodejs의 socket 통신을 이용하려고 했는데 aws를 쓰고 있는만큼 aws를 이용해서 소켓통신을 하는 게 좋을 것 같아 aws에 관해 계속 서칭을 했다...

이게 얼마나 삽질이 될지는 몰랐다...

nodejs socket은 자료가 매우 많아서 비슷하겠거니 했는데, aws는 자료가 엄청 없다. 특히 한국어 자료는.

또 어떻게 채팅을 구현하냐도 천차만별이라서, 내가 원하는 기능 찾기가 매우매우 힘들었다.

지금 아직 완벽하게 진행은 못했지만, 우선 한 만큼만 공유해보려 한다.

 

먼저 저에게 많은 도움을 주신 유튜브 영상을 소개합니다. 이 영상을 보고 98%정도 따라했다. 2%는 내 어플에 맞게 고친 정도밖에 안 됨... 사실 이 글보다 영상이 도움될 것이라 생각한다. 강사님께서 소스코드도 올려주셨다... 천사...

 

https://youtu.be/SPtRdnB5wSE

 


 

1. 구조 설계

영상에서는 DB를 2개(채팅 내용, 유저 목록) 사용하는데, 나는 전자는 로컬저장소에, 후자는 DynamoDB를 사용하기로 했다. 채팅 내용은 용량도 크고 굳이 DB를 사용할 필요가 없을듯 하여프론트에서 내부디비로 해결하기로 했고, 유저 목록은 socket 구현이나 알람 등 때문에 DB를 사용하였다. 그래서 영상에서의 채팅 불러오기 API는 만들지 않았음!

 

2. AWS 설정

 

- IAM

기존에 쓰고 있던 역할에 DynamoDBFullAccess(..? 이거 맞나) 권한만 추가해줬다.

 

- 나머지

영상 후반부에 보면 나오는데, 나도 평소처럼 serverless.yml 파일을 이용해 api 등을 설정했다. 우리는 호스팅 서버가 있으니, 버킷은 패스.

 

3. 코드

 

function 들이다. 나는 hanlder 파일을 따로 사용하였고, 보안 설정을 추가로 하였다.

functions:
  postDm:
    handler: src/handler.postDmHandler
    events:
      - http:
          path: dm
          method: post
          cors: true
          authorizer: //
  connectDm:
    handler: src/handler.connectDmHandler
    events:
      - websocket:
          route: $connect

  disconnectDm:
    handler: src/handler.disconnectDmHandler
    events:
      - websocket:
          route: $disconnect

 

추가로 설명을 덧붙이자면, queryStringParameters는 get 방식에서처럼 url 주소 뒤에 붙이는 인자고, requestContext는 서버에서 마련?해주는 것 같아 내가 따로 처리를 안 해줘도 되는 것 같다... 물론 그냥 제가 대충 이해한 거라 보장은 못합니다...

roomId: event.queryStringParameters.roomId,
userId: event.queryStringParameters.userId,
connectionId: event.requestContext.connectionId,

 

- 수정한 부분들 

코드에서 이런 부분이 있는데 .promise() 이 부분이 에러가 떠서 다 제거해줬다.

await docClient.put(params).promise();

put.js에서 DB에 저장하는 부분은 제거해주었다.

 

아 .env 파일 생성해줘야 합니다. 아니면 직접 하드코딩 해도 좋습니다.

${process.env.socket_api_gateway_id}

 

 

REST API 말고 webSocket은 처음 사용해봐서 정말 헷갈렸다...

지금도 문제가ㅏ 여럿 있는데 이 부분은 프론트엔드 팀이랑 같이 잘 해봐야 할듯.