Connected

연결합시다.

요약

항목 내용
장소 Gather
날짜 2022년 12월 17일 (토요일) 14시 ~ 18시 (4시간)

주제

어느덧 우리는 2022년의 끝자락에 와있습니다. 격월로 진행했던 잉여톤이 어느새 반기별로 진행하게 되었습니다. 우리 삶이 그만큼 바빠졌기 때문이고, 그렇기에 잉여력이 많이 줄어든 것은 아닐까 합니다.

지속 가능한 잉여 개발을 위해 필요한 것은 무엇일까 생각했습니다. 그것은 아무래도 신선한 자극을 줄 수 있는 새로운 경험이 아닐까 합니다. 그리고 지난 대회를 돌아보았습니다. 지난 28회간의 수상 실적을 분석해봤을 때, 단순히 개별 클라이언트를 개발하는 것이 아니라 그들 사이에 연결을 부여했을 때 더 재미있고 값진 경험을 했던 것 같습니다.

때문에 이번 주제는 연결 입니다. 주어진 HTTP API 혹은 WebSocket API를 활용해 클라이언트 사이에 생명을 불어넣고 더욱 즐거운 경험을 해봅시다.

진행

시간 내용 비고
~14:00 사전 공유 진행할 작품에 대한 간단한 내용을 comment로 공유합시다.
14:00 등록 및 시작 Slack의 #yingyeothon 채널에서 Gather 링크를 획득한 후 입장합니다.
~14:30 소개 자신의 원대한 포부를 메타버스에서 소개합시다.
~17:30 개발 서로 연결합니다.
~18:00 결과 공유 결과물을 두고 작품과 경험을 공유합니다.

평가 방식 및 상품

결과물을 토대로 엄정한 투표를 통해 순위를 매깁니다. 만약 동률이 발생할 경우, 역사와 전통에 따라 연장자의 순위가 올라갑니다.

서버리스의 저변이 더욱 넓어질 수 있도록, 이번 대회 API 구현 내용이 담긴 책을 상품으로 제공합니다. 많은 호응 부탁 드립니다.

  • 1위: 서버리스 이제는 AWS Lambda로 간다 x 1권 <링크>
  • 2위: 서버리스 이제는 AWS Lambda로 간다 x 2권 <링크>
  • 3위: 서버리스 이제는 AWS Lambda로 간다 x 3권 <링크>

API

API 구조에 대한 기본적인 내용은 다음 문서를 참고 부탁 드립니다.

단, 이중 User API는 관리자 권한을 요구하기 때문에 직접 사용하실 수 없습니다. 신규 계정의 추가나 활성화(Activate)가 필요하시다면 @lacti 에게 말씀해주세요.

Domain

Domain Description
User 시스템 접근을 허가받은 유저의 계정입니다. userId를 잘 보관해주세요.
UserToken 클라이언트에게 메시지 교환 권한을 허가하기 위해 발급하는 토큰입니다. 한 명의 유저는 최대 10개의 토큰을 발급할 수 있습니다.
Topic 메시지를 교환하기 위한 주제입니다. 하나의 주제 내에서 메시지는 Broadcast됩니다. 한 명의 유저는 최대 1,000개의 주제를 생성할 수 있습니다.
Message 임의의 문자열입니다. TEXT나 JSON 등을 사용할 수 있습니다.

Walkthrough

  1. 관리자에게 계정 생성 및 활성화를 요청합니다.
  2. 획득한 userId로, 클라이언트에서 사용할 UserToken을 발급합니다.
  3. 획득한 userId로, 메시지 교환에 사용할 Topic을 생성합니다.
  4. WebSocket으로 Topic에 접근해 메시지를 교환합니다. 혹은 Message API를 사용해 Topic에 메시지를 보내거나 조회합니다.

이를 curl로 표현하면 다음과 같습니다.

# Step 1. 관리자에게 요청해서 userId를 획득합니다.
# userId=clbh5k6kj00010vfl8zmg8a2x (예시)

# Step 2. UserToken을 발급합니다.
$ curl -XPOST "https://y28.yyt.life/api/user/clbh5k6kj00010vfl8zmg8a2x/token"
{"ok":true,"result":{"token":"clbh5lrcm00020vflc51jb34y"}}

# Step 3. Topic을 생성합니다.
$ curl -XPOST "https://y28.yyt.life/api/user/clbh5k6kj00010vfl8zmg8a2x/topic" \
  -H "content-type: application/json" \
  -d '{"name":"TOPIC-NAME"}'
{"ok":true,"result":{"id":7,"name":"TOPIC-NAME","createdAt":"2022-12-10 08:46:50"}}

# Step 4-1. WebSocket에 연결합니다. Node.js 클라이언트인 wscat를 사용해봅시다.
#           Topic 이름은 path로, UserToken은 query parameter로 전달합니다.
#           `npm i -g wscat` 으로 설치할 수 있습니다.
$ wscat -c "wss://y28.yyt.life/websocket/TOPIC-NAME?token=clbh5lrcm00020vflc51jb34y"
> Hey!
< Hey!

# Step 4-2. WebSocket 연결이 어려울 경우, Message API를 사용할 수도 있습니다.
#           Message API는 Post(POST)와 Fetch(GET) 2개로 나뉩니다.
#           WebSocket 주소와 동일하게, Topic 이름은 path, UserToken은 query param입니다.
# Step 4-2-1. PostMessage API를 사용해 Topic에 메시지를 전파합니다.
$ curl -XPOST "https://y28.yyt.life/api/message/TOPIC-NAME?token=clbh5lrcm00020vflc51jb34y" \
  -H "content-type: text/plain" \
  -d 'Hello there'
{"ok":true}

# Step 4-2-2. FetchMessage API는 Topic의 메시지를 가져옵니다. 클라이언트는 주기적으로 polling해야 합니다.
#             이때, `messageId` query param을 지정하면 그 이후의 메시지부터 가져올 수 있습니다.
#             `dir` query param으로 조회 방향(asc, desc)을 지정할 수 있고, `count`로 가져올 메시지 수를 지정할 수 있습니다.
$ curl -XGET "https://y28.yyt.life/api/message/TOPIC-NAME?token=clbh5lrcm00020vflc51jb34y"
{"ok":true,"result":[{"id":"clbh7r1w30001072u3j8k0tl2","body":"Hey!","createdAt":"2022-12-10 00:43:16"},{"id":"clbh7r4pw0002072u9x5i3owo","body":"Hello there","createdAt":"2022-12-10 00:43:19"}]}

# 이전 조회에서 얻은 가장 마지막 messageId로부터 다시 조회합니다. 그 이후에 전달된 메시지가 없다면 빈 배열이 반환됩니다.
$ curl -XGET "https://y28.yyt.life/api/message/TOPIC-NAME?token=clbh5lrcm00020vflc51jb34y&messageId=clbh7r4pw0002072u9x5i3owo"
{"ok":true,"result":[]}

API

Swagger UI를 참고 바랍니다.

curl 문법이 읽기 더 편하다면, 다음을 참고하세요. 도메인 별로 모델을 관리하기 위한 curl 명령을 개별 스크립트 파일로 만들어두었습니다.

만약 스크립트 파일을 직접 사용하려면, SERVER_URL 환경 변수를 https://y28.yyt.life로 지정해주세요.

$ export SERVER_URL="https://y28.yyt.life"
$ cd scripts/usertoken
scripts/usertoken$ bash list.sh clbh5k6kj00010vfl8zmg8a2x
+ curl -XGET https://y28.yyt.life/api/user/clbh5k6kj00010vfl8zmg8a2x/token
{"ok":true,"result":[{"token":"clbh5lrcm00020vflc51jb34y"}]}

Contact

다음 Slack 채널을 통해 문의해주세요.

대회 서버는 대회 기간 동안에만 운영되는 점 참고 바랍니다.

FAQ

  • Q. 오프라인 모임 가능합니까?
    • A. 저는 계획이 없습니다만 뜻이 맞는 분들끼리 하셔도 됩니다.
  • Q. 미리 해와도 됩니까?
    • A. 미리 배포까지 해오셔도 됩니다.
  • Q. 일찍 끝내도 됩니까?
    • A. 시간 문제로 공유가 여의치 않다면, comment나 Slack으로 배포 페이지를 공유 부탁 드립니다.
  • Q. Gather에서 다른 분들과 대화 가능한가요?
    • A. 커뮤니티의 활성화는 언제나 대환영입니다.