코드스테이츠 이머시브 코스가 완전히 끝나고, 수료까지 2번의 프로젝트(first, final)을 진행하게 되었다.
4인이 한 팀이 되어 우리는 24k이라는 팀 이름으로 2주간의 First 프로젝트를 진행했고, 마무리되었다.
그에 대한 회고록을 작성한다.
GoldenTime은 지역기반 중고거래에 경매라는 개념을 더해 기획된 서비스이다.
당근마켓의 경매버전이라고 할 수 있다. 사용자의 위치를 이용한다는 점에서 당근마켓으로부터 많이 차용해왔다.
경매라는 개념은 중고거래 등록 시 물건의 가격 측정이 어렵고 일관적이지 못한 문제를 해결해보고자 도입해보았다. 경매 시스템을 도입해 판매자가 최소 시작가만 등록해놓으면 구매를 원하는 사람들이 경매형식으로 입찰을 하도록 했다.
아래는 완성된 페이지의 메인페이지, 상세 페이지의 캡처본이다.
프로젝트에 사용된 테크 스택은 아래와 같다.
나는 back-end 포지션으로 팀에 참여했다. 프런트와 백 모두 학습했지만, 오직 논리로만 움직이는 백엔드가 더 흥미롭게 느껴졌었다. 백엔드로 프로젝트에 참여해보고나니, 확실히 이쪽이 더 매력적으로 느껴졌다.
기능을 만들면서 큰 이슈는 없었다. 그럴 수 있었던 것에는 프로젝트 경험이 있던 백엔드 파트너님이 있었기 때문이었다. 프로젝트 구조를 짜는 것에서부터, 필요한 미들웨어 적용까지 많이 리드하면서 가르쳐주셨다. 덕분에 백엔드의 흐름에 대해 이해하고 학습할 수 있었다. 좋은 파트너를 만날 수 있어 다행이었다. 나도 파트너님께 도움이 되고자 더 열심히 할 수 밖에 없었다. 적어도 나에게는, 배워갈 수 있는 것이 많은 프로젝트 환경이었다.
이슈는 로컬에서 테스트하면서, 그리고 배포에서 많이 생겼었다. 크고 작게 정말 많은 이슈들이 있었는데, 아래에서 대표적인 삽질 4가지로 회고하겠다.
제일 고생 많이한 삽질 1위는 배포시 aws ec2 환경변수 설정에 대한 부분이다.
서버를 ec2로 배포하면서, 환경변수 설정에 대한 고민이 많았다. env파일을 ec2 인스턴스(대여한 가상 컴퓨터)에 심어버리는 것도 파일이 털릴 수 있는 위험이 있다고 판단해, 인스턴스 자체에 변수를 심어버리고자 etc/bash/bash.bashrc에 소셜 로그인에 필요했던 구글과 카카오 key 값들, db 정보들 등을 설정해줬다.
그게 큰 뒤통수를 쳤다. 한 번 변수를 심고나니 그 후에 env 파일을 통해 변수를 다른 값으로 할당해도 처음에 심겨진 값으로 적용되어버렸다. 심겨진 값들은 수정도, 삭제도 쉽지 않았다. 결국 env파일에 다른 변수를 이용해 값을 줌으로써 해결했다.
1순위 삽질을 불러 일으켜온 2순위 삽질은 소셜 요청에 필요한 API 클라이언트 key들을 여러 팀원들 것들로 바꿔갈아끼우며 테스트를 한게 화근이 된 것이다.
로컬에서 테스트를 하면서 발생한 에러들을 해결하고자 API key들을 여러 사람들 것으로 교체하는 일이 있었다. 결국에는 이게 누구의 고유 key인지도 모르는 일이 배포할 때 발생했고, 키 값들이 바뀌다보니 1순위의 '변수가 틀어져서 발생한 오류'도 나오게 되었다.
정말 왠만하면, 미친듯이 요청을 보내는 것이 아니라면, API key는 잘못한게 없다. 한 사람 것만 약속해서 박아놓고 쓰자. 여럿 사람 것으로 갈아끼우지 말자.
3순위 삽질은 귀에 딱지가 앉도록 들었던 cookie의 sameSite:'none' 설정 옵션이었다.
로컬 테스트를 하면서 터졌었다. 서버 단의 cookie 설정 옵션에서 sameSite 옵션을 놓쳤었다. 20년 4월에 배포된 크롬80부터, 쿠키의 sameSite 옵션 default 값이 'none'에서 'lax'로 변경되었다. 'lax'설정은 'strict'설정에서 몇 가지만 예외하는 옵션이기 때문에 크로스 사이트를 허용하려면 꼭 'none'설정을 줘야한다. 그걸 놓쳤다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 정말 자괴감 드는 이슈였다 ㅠㅠㅠㅠㅠ 멍청이........ 이젠 정말! 실수하지 않을 거다 ㅠㅠㅠㅠㅠㅠ
4순위는 DB의 외래키 설정 이슈였다.
sequelize를 이용해 테이블 간 관계설정을 하면서, 외래키가 될 컬럼을 직접 생성/설정 했었다.
그런데, 우리가 생성한 컬럼이 아닌 다른 컬럼이 추가로 db에 자동 생성이 되버리는 이슈가 있었다. 알고보니, 관계를 설정하면 자동으로 외래키가 되는 컬럼이 생겨서 직접 컬럼을 생성하지 않아도 되는 것이었다. 직접 생성했던 외래키를 삭제하면서 이슈는 해결되었다. 앞의 삽질에 비해서는 생각보다 빨리 해결되어서 4순위로 선정했다. (ㅎㅎ)
외부의 API를 이용해 정보를 받아오는 경우, http 환경의 요청은 받지 않는 곳들이 많다. (local 제외)
API 이용시 꼭 확인을 해보아야 하며, 그래서 배포는 왠만하면 https로 하는 편이 좋다고 생각한다.
위와 같은 이슈로, cookie의 sameSite: 'none' 옵션도, https이거나 프록시 설정이 있어야만 먹힌다고 한다.
Server와 DB 연동시 사용되는 환경변수 중, aws region 변수는 ""(따옴표) 처리를 해줘야한다.
url을 쓸 때, 그 뒤의 router가 확실히 존재하는 경우가 아니라면, 쓸데없이 '/'를 붙이는건 자제하자. 2중 슬래쉬로 먹히는지, 이것 때문에도 이슈가 발생했다.
sequelize의 destroy 메서드를 이용해 data를 삭제하면, 그 row가 사라지는 것이 아니라, deletedAt에 삭제 시간이 찍힌다. deletedAt에 시간이 찍힌 data는 find 할 때 자동으로 제외된다.
(+ force: true 속성을 사용하면 아예 지워버리기도 가능하다.)
mysql의 default Timezone은 미국이다. 한국시간으로 바꾸려면 +9시간 설정을 따로 추가해야한다.
클라이언트 s3를 CloudFont를 이용해 https로 배포시, 파일 수정이 즉각적으로 반영되지 않는다. 수정을 위해 파일을 재업로드 시, 실제로 파일이 반영되려면 좀.. 기다려야한다.
프로젝트 기능을 위해 http에서 https로의 배포로 급히 전환하면서 ec2(서버)에서는 Route53, s3(클라이언트)는 CloudFont를 이용했다. 처음 다뤄보는거라 팀원 모두가 새벽까지 매달리면서 배포를 했었다. 쉽지 않았지만, '함께'의 힘으로 https의 성공적인 배포가 가능했다. AWS의 보다 많은 서비스를 다뤄볼 수 있어서 값진 경험이었다.
팀 커뮤니케이션 : 나는 이때까지 커뮤니케이션에 꽤 자신있다고 생각해왔는데, 이번 기회를 통해서 커뮤니케이션이 절대 만만한 것이 아니라는 것을 느꼈다. 의견을 나누고 소통하는 것을 넘어서, 프로젝트(업무) 진행을 위한 팀 단위의 커뮤니케이션은 이때까지 페어 프로그래밍을 하던 소통과는 전혀 결이 달랐다.
팀 단위에서의 프로젝트를 위한 커뮤니케이션은 늦지도, 이르지도 않은 알맞은 타이밍에 이루어져야 효율적일 수 있었다. 이번 프로젝트에서는 그걸 제대로 못 한 것 같다. 프론트와 백 각각의 프로젝트 구조에 대해 충분히 함께 논의하지 못했고, 프로젝트 중간에 서비스 기획과는 다른 방향으로 이루어진 부분들을 발견했다. 애초에 SR을 꼼꼼하게 하지 못한 것도 한 몫 했다. 프로젝트라는 것 자체가 익숙하지 않아, 실수도 하고 팀 커뮤니케이션도 미숙했던 부분들이 있었다.
그럼에도 불구하고, 팀원 모두가 마지막까지 프로젝트에서 발생한 이슈를 해결하기 위해 힘을 합쳤고 배포와 발표준비까지 성공적으로 할 수 있었다.
Final 프로젝트를 더 성공적으로 하기 위한 시행착오를 겪었고, 그로부터 많은 교훈을 얻어 다음 프로젝트로 넘어갈 수 있기에 정말 값진 시간이었다고 생각한다.
개인 여가시간 : 프로젝트란게 처음이기도 하고, 성공적으로 해내야한다는 생각에 밤낮 스케줄 없이 매달렸다. 눈 떠있는 시간은 모두 프로젝트에 쏟았고, 잠을 자기 위해 눈을 감아야 퇴근이었다. 그래서 이머시브 코스를 시작하고 꾸준히 지켜왔던 주 3회 운동을 프로젝트 마무리 기간에는 지키지 못했다. 내가 맡은 task를 시간안에 해내야한다는 생각과 개인적인 운동시간 정도는 있어도 되지 않나 하는 생각이 많이 부딪혔다. 밀린 운동은 프로젝트 끝나고 그만큼 채우면 되지만, 사실 밤낮 정해진 일정 없이 눈뜨면 프로젝트에만 매달려있다는 것은 바람직하지 못하다고 생각한다. 개인과 조직 두 입장 모두에게 말이다. 아직 미숙함 때문에 스스로 조절하지 못한게 크다고 생각한다.
이것도 교훈삼아! Final 프로젝트 때는 운동시간 정도는 확보하는 워라밸(?)을 사수해보려한다!
학교를 졸업한지 1년, 정말 오랜만에 무엇인가에 매달리고 몰두한 것 같다. First 프로젝트가 끝나고, 학교 졸업 전 마지막 기말고사를 불태우고 난 후의 공허함과 시원섭섭함이 몰려왔다.
그러나, 이런 감정들에 잠겨 있을 시간이 없다. 이틀 뒤 바로 Final 프로젝트가 시작된다.
잘 해낼 거고, 잘 해내야만 한다! 복잡미묘한 감정은 잠시 잊고, 다시 대장정의 프로젝트에 몰입할 수 있는 컨디션을 만들어 놓아야겠다.
더해서, First 프로젝트는 너무 정신도 없고 빡빡한 일정을 소화하기에 바빠 TIL이나 TWIL을 전혀 ㅠㅠ 하지 못했다. 물론, 변명이다. 😢
Final은 4주의 긴 시간이니, 블로깅도 놓치지 않아야 한다. 흐어..
이제 진짜 마지막이다. 이때까지 해온대로, 끝까지! 잘 해내자 정빈!!!!!!!!!!! 💪🏻👏🏻🏎🏃🏻♀️
2주 동안 너무 고생하셨습니다!
정빈님 덕분에 너무 재밌게 2주 프로젝트 진행했던거 같아요!!👍👍
4주 프로젝트도 화이팅!💪💪💪