[우아한테크코스 5기] 레벨 3 - 3주차 회고

Glen·2023년 7월 17일
0

회고

목록 보기
18/25

7월 10일 월요일

본격적으로 개발 시작 🧑‍💻

1차 데모 데이가 끝나고 월요일이 밝았다.

주말에는 데모 데이 기간 동안 한 것도 없지만 신나게 놀았다. 😂

토요일에는 피플행복 근로팀과 회식을 했는데, 새벽까지 신나게 술을 마셨다.

저번 주에 잠실에 있어서 생일 축하를 못 해줬던 하마드가 케익도 사줘서 더 신나게 놀았다. ㅋㅋㅋㅋㅋ

일요일에는 술병으로 고생하다가, 14시에 조원들과 온라인으로 모여 API 명세와 코드 컨벤션을 정했다.

월요일에는 조금 일찍 나와 금요일에 작업했던 Issue 생성 시 Slack에 알림을 보내는 기능을 리팩터링했다.

이전 Action은 커스텀으로 메시지를 보내는 기능이 조금 제한적이라, 새로운 Action을 찾아 교체했다.

그리고 점심을 간단히 먹고, 13시까지 시간이 남아서 크루들에게 커피를 내려주는 시간을 가졌다.

그리고 오늘은 UX에 관한 강의가 있었다.

우리가 만드는 프로젝트는 대학 축제의 줄서기에 질린 사용자들을 위한 서비스이다.

즉, 사용자가 우리 서비스에서 원하는 것은 티켓을 발급받는 것이 아닌, 고통스러운 줄서기를 하지 않고 축제를 즐길 수 있는 것이다.

그렇다면 어떻게 해야 사용자가 고통스럽게 줄을 서지 않고 축제를 즐길 수 있게 할까?

단순히 티켓을 지연 없이 빠르게 발급 받고, 인증을 빠르게 하는 것이 사용자에게 좋은 경험을 줄 수 있는지는 잘 모르겠다.

저번에 데모 데이에서 받은 질문과 함께 다시 한번 생각해 볼 필요가 있겠다는 생각이 들었다.

하지만 우선 기능을 구현하는 것이 최우선이니, 추후 추가적인 기획을 할 시간이 있을 때 고려를 해봐야겠다.

강의가 끝나고 15시에 근로 회의가 있어서 당장 팀 회의를 할 시간이 없었다. 😭

근로 회의를 하며 이번에는 어떤 이벤트를 기획해야 할지 생각이 많이 들었다.

프로젝트 기획하느라 머리 빠질 것 같은데, 피플행복 기획도 하느라 진짜 탈모에 걸릴 것 같다. 👨‍🦲

아무튼.. 겨우 16시 30분에 회의가 끝나 겨우 팀 회의에 들어갔다.

회의를 하며 이슈에 2차 데모 데이때 구현해야할 기능들을 명시했다.

그리고 PR을 보낼 때 템플릿도 정하고, PR 요청 및 병합 시 슬랙에 알림을 보내는 기능도 구현했다.

그리고 드디어 백엔드 개발 환경도 구축했다. 😂

아마 내일부터 도메인 및 구조부터 설계할 것 같다.

2차 데모 데이때 구현해야 하는 기능 중 하나가 CI 기능인데, 이전 기수분들이 한 프로젝트를 보고 어떻게 CI를 구현했는지 참고해 봐야 할 것 같다.

아마 초반에는 간단하게 스크립트로 배포 자동화를 하다가 추후 여유가 생길 때 Docker를 사용하거나, Jenkins를 사용하지 않을까 싶다.

내일 강의는 이슈 관리 및 일정 추정 강의가 있는데, 뭔가 도움이 될 것 같다.

뭔가 많이 한 것 같은데, 눈으로 보이질 않으니 조금 답답하다. 😂

7월 11일 화요일

도메인 설계 시작 🎪

오늘부터 비가 주말까지 내린다고 한다.

작년 서울에 홍수가 크게 난 것이 기억나는데, 이번에도 똑같이 홍수가 나려나...

비가 내리는 것은 좋다.

물론 적당히 내리는 비와 에어컨이 틀어져 있고 커피 한 잔이 있는 쾌적한 실내에 있을 때 한해서

그래도 선릉은 지하철에서 가까워서 비를 조금만 맞고 들어갈 수 있으니.. 😂

선릉이 약간 좋아졌다.

아무튼..

그리고 내 하루의 루틴이 생겼다.

2~30분 정도 일찍 등교 후 간단하게 드립 커피를 내려 마신다.

덕분에 하루를 조금 여유롭고 기분 좋게 시작할 수 있는 것 같다.

어제부터, 내일까지는 강의가 연달아 있다.

오늘은 이슈 관리 및 일정 추정에 관한 강의를 들었다.

개발 방법론부터, 어떻게 일정에 맞춰 계획을 설계할지에 관한 강의였다.

의도한 것은 아니었지만, 우리가 진행했던 작업 방식이 모두 애자일 개발 방법론처럼 진행되었다.

물론, 애자일 방법론으로 개발을 진행한다고 프로젝트가 성공한다는 보장은 없지만...

여러가지 시도를 하며, 그것을 통해 얻는 경험이 소중하다고 생각한다.

어디서 공부해서 배울 수 있는 것도 아니니 말이다.

강의가 끝나고 점심을 먹고 팀원들과 설정 파일 세팅 및 코드 스타일 포맷을 적용했다.

설정 파일 세팅은 간단하게 데이터베이스 연결 및 JPA 쿼리 로그 등 간략한 것만 우선 설정했다.

코드 스타일 포맷은 Google Style Guides를 사용했다.

그 뒤 근로 회의가 있어서, 근로 회의를 끝내고 다시 팀원들과 작업을 시작했다.

2차 데모 데이까지 구현해야 할 기능은 사용자가 티켓의 QR 코드를 생성하고, 티켓을 조회하는 기능과 스태프가 티켓의 QR 코드를 검사하는 기능이다.

따라서 그중에서 가장 먼저 만들어야 할 기능을 선택하고, 그에 따른 도메인 설계를 시작했다.

도메인 설계를 통해, 기획에서 보이지 않던 도메인들이 추가되었다.

공연(Stage), 티켓(Ticket), 사용자(Member)는 이미 기획 때 예상한 도메인이다.

티켓은 여러 티켓이 존재하고 (시간대, 재학생용 등)

사용자는 여러 티켓을 예매할 수 있다.

하지만 티켓과 사용자 간의 관계는 N:M이기 때문에 1:N, N:1 관계로 풀어야 했다.

그래서 새로운 도메인인 예매한 티켓(Ticketing)이라는 새로운 도메인이 만들어졌다.

Ticketing이라는 이름은 맘에 들지 않지만, 당장 떠오르는 좋은 이름이 없어 추후 변경하기로 했다.

이 정도면 티켓에 관한 도메인 설계는 끝난 것 같아, QR 코드를 생성하는 작업을 시작했다.

이전에 기획 단계에서는 티켓을 발급할 때, 데이터베이스에 QR 코드에 대한 정보(UUID)와 만료 시간을 저장하고, 해당 정보를 응답으로 보내주려고 했다.

하지만 티켓에 대한 QR을 생성하려고 매번 DB에 정보를 저장하고, 조회하는 것이 큰 부담이라고 생각됐다.

그렇다면 DB를 거치지 않고 어떻게 티켓을 검증할 수 있을까?

나온 결론은 바로 JWT를 사용하는 것이다.

JWT의 특징 중 하나는 정보를 담고 있다는 점과 위조된 토큰인지 검증할 수 있다는 것이다.

주로 인증에 JWT를 주로 사용하지만, 이러한 JWT의 특징으로 티켓을 검증할 때 데이터베이스를 거치지 않고 검증할 수 있기에 더 높은 성능을 기대할 수 있다.

그 뒤 토큰에 어떠한 정보를 넣을지, 유효 시간을 어떻게 할 지 등 세부적인 논의를 진행했다.

중요한 비즈니스 로직이라, 신중할 수밖에 없어 너무 진지한 분위기로 조원들과 논의했던 것 같다.

사실 아직 개발 단계이고, 변경이 아직은 자유롭기 때문에 가볍게 진행했어도 됐을 것 같기도 하고..

혼자서 개발은 많이 해봤지만, 이렇게 제대로 된 협업을 진행하는 것은 처음이라 낯설고 항상 실수하는 것 같다.

그래도 오늘 눈에 보이는 무언가를 진행한 것 같아 뿌듯하다.

7월 12일 수요일

깃 브랜칭 전략 회의 🐙

오늘은 깃 브랜칭 전략에 대해 강의가 있는 날이다.

깃 브랜칭 전략은 이미 2주 차 화요일에 정했기 때문에, 이번 강의의 중요성을 크게 느끼지 못했었다.

하지만, 강의를 들으며 우리가 정의한 깃 브랜칭 전략이 무언가 잘못되었다는 것을 깨달았다.

그리고 어제 깃 브랜칭 전략 강의에 대비해 깃에 관해 복습을 하고 잤다.

그래서 강의를 들으며, 머지와 리베이스에 관한 내용이 나오면 바로 이해할 수 있었다.

기존에 깃을 사용하며 단순한 버전 관리용 도구로 사용했을 뿐, 이러한 전략을 위해 사용해 본 적이 없었다.

이번에 깃 브랜칭에 관한 미션도 공개되어서, 우선 점심을 먹고 미션과 회의를 진행하기로 했다.

평소에 나는 도시락으로 점심을 해결하여, 회식 때를 제외하고 팀원들과 같이 식사할 자리가 없었다.

그래서 오늘부터 주마다 하루는 다 같이 점심을 먹는 날 정하기로 추진했다.

간만에 조원들과 다 같이 모여 식사를 하고, 잠깐의 휴식 후 미션을 진행했다.

미션의 요구 사항은 총 3단계로 이뤄져 있었다.

1, 2단계는 비교적 수월하게 이뤄졌지만, 3단계가 문제였다.

우리 프로젝트는 백엔드와 안드로이드 작업물이 하나의 레포지터리로 관리되고 있다.

따라서 분야별 기록이 나눠지지 않고, 하나의 브랜치에 섞이게 된다.

이때 생기는 문제점이 안드로이드가 스프린트 1의 개발을 모두 완성하고, 백엔드가 스프린트 1의 개발을 끝마치지 못한 상황이라면? (이때 개발된 작업은 dev 브랜치에 병합)

백엔드의 완성을 안드로이드가 그동안 기다려 줄 수는 없으니, 안드로이드는 스프린트 2의 개발에 들어갈 것이다.

그리고 백엔드가 뒤늦게 스프린트 1을 끝내고 dev 브랜치에 병합 후 dev 브랜치를 main 브랜치에 병합하려고 하면 문제가 발생한다.

안드로이드가 만들고 있던 미완성된 스프린트 2의 기능들이 main 브랜치에 포함이 될 수 있다.

따라서 긴급하게 깃 브랜칭 전략을 수정하고 새로 작성하기 위한 긴급대책회의에 들어갔다. 😱

긴 시간의 회의 후 기존의 브랜치 전략을 파기하고, 새로운 브랜치 전략을 세웠다.

![[branch-tactic.png]]

세운 전략은 다음과 같다.

main 브랜치는 배포 기준으로 한다.
dev 브랜치는 신규 기능 브랜치에 대한 시작점이자 합류점으로 한다.
feat 브랜치는 dev에서 분기하며, 기능이 완성되면 dev 브랜치에 squash merge를 통해 병합한다.
hot-fix 브랜치는 main에서 분기하며, 기능이 완성되면 main 브랜치에 squash merge를 통해 병합한다.

깃 브랜칭 전략을 다시 정하고 난 뒤 다들 진이 빠져서, 기능 구현을 할 상태가 영 아니었다. 😂

그나마 남아있는 힘으로 겨우 JPA 미션을 수행하고 부족한 나머지 부분은 내일 마무리하기로 했다.

이번에 세운 전략이 과연 우리에게 어떠한 결과를 가져다줄지 기대가 된다.

문제가 발생하지 않는다면 잘 작성한 전략이지 않을까..?

7월 13일 목요일

기능 구현 시작 🚀

어제 JPA 미션을 하며, 도저히 예측이 안 되는 예외가 계속 발생하여 진땀을 흘렸다.

어찌어찌 겨우 해결은 했지만, 전혀 석연치가 않아 집에서 어떻게 예외가 발생했는지 나름 정리를 했다.

그 덕에 새벽 늦게 잠이 들어, 오늘 컨디션이 매우 좋지 않았다. 😂

그래도 나름 JPA의 세부 동작에 대해 알 수 있어서 큰 수확을 했다.

하지만, 나는 팀에 속해 활동해야 하므로 내가 나쁜 컨디션을 유지하여 회의에 참석한다는 것은 결과적으로 팀에 악영향을 끼친 것이다.

그 때문에 앞으로 내일을 생각하지 않고 무리하게 무언가를 하지 않도록 주의해야겠다. 😭

오늘부터 일주일간 강의가 없기 때문에 앞으로는 쭉 프로젝트에 집중할 수 있을 것 같다.

데일리 미팅이 끝나고 프로젝트 작업을 하기 전, 어제 내가 정리했던 예외 상황들을 조원들에게 공유하는 시간을 가졌다.

그리고 화요일에 만들었던 도메인 모델을 기반으로 어떻게 기능을 구현할 것인지 회의 겸 몹 프로그래밍을 진행했다.

코드 컨벤션부터 시작하여, 어떻게 의존성을 갖지 않게 객체 지향적으로 설계할 것인지에 대한 논의가 많이 오갔다.

몹 프로그래밍을 하며 좋게 느낀 점은 의견 공유가 정말 활발하게 이루어져 결과적으로 품질이 좋은 코드를 완성할 수 있다.

그렇다고 그것이 완벽한 코드는 아니다. (사공이 많으면 배가 산으로 가니까...)

나쁘게 느낀 점은 기능을 개발하는 데 있어, 여러 간섭이 많이 발생하여 구현에 대한 속도가 매우 느려졌다.

추후 리팩토링을 하며 개선해도 될 작업인데, 보는 눈이 많다 보니 사소한 실수라도 눈에 띄기 때문이다.

아직 기능 구현이 처음이기도 하고, 코드 컨벤션을 정할때는 몹 프로그래밍을 하는 것이 좋다고 생각해 2차 데모 데이 전까지는 몹 프로그래밍으로 진행을 해보는 것이 좋을 것 같다.

대략 어느 정도의 가닥이 잡히고 난 뒤 제출했던 JPA 미션의 리뷰가 달렸다는 알림이 와서, 잠깐의 휴식 후 JPA 미션을 진행하기로 했다.

조원 모두 JPA 공부를 해놓은 상태라, JPA 미션의 중요도는 낮지만, 미션을 통한 리뷰와 JPA를 사용하여 비즈니스 로직을 도메인에 구현했을 때의 장점을 눈으로 보고 싶어 금요일이 되기 전 최대한 JPA 미션을 구현하기로 했다.

18시가 되기 전 겨우 피드백 받은 내용을 반영하고, 무사히 제출했다.

금요일까지 프로젝트의 기능을 구현하면서 JPA 미션 3단계를 진행 시킬 수 있을지 모르겠다...

7월 14일 금요일

티켓 QR 생성 기능 구현 🎟

오늘은 강의가 없어, 오전부터 다 같이 어제 미완성했던 프로젝트의 기능 구현에 집중했다.

이전에 도메인 클래스를 잘 설계했는지, QR 코드를 생성하는 기능은 크게 시간이 필요하지 않았다.

스프링 부트 3.0 버전을 사용하고, 자바 17 버전을 사용하느라 기존에 바뀐 여러 라이브러리 의존성을 수정하는 데도 시간이 크게 들지도 않았고..

오히려 자바 17을 사용하며 얻어 가는 점이 많았다.

자바 17부터 Apple Silicon을 정식으로 지원한다고 하는데, 정말 이것 때문인지 몰라도 테스트를 구동하는 속도가 눈에 띄게(거의 3배 정도) 빨라졌다.

특히 이번에 DTO 클래스를 Record 클래스를 사용하여 더 간편하게 정의할 수 있었다.

다른 건 몰라도 속도가 빨라진 게 제일 맘에 든다. 👍

화요일에 정했듯, QR 코드의 정보를 JWT를 통해 관리하기로 했기 때문에, JWT 라이브러리 의존성을 출가하고 토큰이 제대로 생성되는지 테스트를 만들었다.

예전에 처음 JWT에 대해 배웠을 때가 새록새록 떠오른다.

그때는 개발 경험도 거의 없을 때고, 보안이 어떻게 돌아가는지 모르고 있었던 때라 굉장히 이해하는데 힘들었다.

아무튼.. 지금은 JWT가 어떻게 이뤄져 있고 어떻게 인증을 수행해야 하는지 잘 알기 때문에 큰 어려움은 겪지 못했다.

16시쯤 API 설계와 테스트 코드 작성을 마무리하고, 해당 이슈에 대한 PR을 머지시켰다.

그리고 오늘까지 JPA 미션의 리뷰 요청을 받기 때문에, 부랴부랴 급하게 3단계 미션을 수행했다.

1, 2단계는 단순히 JPA 엔티티 적용과 연관 관계 매핑을 하는 게 전부라 얻어 가는 게 없었지만, 3단계부터 도메인에 비즈니스 로직을 구현하며, 서비스 레이어는 단순히 리포지터리에 있는 객체를 꺼내고 메시지를 호출하고 저장하는 계층으로 변하게 된다.

이전 지하철 미션을 JPA로 다시 구현해 보며 도메인에 비즈니스 로직을 설계하는 것이 좋아 보였는데, 이번에는 리뷰를 통해 이것이 정말 좋은 방법인지 피드백을 받을 수 있어 많은 것을 얻어 갈 수 있을 것 같다.

일정이 끝나고 18시에 잠실로 가서 백엔드 크루인 매튜와 저녁을 먹기로 했는데, 매튜가 건강 이슈로 인해 병원에 가게 되어, 혼밥을 해야 하나 싶을 때 용인에 있는 친구에게 연락이 와서 저녁은 용인으로 가서 먹었다.

집 주변에 대형마트가 없어, 친구 차를 타고 마트를 들러 수제 맥주도 여러 병 구매했다. 🍻

길지만 짧은 한 주가 끝났다.

잠깐 생각해 보면 시간이 정말 빠르게 흐른 것 같은데, 회고를 돌아보며 많은 일이 있었고, 긴 시간을 보냈다는 것을 느끼게 된다.

바빠서 그런지 정신이 없다. 😂

토요일에 크루들과 방탈출을 하기로 했는데, 처음 해보는 공포 테마라 더 기대된다.

주말 동안 신나게 놀고 컨디션을 좀 회복하고 다음 주에 최상의 컨디션으로 한 주를 보내야겠다.

profile
꾸준히 성장하고 싶은 사람

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정보가 많아서 도움이 많이 됐습니다.

답글 달기