회고/프로젝트 회고

[백오피스 프로젝트 회고] 토비로 - 숙박 예약 서비스

DuL2 2024. 1. 30. 00:49

토비로

토요일을 비롯한 로맨틱한 여행

여행을 좋아하는 세 명이 모인 이유로 시작되었으며

내일배움캠프가 끝나면 여행을 가고 싶어 시작하게 되었습니다.😀

S.A. 노션 링크

https://moveuk.notion.site/B-1-f5bbf3829b014418ba7d7275ddb2b2b8?pvs=4

 

B - 1 : 토비로 | Notion

❤ 팀 소개

moveuk.notion.site

 

⚙️ Backend 개발환경

🤝 협업 툴

  • 언어 : Kotlin 1.9.20 - Java version 17
  • 프레임워크 : SpringBoot 3.2.0
  • 빌드 툴 : gradle-8.5
  • 데이터베이스 : Supabase
  • 배포 서버 서비스 : Amazon EC2 - Ubuntu 22
  • 형상 관리 : git
  • IDE : IntelliJ IDEA 2023.3 (Ultimate Edition)
  • zep / slack : 온라인 미팅 장소
  • 노션 : 기능 명세 / 개발 일정 정리
  • 디자인 툴 : Figma
  • ERD : Quick DBD 웹서비스
  • 테스트 툴 : Postman


 

기술 선택 근거
 - 스프링부트 : 모놀리식 아키텍처의 프로젝트에서 충분한 성능을 보일 수 있으며, 콜드 부트 비용의 고민이 없다고 판단하여 스프링을 선택했습니다. 스프링 자체의 기능이 많고 스프링 프레임워크를 사용함으로써 팀원 모두가 다른 언어에 비해 획일적이고 통일적인 코드를 작성할 수 있을 것이라고 판단하여 선택했습니다.
- 코틀린 : 코틀린 언어 숙달 목적인 프로젝트 이기 때문에 선택했습니다.
- 데이터베이스 : Supabase 팀원들이 새로운 데이터베이스를 배우는 것보다 익숙한 데이터베이스를 사용하는 것이 좋다고 생각했습니다.
- 클라우드 서비스 : 팀원들의 러닝커브를 생각해 Amazon 클라우드 서비스가 구글 클라우드 플랫폼 보다 인터넷에 정보가 많다고 판단했기 때문에 선택했습니다.
- 테스트 툴 : 기존에는 Swagger를 사용했지만 팀원과 일정한 테스트 방식을 공유하기 위해 학습하여 사용했습니다.

개발 일정

팀 컨벤션

 

문서 작성

 

팀 업무 효율을 높이기 위해 노션에 프로젝트 문서를 작성했습니다.

팀 모두의 진행도를 확인하고 업무 가시성을 높이기 위해 칸반 보드를 도입하였고, 수 많은 프로젝트 정책 및 기능 명세를 모두가 확인할 수 있도록 문서를 작성하였습니다. 팀 모두가 참여하였고, 이로 인해 본인이 개발해야할 기능과 업무 순서를 이해하는데 도움이 되었다고 생각합니다.

와이어 프레임

와이어프레임 전체
좌상단부터 시계방향으로 프론트화면, 로그인 선택 화면, 이메일 회원가입 화면, 내 정보 관리 화면

 

 

좌상단부터 시계방향으로 숙소 검색 화면, 숙소 상세 화면, 예약 확인 및 결제 화면, 내 예약 확인 화면

 

좌상단부터 시계방향으로 비즈니스 회원가입 화면, 객실정보 관리 화면, 후기 관리 화면, 매출 화면

ERD

 

ERD의 경우에는 처음 구상과 많이 변화되었고, 기능이 추가됨에 따라 테이블들이 추가되었습니다.

Member와 Owner를 하나로 묶어 Role 컬럼을 두어 함께 사용할 수 있다고 생각했으나 각 유저가 가지고있는 정보가 다르다고 판단되어 분리하였습니다.

S3에 올린 이미지 파일 URL들을 저장할 때 저희 프로젝트 MVP 기능에서는 정규화는 위배하지만 Entity로 분리하여 사용할 필요가 없다고 판단되어 이미지 Url이라는 컬럼에 모두 직렬화해서 데이터베이스에 저장했습니다.
AttributeConverter<X, Y>를 상속받은 클래스에서 Jackson라이브러리를 통해 직렬화 하였습니다.

테이블 추가 경우에는 비밀번호 변경시 최근 3회 이내의 비밀번호로 수정 못하게 하기 위한 기능을 위해 MemberRecentPasswords 테이블을 추가하기도 했습니다.

 

패키지 구조

표현계층을 분리한 패키지를 적용하였다. 표현계층에서는 응답 요청을 받고 도메인과 응용 계층에서는 비즈니스 로직을 담당할 수 있도록 각 계층간 역할을 분리하였다.

구현 기능

 

주요 기능 설명

1. 최근 비밀번호 검증 로직

첫번째로 최근 비밀번호 검증 로직입니다.

이 기능을 구현하기 위해 저희는 Member 테이블을 의존하는 MemberRecentPasswords라는 테이블을 만들었고, 비밀번호를 수정할 때 해당 멤버로 저장된 가장 최근 3개의 비밀번호를 가져와 any 컬렉션 함수를 이용해 확인하도록 처리하였습니다. 

생각을 해보면 Member와 Owner를 위한 이 비밀번호 테이블은 하나로 합쳐 사용하는 것이 더 좋지 않았나 라는 생각이 듭니다.

 

 

2. 숙박업소 검색 능력

호텔 예약 서비스에서 제일 필요한 것이 내가 여행 가는 지역에 여행 날짜에 숙소가 있는지 검색을 하는 기능이었습니다.

숙박 업소 검색에는 검색에 필요한 인자를 선택하고, filter하고 정렬하는 기능이 필요하다고 생각했고, 많은 옵션 값을 이용해 동적 쿼리를 구현할 때 순수 JPA 혹은 JPQL만으로 구현하기는 까다롭다고 판단하여 Query DSL을 도입하기로 결정했습니다.

 

한 유저가 2월 1일부터 2월 2일까지 여행을 가고 싶은 경우를 예를 들어 설명드리려고 합니다. 먼저, 데이터베이스 상의 모든 예약 명단을 가져옵니다.

다음 우리가 보고싶은 것은 1일과 2일이 예약되지 않은 방이 보고 싶기 때문에 not in 쿼리를 사용해 해당 날짜에 예약중인 방을 제거합니다.

또한, 사용자가 어떤 지역을 기준으로 검색했다면 like 연산자를 이용해 다시 한번 걸러줍니다.

이외의 다양한 옵션들을 동적쿼리로 구현할 수 있고 최종적으로 원했던 데이터를 받아 유저에게 응답해주도록 기능을 구현하였습니다.

 

3. 이미지 URL 직렬화 및 역직렬화 후 DB 저장

이미지의 경우 이미지를 위한 테이블을 따로 두지 않고 숙소, 방, 유저 프로필 사진 등을 각 테이블의 컬럼에 직렬화하여 저장하는 것으로도 충분히 기능을 만들 수 있다고 생각했습니다. 따라서 직렬화, 역직렬화를 해줄 컨버터 기능이 필요했고, AttributeConverter를 상속받아 컨버터를 커스텀 해주었습니다.

 

4. 배포 이야기

배포 서비스는 AWS를 사용했으며 수동 배포를 진행하였습니다. 도메인의 경우 기존에 제가 가비아에서 구매해둔 moveuk.xyz라는 도메인을 Route 53에 호스팅 설정하여 연결했고, DNS 서버에 등록되는데까지 2~3시간 정도가 소요되었던 것 같습니다.

 

http 통신을 사용하므로 80 포트로 접속하는 요청을 토비로 Application이 받을 수 있도록 8080으로 PortForwarding 처리를 해두었습니다.

 

5. 반복되는 코드 리팩토링

프로젝트를 정리하던 도중 서비스 안에서 다음과 같이 반복되는 코드를 확인할 수 있었습니다. 접근한 사용자가 권한이 있는 유저인지 확인하는 로직은 다른 메소드에서도 공통적으로 사용한다고 판단되었고, 이를 서비스 내의 메서드로 다음과 같이 분리하였습니다.

 

6. JpaAuditing 설정 - BaseTimeEntity

엔티티마다 공통으로 존재하는 작성 및 수정 시간을 한 엔티티로 관리하기 위해 JPA에서 제공하는 Audit 기능을 사용하였습니다.

 

7. 사진 보관을 위한 S3 버킷 사용

 

사용자의 사진을 저장하기 위한 용도로 AWS S3를 사용하였습니다. Supabase Bucket도 후보로 두었지만 AWS S3의 정보가 더 많다고 생각했기 때문에 선정했으며 기존에 사용 경험이 있었기 때문에 시간상 익숙한 서비스를 이용하는 것이 개발 시간을 버는 방법이라고 생각했습니다.

 

마무리

 저는 이번주에 가장 큰 목표가 지난 프로젝트에서 나왔던 모든 팀의 피드백을 저희의 프로젝트에 녹이는 것이 목표였습니다. 피드백의 질도 좋을 뿐더러 양이 방대해서 쉽지 않았지만, 팀원들의 적극적인 소통 덕분에 잘 마무리할 수 있었던 것 같아 좋은 한 주였습니다. 가능하다면 피드백의 스택을 쌓아가고 팀의 개발 방향성을 잘 잡아줄 수 있는 팀원으로서 성장하기 위해 꾸준한 정리를 해나가려하고 있습니다. 이런 글들이 그 모음에 도움이 되었으면 좋겠습니다.

 

긴글 읽어주셔서 감사드립니다.

 

P.S. 팀의 KPT 회고가 궁금하시다면 아래 링크를 가주시면 감사드립니다.

 

[백오피스] KPT 회고

백오피스 프로젝트 주차 KPT 회고 일시: 2024-01-29 (월) 16시15분~17시 (45m) 참석자: 3명 (이동욱, 김찬모, 박규희) 내용: KPT 회고 🙌 성과 @chanmo231121 — 김찬모 git 사용법을 추가적으로 더 배웠다 (git iss

dul2.tistory.com