티스토리 뷰

🎬 프로젝트 개요

목표

  • 프라이빗 블록체인 노드와 중앙화된 서버를 가진 인센티브 기반 커뮤니티 구현

기간

  • 2023.07.03 ~ 2023.07.14

역할

  • 팀장
  • 백엔드(main server)

세부 목표 및 달성 여부

1. 세부 목표

2. 달성 여부

게시물 업데이트 빼고 다 했다..!

상세 정보

 

Project 2. PloHub (BEB 09 Block Panther)

Github repository

www.notion.so

Github

 

GitHub - codestates-beb/beb-09-PloHub

Contribute to codestates-beb/beb-09-PloHub development by creating an account on GitHub.

github.com


💻 백엔드(main server) 상세 정보

🔧 기술 스택

0. Docker

  • 동일한 환경에서 동작이 예측 가능하도록 docker compose를 사용하여 테스트 환경을 구성
  • Dockerfile을 사용하여 Go 모듈을 컨테이너 이미지로 빌드, node.js의 경우는 라이브 리로딩을 적용

1. Go

  • 사용자 정보, 게시물, 댓글 등을 관리하는 main server를 구축하기 위해 사용
  • go로 작성된 모듈을 linux 실행 파일로 빌드하고 Docker 컨테이너로 실행하는 것이 굉장히 쉽고 빠름

2. PostgreSQL

  • 서버를 분리한 김에 서버별로 서로 다른 RDBMS를 사용해 보기 위해 선택 (contract server는 MySQL)
  • 아직은 대용량 데이터를 다루지 않기 때문에 RDBMS 간의 유의미한 차이를 체감하기 어려움

3. AWS S3

4. sqlc

  • sql 확장자 파일에 작성된 스키마와 쿼리문을 읽고 go 코드를 자동으로 생성해 주는 도구
  • 쿼리문의 결과에 따른 결과 타입을 자동으로 생성해 줘서 편함
  • https://sqlc.dev

📖 주요 패키지

1. aws-sdk-go-v2

2. chi, cors

  • HTTP 서버를 구성하기 위해 사용한 패키지
  • chi는 라우터를 쉽게 구성할 수 있게 해 주며 cors나 chi/middleware 패키지에 들어있는 미들웨어들을 활용할 수 있음
  • https://github.com/go-chi/chi

3. jwt

4. pq

5. zap

6. viper


📈 해결한 문제

1. Ganache 컨테이너를 재실행할 때마다 설정이 초기화되는 문제

원인

  • 컨테이너로 실행 중인 ganache가 재실행되는 경우, 기존의 계정 정보가 초기화되고 새로운 계정이 등록됨으로 인해 계정 정보를 별도로 저장해 놓았다가 재사용하기가 번거로워지는 문제가 발생

해결

  • ganache를 실행할 때 wallet.accounts 옵션을 추가하여 ganache가 재실행될 때마다 동일한 서버 계정을 생성할 수 있음

참고 자료

2. JWT access token을 state에 저장할 것인가? 쿠키에 저장할 것인가?

원인

  • 기존 방식 - jwt token pair를 발급받으면 refresh token은 쿠키에, access token은 state에 저장하며 access token이 필요한 요청에 대해서는 Authorization 헤더에 Bearer + access token 값을 추가하여 서버로 요청
  • 그런데 access token이 필요한 요청 중 일부를 SSR(Server Side Rendering)을 사용하여 처리하려다 보니 access token이 state에 저장되기도 전에 state에 접근하여 결국 비어있는 값을 헤더에 담아 보내게 되는 문제 발생

해결

  • access token을 쿠키에 http only, same site, secure 옵션과 함께 저장하고 SSR을 사용하여 요청 시 서버에서 쿠키에서 access token을 읽어 들이도록 수정

3. npm ERR! gyp ERR! find python

원인

  • Node.js 모듈을 Docker 이미지로 빌드하는 중에 npm install을 실행하는 과정에서 base image에 python이 설치되어 있지 않아 발생하는 오류

해결

  • 놀랍게도 해결 방법이 에러 로그에 포함되어 있음
  • Dockerfile에서 RUN npm install 이전에 RUN apk update && apk add python3 make g++를 추가 (node:16.14.2-alpine3.15 이미지 사용)


🎓 프로젝트를 통해 새롭게 배운 것들

1. multipart/form-data로 받은 파일 핸들링

  • 이번에 go언어를 사용하면서 지난 첫 번째 프로젝트에서 못해봤던 form data로 이미지나 비디오 파일을 받아서 파일 스토리지에 저장하는 로직을 구현해 보았습니다. 사실은 이렇게 간단할 줄은 몰랐는데 확실히 타입이 명확하게 보이니까 이해도 잘 되고 구현도 빨랐던 것 같습니다.

참고

2. AWS S3 버킷에 파일 저장하고 불러오기

  • S3 버킷에 파일을 저장하는 것도 생각보다 간단했습니다. 앞서 form data로 받은 파일이 io.Reader 인터페이스를 구현하고 있으므로 UploadFile 메서드의 file 값으로 넘겨주게 되면 메서드 로직이 실행되면서 s3 버킷에 파일이 업로드됩니다.

  • 문제는 업로드된 파일에 어떻게 접근을 할 수 있는가였습니다. 보안상의 이슈가 있다고는 하지만 마땅한 방법이 없어서 GetObject 요청을 모든 사용자가 사용할 수 있도록 버킷 정책을 추가하는 방향으로 진행했습니다. 보안 이슈에 대해서는 차후에 AWS를 깊게 파보면서 알아볼 생각입니다. 

참고

💖 느낀 점

1. 루피 해적단에 항해사가 필요한 이유

  • 만화 원피스의 루피 해적단에서 '나미'는 '항해사'라는 역할을 맡고 있습니다. 솔직히 나미가 해적단의 전투원으로서 사황 간부나 해군 중장과의 싸움에서 유의미한 결과를 낼 수 있는가 하면 그렇다고 긍정하기는 조금 어렵습니다. 심지어 나미가 루피 해적단에 필요한가 싶기도 한데요. 아무래도 만화에서 항해 과정을 중요하게 다루지 않아서 항해사라는 역할이 애매해진 것도 하나의 이유인 것 같습니다.
  • 그러나 아무리 루피 해적단의 전투원들이 싸움을 잘한다고 해도 파도치는 대로 바람 부는 대로 망망대해를 빙빙 돌기만 하면 무슨 의미가 있을까요? 저는 항해사가 항로를 설정하고 키를 돌리며 나아가는 것이 프로젝트를 관리하는 것과 비슷하다고 생각합니다.
  • 이번 프로젝트는 초반에 빠르게 기획하고 서로 진행 상황 공유하면서 팀장인 제가 각자에게 필요한 방향을 제시해 주는 등의 과정을 매일같이 반복하고 조율하다 보니 세 명이서 진행했음에도 불구하고 정말로 여유롭게 마무리했습니다. 제가 이번에 잘했다 이 말입니다.

2. 팀장은 팀원의 성장이 두렵습니까?

  • 부트캠프에 지원할 때 자바스크립트 기초라던가 파이썬 기초 같은 기본적으로 요구되는 소양이 있습니다. 그런데 그런 기초 정도는 진작에 떼고 함께 들어온 동기들보다 높은 곳에서 앉아 쉬면서 내려다보고 있는 일부가 있습니다. 제 입으로 말하려니 조금 부끄럽지만 저는 후자 쪽입니다. 그래서 3월부터 줄곧 밑에서 올라오고 있는 동기들에게 미약하나마 도움의 손길을 내미는 쪽이었습니다. 솔직히 귀찮기도 했는데 지금에 와서는 누군가의 성장을 이끌어내고 지켜볼 수 있다는 것이 저한테는 상당한 즐거움의 요소가 되었습니다. 지식을 공유하고 가르침을 전하는 것이 제 자신을 증명하는 작은 도전이고 이것을 달성함으로 인해 얻은 쾌감이 곧 즐거움으로 치환되지 않았나 싶네요.
  • 이번에 두 번째 프로젝트를 진행하면서도 팀원들의 성장을 가시적으로 확인할 수 있어서 상당히 즐거웠습니다. 프런트 엔드를 담당해 주신 팀원분은 Next.js와 SSR에 익숙해지셨고 스마트 컨트랙트와 백엔드의 일부를 담당해 주신 팀원분은 ORM, node.js와 express로 api 서버를 구현하는데 익숙해지셨습니다. 게다가 제가 '이렇게 하면 좋을 것 같아요'하고 제안드린 것들을 즉각 반영해서 확인까지 시켜주셔서 감동의 눈물이 쉴 새 없이 흘렀습니다.
  • 두 분을 세 번째 프로젝트로 반드시 함께 데려가기 위해 저는 수단과 방법을 가리지 않았습니다.

🎬 마치며

  • 메타 인지라고 해야 할까요? 내가 잘하는 것, 못하는 것, 좋아하는 것, 싫어하는 것 등을 확실하게 선을 그어놓고 프로젝트 과정에 반영을 하니까 확실히 이전보다 훨씬 즐겁고 여유롭게 프로젝트를 진행할 수 있었던 것 같습니다.
  • 프로젝트는 힘들지만 그래도 부트캠프에 참가하면서 새로운 즐거움을 많이 느낄 수 있었습니다. 특히 타인의 성장을 돕고 또 그로 인해 함께 성장하는 과정이 정말 뜻깊은 것 같습니다.
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
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
Total
Today
Yesterday
글 보관함