티스토리 뷰
간단한 API 서버를 제외하고는 웹서비스의 전형적인 HTTP API server를 실무에서 개발한 적이 없다. 유튜브에서 Golang의 대표적인 web framework인 Gin을 이용한 좋은 강좌를 만나 이를 하나씩 따라하려고 한다.
다섯 번째로 미들웨어에 대해 알아본다.
Playlist: Rest API in Golang using Gin Gonic: https://bit.ly/3hsZKbv
YouTube. Grouping Rest API's in Golang using Gin: https://youtu.be/sh80Do4yIqA
구현해본 GitHub repo: https://github.com/nicewook/gin-gonic-study
이번 블로그 포스팅 소스코드: https://github.com/nicewook/gin-gonic-study/tree/main/middleware-5
개요
미들웨어는 request를 처리하기 전에 사전작업을 하는 것이라 보면 된다.
이때 API group에 대해 미들웨어를 적용하면 해당 그룹의 모든 API에 대한 request를 처리하기 전에 미들웨어를 거치게 된다.
예제에서는 v1 API그룹에 대해서는 header에 "auth-token" key에 대해 "secret-token" 이라는 value가 있는 지 체크하는 authenticateMiddleware를 적용하고
v1 API 그룹 중에서도 user API 그룹에 대해서는 "age" key에 대해 18이상의 값인지를 체크하도록 ageCheckMiddleware를 적용해 보았다.
authenticateMiddleware, ageCheckMiddleware
v1.Use()로 authenticateMiddleware를 사용하겠다고 등록했다. 따라서 하위 그룹인 user, product 그룹의 모든 API들이 이 미들웨어를 거치게 된다.
user.Use()로 ageCheckMiddleware를 사용하겠다고 등록했다. 이 경우는 user API 그룹 전체가 이 미들웨어를 거치게 된다.
미들웨어들 간의 적용순서는 .Use()로 등록된 순서를 따른다.
미들웨어 구현을 보자
authenticateMiddleware의 경우 header의 "auth-token" key에 대한 값이 있는지, 그 값이 "secret-token"인지를 확인하고 처리한다 그리고 값이 있다면 c.Keys에 "received-token"이라는 key에 value를 넣어준다.
ageCheckMiddleware의 경우 header의 "age" key에 대한 값이 있는지, 그 값이 18이상 인지를 확인하고 처리한다
그리고 나서 c.Keys에 "user-age"라는 key에 value를 넣어준다.
user group을 테스트 해보자
"auth-token"이 없으면 미들웨어를 통과하지 못한다
"auth-token"의 값이 "secret-token"이 아니면 미들웨어를 통과하지 못한다
"auth-token"이 맞아도 "age"가 18보다 적으면 미들웨어를 통과하지 못한다
"auth-token"이 맞고 "age"가 18이상이면 미들웨어를 통과한다
이때, server 측의 log를 보자
- c.Keys를 통해 값들이 전달된 것을 알 수 있다.
- 또한 중요한 것은 미들웨어의 실행 순서이다.
- authenticateMiddleware가 먼저 처리된 다음 c.Next()를 통해 다음 미들웨어인 ageCheckMiddleware가 실행된다.
- 다시 ageCheckMiddleware의 c.Next()가 처리되어 실제 handler로 전달이 되고
- 그제서야 ageCheckMiddleware의 c.Next() 다음 라인, 그 다음 authenticateMiddleware의 c.Next() 다음 라인이 실행된다.
2021/10/05 16:32:39 authenticateMiddleware passing
2021/10/05 16:32:39 ageCheckMiddleware passing
2021/10/05 16:32:39 received token: secret-token, user age: 18
2021/10/05 16:32:39 ageCheckMiddleware passed already
2021/10/05 16:32:39 authenticateMiddleware passed already
product group을 테스트 해보자
header에 "age" 정보가 없어도 미들웨어를 통과한다
'golang' 카테고리의 다른 글
Golang: Websocket 이해하기 (1) | 2021.11.17 |
---|---|
Go Day 2021 on Google Open Source Live - 유튜브 영상 4개 감상 (0) | 2021.11.12 |
Golang Gin Gonic - 4. Grouping API (0) | 2021.10.04 |
Golang Gin Gonic - 3. Post files to API server (0) | 2021.10.01 |
Golang: 같은 필드명을 가진 다른 구조체로 데이터를 옮기기 (0) | 2021.10.01 |
- Total
- Today
- Yesterday
- 2023
- strange
- websocket
- folklore
- API
- solid
- 독서
- github
- Bug
- 인텔리제이
- postgres
- 영화
- Shortcut
- golang
- 클린 애자일
- OpenAI
- 노션
- 체호프
- ChatGPT
- intellij
- Gin
- go
- 잡학툰
- JIRA
- notion
- bun
- 제이펍
- agile
- 독서후기
- pool
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |