프로젝트도 끝난지 2주가 다 돼간다.
기말고사 기간이지만 그동안 어떻게 프로젝트를 진행했는지 포스팅해보려 한다.
참고로 나는 프로젝트 초반에 어떻게 시작해야할지 너무 막막했다.
이에 비슷한 프로젝트를 진행중인 사람들에게 조금이나마 도움이 되면 좋겠다는 마음이다.
물론 어느정도 완성은 했지만 아직 뜯어 고쳐야할 것들이 많다.
실제 서비스까지 하면 좋겠지만, 아직은 실력의 한계때문에 불가하니 참고 정도로 봐주면 좋겠다.
앞으로 해당 프로젝트 관련 글이 많이 올라갈 예정이다.
쓰고싶은 내용이 많다.
1️⃣ 요구 사항 분석
1) 요구 사항 목록
요즘 알고리즘 문제를 많이 풀면서도 느낀 것이지만, 요구 사항을 잘 분석하는 것이 중요하다는 것을 깨닫고 있다.
프로젝트 당시 여러 번의 회의를 거치며 어떤 기능이 필요하고 왜 필요한지, 어떻게 서비스를 제공할 것인지에 대한 고민을 꽤 오래 했었다. 물론 처음부터 완벽하게 알 순 없겠지만, 큼직큼직하게 중요한 기능부터 생각했다.
요구 사항은 크게 '주요 기능', '세부 기능', '요구 사항', '사용 기술 및 부가 설명' 으로 나눴다.
예를 들어 로그인 기능에 대한 요구 사항을 다음과 같이 작성하였다.
주요 기능 | 세부 기능 | 요구 사항 | 사용 기술 및 부가 설명 |
로그인 | 학교 웹메일을 통한 로그인 | [ 필요 정보 ] 1. 학교 웹메일 2. 비밀 번호 |
Firebase |
[ 로그인 화면 아래 버튼 ] 1. 회원 가입 버튼 2. 비밀 번호 찾기 버튼 |
다음으로 회원 가입에 대한 요구 사항이다.
주요 기능 | 세부 기능 | 요구 사항 | 사용 기술 및 부가 설명 |
회원 가입 | 새로운 유저 회원 가입 | 학교 웹메일을 통해 학생 인증 | Firebase Auth |
각 필드에 정보를 입력받음 | [ 필요 정보 ] 1. 이름 2. 학교 웹메일 3. 비밀번호 4. 비밀번호 재확인 5. 학번 6. 전화번호 |
||
회원가입 검증 | 회원가입시 검증을 진행 1. 웹메일은 '@kmou.ac.kr' 형식 2. 웹메일 중복 검사 3. 비밀번호는 8자리 이상 4. 비밀번호 재확인 5. 학번은 8자리 6. 전화번호는 11자리 |
이런 형식으로 요구 사항을 작성하여 노션을 통해 팀원끼리 공유를 하였다.
사실 이렇게 팀단위로 프로젝트를 해본 것이 처음이라 요구 사항을 작성하는 것도 위 방식이 맞는지 잘 모르겠다.
우선은 팀원끼리 혼동하지 않도록 정보 전달을 목적으로 작성하자고 생각했다.
돌이켜 생각해보면 프론트엔드와 백엔드 나눠 작성했다면 훨씬 보기 좋겠다는 생각을 했다.
물론 디자인을 할 때 어느 정도 계획을 세우겠지만, 화면 요구 사항과 기능 요구 사항을 분리한다면 헷갈리지 않을 것이다.
그렇게 요구 사항을 작성하며 도출해낸 필요 서비스 목록은 다음과 같다.
2) 필요 서비스 목록
1. 학교 웹메일로 회원가입 및 로그인
2. 회의실 (스터디 룸), 축구장, 도서관 시설 예약
3. 날짜 및 시간대별 예약 현황 조회
4. 예약 정보 조회
5. 이전 예약 기록 조회
6. 예약 수정 및 삭제
7. 사용자 정보 수정
2️⃣ 기술 스택 선정
1) Front-end
우리는 Android 와 iOS 두 환경에서 모두 실행 가능한 애플리케이션을 만들고 싶었다.
이에 Flutter 와 React-native 중 어떤 것을 선택할지 고민했다.
물론 둘 다 한 번도 사용해본 적 없는 기술이었다. 결국 Flutter를 선택했고 이유는 다음과 같다.
Flutter 는 Google 에서 개발 및 지원하는 오픈 소스 프레임워크이다.
2018년 출시 초기 Flutter는 주로 모바일 앱 개발을 지원했다.
그러나 현재는 iOS, Android, Web, Windows, MacOS, Linux 등 다양한 플랫폼을 지원한다.
찾아보니 Flutter는 크로스 플랫폼 개발 프레임워크지만 네이티브에 가까운 성능을 낸다고 한다.
또한 플랫폼별로 랜더링하지 않고, 구글의 Skia Graphic Library 를 사용하여 UI를 랜더링하여 플랫폼에 관계 없이 일관된 시각적 결과를 도출할 수 있다.
또한 Flutter는 Google이 개발한 오픈 소스 프로그래밍 언어인 'Dart' 를 사용한다.
Dart가 Java처럼 객체 지향 프로그래밍이 가능했기에 단기간에 결과물을 만들어내야 하는 우리는 빨리 배울 수 있는 언어를 선택해야만 했다. 나는 평소 Java를 공부하여 객체 지향에 어느 정도 익숙했고, 금방 적응할 수 있겠다고 판단했다.
이러한 이유들로 Flutter를 선택했다.
Flutter에 대한 자세한 이야기는 다른 글에서 다루도록 하겠다.
정리하면
1. 크로스 플랫폼 프레임워크이지만 네이티브에 가까운 성능을 낸다.
2. 빠르고 일관적이며 랜더링시 사용자 지정이 가능하다.
3. 객체 지향 언어인 Dart를 사용하기에 빠른 시일 내에 적용할 수 있겠다고 판단했다.
4. 애플리케이션이 '위젯(Widget)' 단위로 구성된 것을 알고 흥미를 느꼈다.
2) Back-end
내가 맡은 역할은 백엔드이기 때문에 프론트쪽은 거의 관여하지 않았다.
그나마 나중에 Flutter 에서 http 통신을 위한 코드를 작성한 것 정도?
사실 처음부터 Spring을 사용하려던 것은 아니었다.
이미 졸업한 형들에게도 물어보고 많은 커뮤니티를 찾아봤더니 단기간에 애플리케이션을 만들거면 Firebase 만 사용해도 된다는 말을 많이 들었다.
그래서 Firebase가 무엇인지 부랴부랴 찾아봤더니 갓구글에서 만든 모바일 애플리케이션 개발 플랫폼이었다.
'FirebaseAuth' 나 'FirebaseStore' 처럼 사용자에 대한 인증이나 이메일 인증, 데이터베이스도 지원해주는 엄청난 플랫폼이었다.
그러나 한 가지 문제가 있었다. 예약 시스템을 만들 때 사용자 인증에 대한 부분은 어찌어찌 할 수 있었지만, 예약과 관련된 서비스를 위해선 관계형 데이터베이스가 필요했다. 아무리 생각해봐도 사용자와 예약, 시설물간 관계가 있기 때문이다.
Firebase에서 제공해주는 DB는 NoSQL 기반이었고, 나는 SQL 기반의 DB가 필요했다.
그렇게 프로젝트 시작 전부터 난관에 봉착하며 어떻게 해결해야할지 많은 고민을 했다.
마침 나는 Spring과 JPA를 공부중이었고, 아직 많이 부족하지만 프로젝트에 사용해보면 어떨까 하는 생각을 해봤다.
주변에서 단기간에 무리라고 하였지만, 나는 내가 공부한 기술들을 적용해보고 싶었고, 오기도 생겨서 다음과 같이 결정했다.
아직 Spring Sequrity와 같이 사용자 인증에 대한 지식이 없으니 관련된 부분은 Firebase를 사용한다.
그 외에 예약 시스템의 주요 로직들, 즉 서버는 Spring을, DB는 JPA를 사용할 수 있고 관계형 DB인 MySQL을 사용하기로 말이다.
3️⃣ 프로젝트 구조 설계
그런데 위처럼 설계하는 것이 맞을까? 하는 의문이 들었고, 많은 자료를 찾아봤다.
챗지피티한테도 물어보고 개발 커뮤니티를 찾아보니 비슷한 구조를 가진 내용을 몇몇 보았다.
이후 아래와 같이 간단하게 프로젝트 구조를 그려보았다.
물론 전문가들의 입장에선 말이 안되는 구조일 수도 있겠지만, 아직 모르니 그냥 이렇게 설계했다.
흐름은 다음과 같다.
1. Client 는 Firebase 로부터 인증을 받으며, 상태 관리를 통해 유저를 인식한다.
2. 인증된 유저는 Server와 HTTP 통신을 하며 서비스를 이용할 수 있다.
3. JPA, Hibernate를 통해 Server 와 DB 를 연결했다.
물론 배포까지 하면 좋겠지만 한 달이라는 짧은 시간 내에 완벽하게 하는 것을 불가능하다고 판단하여 할 수 있는 것에 최선을 다하자고 생각했다.
4️⃣ 결론
요구 사항을 분석하고 애플리케이션의 전체적인 구조를 잡기 위해 기술 스택을 정하는데에만 약 2주가 걸렸다.
처음에 너무 막막해서 이것 저것 많이 찾아봐서 그럴 수도 있겠지만, 생각보다 시간이 많이 걸렸다.
주어진 시간은 한달 반 정도이기 때문에 여유를 가질 수 없었다.
그래도 주어진 조건과 환경에서 할 수 있는 최대한의 노력을 하기로 마음먹었기에 열심히 했다.
물론 졸업을 하기 위한 수단으로만 생각할 수도 있었겠지만, 나는 내가 공부한 기술을 적용하고 하나의 서비스를 만듦으로써 개발 실력도 향상시키고 싶었다. 실제로 이론적 공부와 코드를 따라 치는 공부만 했던 나에게 팀단위로 프로젝트를 한다는 것은 굉장히 귀중한 경험이었고, 프로젝트를 마무리할 시점엔 스스로 많이 성장했다고 느꼈다.
앞으로 프로젝트 진행 과정을 차근차근 포스팅하겠다.