한국대학생IT경영학회 큐시즘 24기에서 많은 것을 배웠습니다!
그 중 가장 기억에 남는 활동은 2개월(정규기간) + 4개월(추가), 총 6개월 간 진행된 Hurry up, HUP!이라는 프로젝트입니다!
이번 포스팅에서는 HUP! 프로젝트 회고록이라는 주제로 작성해보겠습니다.
기획자3, 개발자4, 디자이너1명으로 이루어진 팀으로 시작했습니다.
어떤 주제로 프로젝트를 진행할 건지 팀원들끼리 상의한 후, 서로 소통하며 주제를 고도화시켜나갔습니다.
디자이너분께서 기획자, 개발자분들과 소통한 후 아이템포스터를 제작해주셨습니다!
실시간 중고 경매 플랫폼이라는 주제로, 경매에 참여하는 사용자들에게 입찰 내역을 실시간으로 보여주자! 라는 생각에서 고안된 아이디어입니다.
기획자, 디자이너, 개발자가 각각 나누어져있다보니 개발자인 저는 개발에 조금 더 집중할 수 있었습니다.
개발자 4명은 백엔드 2명, 안드로이드 2명으로 나누어졌습니다.
아무래도 4명 모두 개발에 익숙하지 않았던 상황이다보니, 협업도구는 어떤걸 사용할지 많은 고민등을 했습니다.
많은 고민끝에,, 형상관리는 깃과 깃허브, 소통도구는 Slack, 일감관리는 Jira를 사용하기로 결정했습니다.
이런 도구들을 통해 발생한 문제들을 쉽게 확인하고, 일감분배를 효율적으로 진행할 수 있었습니다.
저는 백엔드 개발과 서버 인프라를 담당했습니다.
HUP의 아키텍쳐는 다음과 같습니다!
기본적으로 안드로이드와 백엔드는 REST API, WebSocket API를 이용해 통신합니다.
실시간입찰기능, 채팅기능, 채팅방참여 등등의 웹 소켓이 필요한 통신은 WebSocket API를 이용했고 나머지 기능들은 REST API를 사용했습니다.
네이버로그인, 카카오로그인, 구글로그인을 위해 안드로이드와 백엔드는 OAuth2를 사용하였고 HUP서비스 자체의 회원관련인증은 Mail 인증을 사용했습니다.
낙찰자와 판매자에게 푸쉬알림을 주기 위해 백엔드와 안드로이드는 FCM과 통신하고, 백엔드의 RDBMS는 MariaDB를 사용했습니다. 추가로, HUP은 토큰기반의 인증을 사용하는데, 리프레쉬토큰을 저장하기위해 NoSQL인 레디스를 사용했습니다. 그리고 이미지들을 따로 EC2에 저장하는게 아니라 Amazon S3에 저장했습니다.
HUP CI/CD Pipeline은 다음과 같습니다.
이 부분은.. 정말 많인 고민을 했습니다. 기존에 자바, 스프링부트기반의 기능들을 구현하는것만으로도 많은 걸 배웠다고 생각했지만.. 클라우드 환경에서 서버를 배포하는 과정에서 정말 많은 경험들을 해볼 수 있었습니다.
서버 인프라를 구축하기 위해서,, 최소한의 비용으로 최대한의 효율을 끌어내려고 많이 노력했습니다.
웹 환경에서 작동하는 Github Actions를 사용할 수 있었지만, 설치형 빌드자동화 도구인 Jenkins를 경험해보기 위해 따로 EC2를 하나 더 만들어 보기도 했고, 어떤 환경에서든 작동하는 컨테이너를 제공하기 위해 Docker를 사용했습니다..
CI/CD 환경을 경험해보며 내가 지금 공부해야 하는 것들이 무엇인지 많이 알 수 있었습니다.
리눅스 명령어와 환경에 대한 이해, 격리된 컨테이너인 Docker에 대해 학습이 필요함을 느꼈습니다.
그래서 인프런을 통해 Docker강의를 찾아보기도했고, 리눅스 명령어들을 이해하기 위해 구글링을 하기도 했습니다.
인프라를 구축하면서 많은 고민들을 추가로 했습니다.
1. 더 많은 인프라 비용이 있었다면 서버를 이중화(Active/Active, Active/Stand by)하고 EC2에 스프링부트서버, MariaDB, Redis를 한꺼번에 올리는게 아니라 각각의 EC2에 나눠서 배포할 수 있지 않을까..?
2. 더 나아간다면 모놀리식 아키텍쳐를 MSA로 나눠갈 수 있지 않을까..?
3. 쿠버네티스를 이용해 도커를 좀 더 편하게 관리할 수 있지 않을까..?
4. 이미지를 EC2서버에 저장하는게 아니라, AWS S3에 저장할 수 있지 않을까..?
HUP의 기술스택입니다.
개발언어는 자바를 사용했고 프레임워크는 스프링부트를 사용했습니다. 빌드도구는 Gradle, 데이터접근기술은 JPA, API명세서는 Swagger를 사용했습니다.
로그를 남기기위해 Log4j, 개발을 편하게 하기 위해 Lombok, RDBMS는 Maria DB, 컴파일 시점에 오류를 잡고 동적 쿼리를 편하게 작성하기 위해 Querydsl, 토큰기반으로 여러가지 필터를 이용해 보안성을 높이기 위해 Spring Security와 JWT를 사용했습니다.
소셜로그인을 위해 OAuth2, RESTful한 API를 구현하기 위해 Hateoas, WebSocket을 사용하기위해 STOMP, 리프레쉬 토큰을 저장히기 위해 Redis, 푸쉬알림을 구현하기 위해 FCM을 사용했습니다.
인프라는 어떤 환경에서든 독립적으로 실행할 수 있게 하는 Docker, Docker이미지를 저장하기 위한 Dockerhub, 설치형 빌드자동화도구인 Jenkins, IaaS는 AWS EC2, 이미지를 저장하기 위해 AWS S3를 사용했습니다.
이런 기술스택들은 깃허브에 오픈소스로 많이 올라와있는 프로젝트들을 참고하여 많이 사용되고 최신기술들을 사용해보려고 노력했고, 그 과정에서 어떠어떠한 이유들로 사용되는지 이해할 수 있었습니다.
2개월간의 큐시즘 학술제 기간동안,, 배포는 하지 못했지만 마음이 맞는 안드로이드 팀원과 4개월 간 추가로 진행하며 배포를 자동화하고, 정말 많은 기능들을 추가로 구현해보고 경험해볼 수 있었습니다!
그리고 마지막으로, GooglePlayStore에 배포해 볼 수 있었습니다!
21년 9월달부터 시작해 22년 4월달까지.. HUP을 고도화하기 위해 많은 노력들을 하고, 여러 기획자, 개발자, 디자이너들과 소통해보고.. 많은 성장을 할 수 있었습니다!
하지만, 이 글을 쓰는 시점인 22년 8월달에, 22년 4월달까지 진행한 프로젝트를 보면.. 더 나은 방향을 위해 고쳐야 할 부분들이 많음을 느낄 수 있었습니다..
1. 여러명이서 코드를 작성하기 때문에 해당 클래스 단위, 혹은 메서드 단위로 주석을 달아 파라미터 값, 리턴 값, 변수 명, 작성자등을 알 수 있게 작성할 것!
2. 인프라 비용이 더 있었다면.. 서버를 이중화하고(Active/Active, Active/Stand by), 하나의 EC2에 여러개의 Docker컨테이너를 넣기보다 하나의 EC2에 한개의 Docker컨테이너를 넣어 장애에 쉽게 대응할 수 있게할 것!
3. RDB를 구축할 때,, HUP DB는 자동으로 Pk에 Index를 달지만, 자주사용되는 컬럼에 인덱스를 추가로 달아 성능에 신경쓸 것!
4. 컨트롤러와 서비스코드를 작성할때, 정답은 없지만 일관성 있게 작성할 것!(어떤 도메인은 컨트롤러에 서비스 로직을 넣고, 어떤 도메인은 컨트롤러에 컨트롤러 로직만 넣고..)
5. 에러처리를 할 때 기존 상태코드를 활용하되, 커스텀 상태코드를 사용해 효과적으로 에러처리 할 것!(지금은 수정완료)
6. Junit, Mockito를 이용해 단위 테스트 코드를 작성할 것!
7. 동적쿼리를 이용해, 기존의 쿼리들을 줄이고 효과적으로 작성할 것!
8. 쿼리를 작성할 때, 인덱스를 타지 않는 '%jungwoo%'와 같은 로직이 없는지 검토할 것!
위와 같이 많은 문제점들을 확인해볼 수 있었고 앞으로 사이드 프로젝트를 진행한다면.. 위와 같은 문제점들을 겪지 않을 수 있을거라 확신합니다!
안드로이드 깃허브: https://github.com/Kusitms-8Seconds/HUP-App
백엔드 깃허브: https://github.com/Kusitms-8Seconds/HUP-Server
추가로,, 모르는 사람들의 좋아요와 포크를 보며 뿌듯함을 느낄 수 있었습니다!
'회고록' 카테고리의 다른 글
갑진년 연초 회고록 : 게임회사의 게임서버개발자 1년 돌아보기 (2) | 2024.02.26 |
---|---|
[Project] 연합동아리 잇타, 이삼이상 회고록 (0) | 2022.08.19 |
[Project] 교내 팀 프로젝트, Tlover(트러버) 회고록 (0) | 2022.08.13 |
[Mentoring] 청년고민해결단 온라인 멘토링 회고록 (4) | 2022.04.02 |