2024년 부산 ICT 해커톤 회고
부산 범내골에 있는 부산상공회의소에서 ICT 공동해커톤이라는 대회에 학교 대표로 참가하게 되었다. 부산에서 대표하는 각 대학교별에서 대표팀들이 출전한다. 팀원들은 학부연구실에서 만나 같이 활동하는 친구들이다. 나는 API 서버 개발을 맡게 되었고, 프론트엔드, UI/UX 디자인, 기획 이렇게 각각 1명의 스쿼드로 4인 팀을 이루게 되었다. 각 포지션별로 1명씩 진행하다보니 문제가 발생했을때 어떻게 해결해나갈지, 소통을 어떻게 할지 미리 얘기해둔바는 없었다. 해커톤에 참가하기전까지 3학년까지 공부해오던 학과에서 배운 지식과 기술스택들을 뽐내볼 수 있는 기회라고 생각되었다. 해커톤은 오후13시부터 진행되었고, 각 팀별로 가져온 대표 아이디어들을 돌아가면서 발표하였고, 진행 도중 음료수 교환권을 제출하며 수분을 보충하였다. 내가 생각했던 해커톤과는 달랐던 것이, 해커톤 당일 장소에서 아이디어를 랜덤으로 선정하는 것이 아닌, 각 팀마다 미리 아이디어를 들고온다는 것이었다. 우리 팀의 아이디어는 부산 공유대학의 타 대학 강의를 들을 수 있도록 도움을 주는 서비스 '수업 리뷰 사이트' 였다. BITS라는 부산 공유대학 사업과 연계하여 해당 사업을 기점으로 타 대학의 강의 후기, 선배들의 후기를 관리하고 선후배간의 후기를 공유하는 목표이다.
작업내용
기존의 작년 창업동아리를 진행하면서 기본적인 수강 후기 관련 기능과 학생 정보 관리 기능들은 구현이 완료된 상태였다. BITS 사업과 연결 짓기 위한 타대학들 간의 유연한 변경을 위해 UI 리뉴얼이 이루어지고, 타 대학 강의 정보들의 데이터들이 스위칭 가능하도록 DB 모델 변경, 도메인 수정이 필요한 상황이었다. 작년 12월에 완성해둔 스프링 프로젝트를 리뉴얼 하기 위해서 사전에 선배에게 받은 코드 리뷰 내용이다.
- 기존의 계층 구조는 잘 이루어지고 있는가?
- 필요 없는 주석 처리는 삭제
- 사용하지 않는 코드는 주석처리가 아닌 삭제로 관리, 수정 사항에 대한 것은 커밋으로 관리하는 것이 보기 깔끔
- Optional으로 불러오는 repository는 orElseThrow 사용을 고려
- 사용하지 않는 import는 제거
- Setter 어노테이션 사용 주의
- method 안 코드는 줄바꿈을 하지않고 시작
- 정의, 행위, return (user를 먼저 정의하고, save하는 것을 나타내면 좋음, user에 변수명을 의미에 맞게)
- entity 변수명 정의는 camel case를 지향(snake case보다는)
- import * 사용을 지양
- 클래스명 작명은 줄임말 피하기(어떤 것인지 정확하게 유추가능하도록)
- getter setter 어노테이션 일관으로 맞출지, 일반 메서드로 getter setter를 표현할지 본인만의 컨벤션 가지기
- 정적 상수는 static으로 관리
- Controller에서 많은 일을 부여하지않고 해결할 수 있는 방법 찾기 -> Layered Architecture 구조 지키기, 디미터
- user domain 관련 검증 로직은 user 클래스 에게로 method 작성 (디미터 법칙)
- gitignore을 활용하여 build file, out 파일 불필요한 내용들을 제거해서 코드 형상관리 기여하기
위 내용들을 해커톤 기간동안 리뉴얼에 맞춰서 제공하기로 다짐하였다. 1박 2일의 기간이니 개발 시간이 충분히 있을 것으로 보였다. 기존의 코드를 참고하여 리뉴얼을 진행했다.
낮에는, todo로 빠르게 정리하고 작업에 들어갔다.
약 4-5시간동안의 작업이 진행되었고, 프론트와 연동되어있던 응답 폼을 최대한 흐트러지지 않게 하기 위해서 postman 수동 테스트를 진행하며 변경을 진행하였다.
로그인 기능 개선
원래 로그인 기능에서 token을 직접 util 클래스만을 사용하여 생성과 검증, 파기를 관리하고 있었다. 만료기간 외에는 타 사용자가 토큰을 제시했을 경우, 검증할 부분이 없었다.
Spring Security 아키텍처를 참고하여 UsernamePasswordAuthenticationToken을 활성화하여 util TokenProvider를 연동시켰다.
해당 서비스에서는 아이디를 학번으로 받고있기 때문에 UserDetailsService의 loaduserByUsername 메소드를 오버라이딩하여 nickname에서 학번으로 검증하도록 코드를 재작성하였다.
에피소드1
낮 오후부터 저녁 전까지는 우리 팀은 매우 시끌시끌하였다. 피그마와 노션을 오가며 이게맞다 저게맞다 서로 의견을 꺼내며 분쟁이 일어나기 바빴다.(물론 서로 즐겁게 ㅎ) 리뉴얼 작업을 준비하면서 나도 동참하였고, UI/UX 적인 부분 보다는 화면이 변경되면 API ROUTE도 변경될테니 그 부분을 중요시 여기며 화면마다 필요한 데이터들을 재정리하였다. 상공회의소의 저녁은 건물 내의 식당을 찾아가 먹게되었다. 식당은 매우매우 맛있었다. 이모님께 고기많이 달라고 부탁을 하며 3번 왕복하였다. 상추와 고기의 조합은 대단하였다. 쌈장까지 기가막히게 얹어먹으며 포식을 진행했다. 저녁을 먹고난 우리 팀은 배가 부르기도 하고 머리에 힘이 풀리며 조용한 분위기가 형성되었다. 주변 팀들은 이때쯤 서서히 시끌해지는 팀도 있었던 반면, 우리팀은 하락세로 이어졌다. 밤이 되자, 정신을 잃는 팀원이 생기기 일수였고 나또한 비몽사몽한 시야로 키보드 자판을 두드리며 리뉴얼 작업을 이어나갔다.
에피소드2
이 대회에서는 비즈니스 모델과 수익화에 대해서 멘토링을 진행한다. 우리는 비즈니스 모델이 약하다는 평을 많이 받았다. 수강 후기 데이터의 신뢰성은 어떻게 보장할 것인지 수익화는 어떻게 이끌어낼 것인지 고민이 되었다. 우리팀은 낮에 열띤 토론의 주제로 이어졌고, 세가지 방법을 찾았다.
- AI 모델을 통한 수강후기 데이터 학습 후 키워드를 추출하여 분석 시각화
- 수강 후기 작성 시, 욕설 감지 모델을 적용하여 필터링을 진행
- 선후배 간의 학과 공부, 취업까지의 연장선을 제공하는 커리큘럼
멘토님은 나쁘지 않다는 말씀을 해주셨고, 앞으로 개발자로써의 도움될만한 내용들을 많이 알려주시면서 진로 상담도 도와주셨다. 위 세가지 방법은 이번 대회에서 기획과 디자인 연계까지 진행되었고 나는 리뉴얼 작업 후에 연장선으로 추가 기능 구현이 필요한 상황이 되었다. (새벽 3시넘어서 결국 성공함..)
해커톤 후기
해커톤을 밤을 새며 1박 2일을 진행하니, 몇가지 깨달음을 얻었다. 정신이 매우 피곤하고 쇠약한 상황에서의 코드 작성 능력도 이런 불타오르는 속도전 개발에 굉장히 중요하다는 것을 꺠달았다. 나는 피곤한 상태에서 코드를 작성해본적이 없었고, 이번에 처음 경험하게 되니 앞으로 개인적인 훈련?이 필요하다는 것을 알았다. 서버 재배포를 피곤한 상태에서 진행하니 오타가 자꾸 일어나기 일수였다. 나는 커맨드를 직접치며 도와주고 있었고 스크립트로 자동화해뒀으면 좋았을것이라는 생각이 지워지지 않았다. 해커톤에 오면 맛있는 것을 매우 많이 먹을 수 있다. 그리고 옆 대학교 분들의 열정넘치는 개발 현장의 분위기를 같이 느끼며 작업을 하니 동기부여도 많이되고 즐거운 시간이었다.