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

Glen·2023년 7월 23일
0

회고

목록 보기
19/25

7월 17일 월요일

보람차게 보낸 월요일 🌞

빠르게 지나가는 주말을 보내고 월요일을 맞았다.

토요일에 방탈출을 하고나서, 무언가 아쉬워 빠르게 월요일 오전에 방탈출을 한 번 더 하기로 했다. ㅋㅋㅋ

방탈출 카페로 가는 경로에 지하철을 타는 구간이 없고, 버스를 타야해서 조금 일찍 출발했다.

근데 왠걸, 차가 막히지 않아 약속 시간보다 1시간 일찍 도착해버렸다. 😂

시간이 남은 겸 간단하게 아침을 해결하고, 스타벅스에서 잠깐 프로젝트의 코드를 다시 보며 시간을 때웠다.

그 뒤 약속 시간이 되어, 다 같이 모여 방탈출 카페에 갔다.

토요일에 했던 방탈출은 공포 테마라, 문제의 난이도가 쉬웠는데, 이번은 공포 요소가 하나도 없는데도 문제의 난이도가 쉬웠다.

하지만 상호작용이나 기믹들이 많아 지루하지는 않았다.

난이도가 조금 더 있었더라면 더 재밌었을지도??

아무튼.. 방탈출을 끝내고 캠퍼스로 등교했다.

바로 이번 주 금요일이 2차 데모데이기 때문에 조원들과 바로 데모데이 대비 회의를 진행했다.

백엔드와 안드로이드 분야에서 한 작업들에 대해 진행 상황을 공유하고, 남은 기능들에 대한 우선순위를 정해 구현을 시작했다.

구현하기 전, 이전에 작성한 QR 토큰에 대한 생성 로직을 리팩터링했다.

이전에 작성했던 코드에는 토큰을 생성하는 클래스의 메서드에 토큰의 유효 시간을 파라미터로 넘겼는데, 이 방법을 사용하면 내부에 만료 시간을 설정하는 로직이 들어가게 되고, 또한 현재 시간을 구하기 위해 new Date() 같은 통제할 수 없는 값을 사용하기 때문에 테스트하기가 힘들어진다.

따라서, 해당 클래스가 구체적인 정보를 너무 많이 알고 있다고 생각하여 유효 시간이 아닌, 만료 시간을 파라미터로 받게 변경했다.

그리고 토큰에 들어가는 정보가 많아지면 QR 코드의 복잡도도 같이 증가하므로, 정보를 최소화하여 해당 문제점도 해결하였다.

이렇게 작업을 하고 어느덧 하교할 시간이 되어 짐을 정리하던 중, 집에서 저녁을 차려 먹기 귀찮아 같이 크루들과 저녁을 먹기로 했다.

저녁 메뉴는 저번 주에 못 간 선릉 맛집인 농민백암순대를 먹기로 했다.

맛집인 만큼 웨이팅이 있었는데, 20분 정도 기다려서 먹을 수 있었다.

맛은 여태까지 먹었던 국밥 중 TOP3에 들 정도로 맛있었다. 👍

다만 다대기가 은근히 매워, 다음에는 덜어내고 먹어야겠다..

이번 월요일은 정말 보람차게 보낸 것 같다.

7월 18일 화요일

사용자가 예매한 티켓 조회 기능 구현 🎟

오늘은 데일리 미팅을 끝내고 바로 기능 구현을 시작했다.

남은 기능은 사용자가 예매한 티켓 조회 기능과 스태프가 QR 코드를 검사하는 기능이다.

사용자가 예매한 티켓을 조회해야 해당 티켓을 QR로 보여줄 수 있고, 구현이 간단하기 때문에 조회를 먼저 구현하기로 했다.

하지만 조회를 구현하며, 조회할 때 여러 정보도 같이 전달해 줘야 하는 것을 알아버렸다.

{
    "tickets":[
        {
            "id":1,
            "number":103,
            "entryTime":"2023-07-09T16:00:00",
            "state":"BEFORE_ENTRY",
            "stage":{
                "id":1,
                "name":"테코대학교 축제",
                "startTime":"2023-07-09T18:00:00"
            }
        }
    ]
}

다음과 같이 티켓의 정보뿐 아니라, 공연에 대한 정보도 같이 보여줘야 하므로 생각보다 작업이 길어져 버렸다. 😂

그래도 긴 시간이 걸리지 않아 오후에 마무리할 수 있었다.

그리고 스태프가 QR 코드를 검사하는 기능을 구현했다.

그리고 구현하는 중 여러 이슈들을 만났다.

첫 번째로 JWT 토큰을 파싱하는 과정에서 만료 시간이 지난 토큰은 바로 예외를 발생시켰다.

이것을 모르고, 파싱하고 만료 시간을 추출한 뒤 유효 시간이 지난 토큰이면 예외를 발생하도록 만들었다.

하지만 우리가 던진 예외가 아닌, JWT의 예외가 계속 발생하여 여러 삽질을 하다 결국 원인을 찾아 해결했다.

두 번째로 파싱한 토큰에서 사용자가 예매한 티켓의 Id를 가져올 때 다음과 같이 코드를 작성했다.

Long memberTicketId = (long) ((int) claims.get(MEMBER_TICKET_ID_KEY));

int로 형변환을 한 뒤, 다시 long으로 형변환을 하는 어처구니 없는 코드이다.

다음과 같이 코드를 작성하면 예외가 발생했기 때문에 어쩔 수가 없었다. 😂

Long memberTicketId = (long) claims.get(MEMBER_TICKET_ID_KEY);

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')

하지만 이것이 끝이 아니었는데.. 다음과 같은 상황에선 어떤 결과가 발생할까?

(long) ((int) null);

다음과 같은 예외가 발생한다.

java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "io.jsonwebtoken.Claims.get(Object)" is null

원시형에 null 값을 넣으니 해당 예외가 발생하니 어쩔 수 없이 String으로 받아 다시 String을 Long으로 파싱하는 과정이 필요했다.

하지만 이 과정도 마찬가지로 null 값이 주어지면, NumberFormatException 예외가 발생했기 때문에 지저분한 try-catch문이 들어가야한다.

마땅한 방법이 없나 찾아보던 중, Claims에 다음과 같은 메소드가 있었다.

<T> T get(String claimName, Class<T> requiredType);

ㅋㅋㅋㅋㅋ 역시.. 이럴 줄 알았다.

인텔리제이를 사용해서 사용할 수 있는 메소드를 쉽게 찾을 수 있어 망정이지, 그게 아니었다면 String을 Long으로 변환하는 방법을 사용했을 것이다...

아무튼 이러한 우여곡절을 겪고 남은 기능은 내일 오전에 마무리하기로 했고, 내일까지 작업할 목록을 만들었다.

남은 기능은 티켓 검사의 핸들러 메서드만 추가하면 끝이기 때문에 1~20분이면 끝이고, 데모 시연을 위한 데이터 삽입과 Github Actions를 활용한 CI 기능만 추가하면 최종적으로 모든 작업을 마무리할 수 있을 것 같다.

그리고 집에 가려고 하니, 스터디를 하는 크루들이 간단히 치맥을 하러 간다고 해서 비록 스터디에 참여하지는 않지만, 치맥에는 참여했다. 🍗🍻

치킨과 맥주는 언제나 옳다.

7월 19일 수요일

2차 데모데이 대비 계획 📝

오늘은 2차 데모데이에 앞서 어떻게 진행을 할지 회의를 하기로 했다.

오전에 개인 일정이 있는 조원이 있어서 어제 미완성했던 스태프가 QR 코드를 검사하는 기능을 마무리 했다.

그리고 AWS에 dev 서버와 db 서버를 구축하고 서버를 배포했다.

AWS에 인스턴스를 생성하고 서버를 배포하는 작업은 많이 해봐서 누워서 떡먹기 수준이었다.

CI 작업은 Github Actions를 사용하여 쉽게 구축할 수 있었다.

추후 CD 작업도 Github Actions를 사용하여 구현을 할 수 있을 것 같다.

그리고 주에 한 번 다 같이 점심을 먹기로 하여, 오늘 점심을 조원들과 같이 먹었다.

점심을 먹은 뒤 2차 데모데이에 어떠한 항목을 작성할 것 인지 구체적인 계획을 했다.

정리한 항목들은 다음과 같다.

  • 브랜치 전략
  • 1차 데모 때 소개한 목표
  • 완료한 이슈 / 완료하지 못한 이슈
  • 프로젝트 이슈 관리 방식
  • 3차 데모데이 기능 계획

3차 데모데이 기능 계획을 제외하고는 빠르게 작성할 수 있었다.

우리가 2차 데모데이에 기획을 많이 잡지 않아, 몹 프로그래밍이 수월하게 가능했다는 점은 있지만, 뭔가 크게 기능적인 측면에서 작성한 부분은 보이지 않았다.

따라서 이번에 3차 데모데이에서는 기능 구현에 집중하고, 생산성을 위해 4인 몹 프로그래밍에서 2인 페어 프로그래밍으로 전략을 변경하기로 했다.

그리고 발표자를 선정했는데, 랜덤으로 돌려 애쉬가 발표자로 선정되었다. 👍

내일은 발표용 PPT를 제작하기로 하고, 퇴실했다.

그리고 저번 주에 잠실에서 밥을 같이 먹기로 한 매튜와 드디어 저녁을 먹었다. ㅋㅋㅋ

저번 달에 생일을 못 챙겨줘 미안하다고 밥까지 사준 매튜에게 너무 감사하다.

7월 20일 목요일

2차 데모데이 준비 마무리 🎬

내일이 바로 데모데이 발표일이라, 빠르게 오전부터 PPT 제작을 시작했다.

1차 데모데이 피드백 중 하나가 PPT 디자인에 큰 신경을 쓰지 말라는 피드백이 있어서, 이번에는 정말 대충 디자인을 만들었다. 😂

어제 PPT에 어떠한 내용을 넣을 것 인지 계획을 해뒀기 때문에 PPT를 만드는 데 큰 노력이 필요하지 않았다.

노력이라 해 봤자 역시 디자인적인 요소들...

그리고 오늘 테코톡이 있어 간만에 다른 캠퍼스에 있는 크루들을 만났다.

이전에 커피를 캠퍼스에서 직접 내려 마신다고 했는데, 커피를 좋아하는 크루인 루카에게 특별하게 고오급 원두로 드립 커피를 내려줬다. ㅋㅋㅋ

내가 좋아하는 것을 다른 사람에게 알려주는 것이 나에게는 참 즐겁고 보람찬 일이다.

점심을 먹고, 13시에 3차 데모데이에 구현할 기능에 대해 와이어 프레임 제작을 시작했다.

이제 조원들이 도메인에 대한 지식이 풍부해져 매우 빠르게 와이어 프레임을 제작할 수 있었다.

그리고 14시에 테코톡을 보고 15시부터 다시 작업에 착수했다.

와이어 프레임은 완성이 되었지만, UX 측면에서 거슬리는 부분이 있었고, 해당 부분을 정리하여 최종적으로 완성할 수 있었다.

예시로, 사용자가 티켓을 예매하려고 했을 때 로그인이 되어 있지 않고 예매 버튼을 누르면 로그인이 필요합니다. 와 같은 경고가 뜨는 것보다 애초에 버튼 자체를 비활성화하는 것이 더 좋은 UX 요소라고 판단했다.

그리고 최종적으로 PPT 제작을 완료하고 퇴실했다.

7월 21일 금요일

2차 데모데이 2️⃣

드디어 오늘 2차 데모데이 발표일이다.

그 말은 레벨3를 시작한 지 4주가 되었다는 말인데, 시간이 빨라도 너무 빠른 것 같다.

캠퍼스에 등교하니 일찍 와있는 조원이 PPT에 애니메이션 삭제를 못 해 애를 먹고 있어 빠르게 도와주었다.

우리가 사용하는 PPT 프로그램은 애플의 Keynote를 사용 중이다.

아무래도 Keynote는 국내에서는 사용이 저조하기도 하고, 맥에서만 지원되므로 접근성이 힘들 수밖에 없다.

이전 1차 데모데이에서 애니메이션을 작업해 본 경험이 있어 빠르게 수정할 수 있었다.

이번 데모데이는 오전부터 발표를 시작했다.

그리고 우리가 첫 번째 발표를 맡았다. 😂

그래도 발표자인 베르와 애쉬가 말을 정말 잘해주어서 무사히 발표를 마칠 수 있었다.

첫 번째 발표라 긴장했지만, 첫 번째 발표라 그 뒤에는 편하게 발표를 들을 수 있었다.

그 뒤 발표는 15시까지 쭉 진행됐다.

마지막 조의 발표가 끝나고, 이제 좀 쉬려나 싶었는데...

갑자기 웬걸 발표에 사용된 데모는 녹화한 영상이니 실제로 작업한 증거를 보여달라며 우리가 작업한 결과물을 실시간으로 보여줘야 하는 깜짝 이벤트가 진행되었다. 😂

해당 순서는 발표 진행 순서의 반대로 진행되어 우리 조가 제일 마지막으로 시연을 진행했다.

그래도 거짓으로 완성했다고 속이지는 않아 문제는 생기지 않았다.

하지만 우리의 시연이 끝나는 순간 갑자기 테스트 코드의 커버리지를 확인하고 싶다고 하셨다. 😱

순간 매우 당황했다. ㅋㅋㅋㅋㅋ

테스트 코드를 작성하지 않은 것은 아니지만 갑자기 테스트 코드의 커버리지라니...

다행이 구현하며 테스트 코드는 무.적.권 작성을 했기 때문에 클래스는 100%의 커버리지, 메소드와 라인 커버리지는 80% 정도의 커버리지로 나타났다.

아무튼... 무사히 이번 2차 데모데이를 마무리했다.

그리고 남은 시간 팀원들과 회고하는 시간을 가졌다.

회고를 진행하고 회식을 하기로 한 뒤 신나게 놀다가 헤어졌다.

드디어 다음 주부터 선릉을 벗어나, 다시 잠실로 복귀한다.

고마웠어 선릉.

레벨4 때 다시 만나자.


요즘 회고 작성이 늦어지고 있다.

아무래도 프로젝트 때문에 스트레스를 받아 귀차니즘이 점점 생기고 있는게 아닌가 한다.

2차 데모데이가 끝나며, 조원들의 피드백을 남기는 시간이 돌아왔다.

조원들의 피드백을 남기려고 하니 남길 피드백이 마땅히 떠오르지 않았다.

특히 조원들이 프로젝트에 기여한 부분과 좋았던 부분에 대해 적는데 너무 많이 고민하고 생각을 하게 되었다.

이것은 조원들이 한게 없어서 그런게 아닌, 내가 조원들에게 무관심했던게 아닌가 한다.

이전부터 친구들 또는 사람들과 다 같이 하는 작업을 할 때 경쟁하는 일이 아닌데, 혼자 앞서 나가거나 급하게 일을 처리했던 것 같다.

이번에도 프로젝트를 하며 이러한 행동을 보인 것 같다.

하지만 프로젝트에는 마감 기한이 있어서, 타인을 신경쓰며 천천히 하기에는 그것또한 아닌 것 같다.

이번 3차 데모데이에서 구현해야 할 기능들이 많은데...

이러한 딜레마 사이에서 나는 어떠한 결정을 내려야 할 지 모르겠다.

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

0개의 댓글