패스트캠퍼스 백엔드 과정 4기 부트캠프 #04. 그룹스터디 사이드 프로젝트📚(호텔예약 프로젝트)

yerim·2023년 4월 26일
1
post-custom-banner

Intro

패캠 백엔드 과정을 작년 12월 12일에 시작했는데 어느덧 5월을 바라보고 있다..
정말정말 정~~말 금방이다ㅠ ㅠ
과정 처음시작하고 1주일인가? 뒤에 시작한 그룹스터디에서는 처음에 게시판 프로젝트를 만들어보고 본격적인 프로젝트로 호텔 예약 프로젝트를 진행했다 !
중간에 팀원도 한 분 나가셨구 처음이라 우왕좌왕했던 기억들이 많았지만 스터디 팀장이 정말 잘 이끌어주셔서 ㅋㅋㅋ ㅋ 그래도 프로젝트가 나름 성공적으로 끝이났다 ! 아래는 프로젝트의 대략적인 설명이다.

🏠 호텔 예약 프로젝트

✍🏻 ERD

image

🌟 동작 방식

제목을 입력하세요 (2)

🧑🏻‍💻 배포기록

https://jaewoo2233.tistory.com/105

💡 주요 기능

1. Spring Batch

  • Spring 스케줄링을 통해 하루에 한 번씩 기간이 지난 예약 데이터들을 삭제하는 방식으로 구현했고, 처음에 호텔 Open API 데이터를 받는 것을
    8080 서버에서 실행할 때 다 받아오도록 하려했는데 중간에 OpenApi 중단이 끊기게 되어서 해당 데이터를 사용하려 했는데 사용 못하게 되었었다.
    그래서 현재 PC에 있는 호텔 데이터를 CSV 파일로 Batch 프로그램을 돌려 생성하고, 만든 CSV 파일을 통해 Mysql 컨테이너에 데이터를 넣었다.

2. Redis 캐시관리

  • 호텔 자세히 보기에서 호텔 이미지를 캐시처리하였다.
  • 사용자가 호텔 자세히보기를 클릭하면 Mysql에서 redis로 이미지가 저장된다.
  • redis에 있는 호텔을 클릭하면 hotelImage 테이블을 조회하지 않고 redis에서 이미지 정보를 가져온다.
  • 호텔이미지에 수정사항이 있다면 redis에 저장된 이미지는 삭제처리한다.

3. KaKao API활용

  • Open API에 데이터는 위도 경도는 주지만 자세한 위치가 안 나오는 곳이 있어 해당 값으로 KaKao map으로 보여주기도 하고 해당 위도, 경도 데이터로 요청해서 도로명 주소를 받아오도록 구성했다.

4. 호텔 조회 · 저장 · 수정 · 삭제 , 리뷰 조회 · 저장 · 수정 · 삭제

호텔 저장

  • 사용자가 호텔이름, 주소, 전화번호, 등 호텔 기본 정보를 입력하면 컨트롤러에서는 해당 요청을 받아 호텔의 주소를 프로젝트에서 구현한 카카오api를 이용해 위/경도로 변환해 서비스로 데이터를 넘긴다.
  • 호텔 이미지와 호텔 Entity를 분리해 각각 저장한다.

호텔 리스트

  • Hotel 테이블에 저장되어있는 호텔이름과 HotelImage테이블에 있는 대표사진1개들을 리스트로 출력한다. (사진이 없을 경우 기본이미지로 출력)
    한 화면당 12개의 호텔들을 페이징처리해 출력한다.

호텔 자세히보기 / 리뷰조회

  • Hotel 테이블에 있는 id, 이름, 주소, 전화번호 등을 출력하고 저장되어있는 주소를 위/경도로 변환하여 지도를 출력한다.
  • 호텔에 남겨진 리뷰를 볼 수 있으며 남긴 리뷰 평점으로 호텔의 평균평점을 출력한다.

호텔 수정 / 삭제

  • 로그인한 사용자와 호텔 작성자가 같다면 호텔 수정, 삭제 버튼이 생성된다.
  • 수정페이지에서는 이미지를 비롯한 호텔 정보들을 수정할 수 있다.
  • 삭제페이지에서는 해당 호텔 삭제가 가능합니다.

리뷰저장

  • 별점을선택하고 리뷰를 작성하면 review테이블에 저장되고 선택한 별점은 숫자로 변환되어 DB에 저장된다.

리뷰 수정 / 삭제

  • 로그인한 사용자와 리뷰 작성자가 같다면 리뷰 수정, 삭제 버튼이 생성된다.
  • 리뷰 수정은 modal창으로 출력되며 별점과 리뷰 수정이 가능하다.
  • 리뷰 삭제 버튼을 클릭하면 리뷰 삭제가 가능하다.

5. 객실 조회 · 저장 · 수정 · 삭제

  • 호텔을 참조하는 FK를 들고있고 기본적인 CRUD를 구현, 그리고 호텔 자세히 보는 기능은 DB조회하기 전 Redis를 먼저 조회하고 없으면 DB를 조회하는 형식으로 구성함 한 번 조회한 데이터는 바로 Redis에 저장되게 된다.
  • 룸 이미지는 S3 버킷을 사용해서 저장을 하는데 사장권한이 해당 호텔 룸을 저장할 때 여러 이미지를 저장할 수 있는데 이미지를 먼저 올릴 때 temp 디렉토리에 해당 이미지들이 저장되었다고 저장하기 버튼을 클릭시 temp파일에 있는 이미지들은 모두 삭제되고 S3 버킷에 해당 이미지들이 저장된다. 그리고 뒤로가기를 누를 경우에도 임시저장되었던 이미지 모두 삭제된다.

6. 호텔 예약 · 예약취소

  • 예약저장 예약조회는 jpa를 사용해서 구현했고, 객실 조회를 할 때 유저가 선택한 체크인,체크아웃 날짜에 예약이 안된 객실을 보여주기 위해 따로 query를 작성해서 구현했다. 삭제의 경우 데이터를 삭제하지 않고, 예약내역에 deleted를 추가해서 삭제를 했을 경우 true로 바꾸는 방법을 사용했다.

7. 마이페이지

  • 예약리스트 조회 및 예약한 객실 조회를 하는 페이지다.
  • 이 페이지에서 예약취소가 가능하다.

8. 회원가입 · 로그인

내가 구현한 프로젝트 화면 🖥️






  • 화면은 부트스트랩으로 구현했는데.. 난 화면 꾸미는게 재밌드라.. 프론트갈걸 그랬나 ㅋㅅㅋ

프로젝트를 돌아보며 💬

기능

  • 내가 맡은 기능은 호텔(호텔이미지) 저장 / 조회 [list, 자세히보기] / 삭제 / 수정과 리뷰 CRUD였다.
  • 호텔은 @Controller로 MVC로 , 리뷰는 @RestController로 구현했다.
  • 다른 페이지는 괜찮은데 호텔 자세히보기 페이지에서는 쿼리가 3번 일어났었다. (호텔+호텔이미지+리뷰)
    그래서 fetchjoin으로 호텔과 리뷰를 불러오고 리뷰보다 변경사항이 적은 호텔이미지를 redis에 저장한 뒤 가져오는 형태로 쿼리수를 줄이기 위해 노력했다
  • 호텔자세히 보기를 처음 눌렀을때는 똑같이 쿼리가 2번 일어난다.(호텔+리뷰/호텔이미지)
    그때 DB에서 가져온 호텔이미지를 redis에 저장하고 redis에서 호텔이미지를 가져다 준다. 이렇게 하면 캐시에 해당 호텔 이미지 정보를 저장해서 가져다 줘 호텔이미지에 변경사항이 없다면 redis에서 이미지 경로를 준다.
  • 호텔 이미지가 삭제될때는 DB, 이미지 저장소, redis에 있는 모든 정보들이 삭제된다.

회고

  • 학원에 처음 들어오면서 스프링에 대해 처음 공부해봤고 거의 백지인 상태에서 시작한 프로젝트라 정말 별것도 아닌걸로 오류도 많이 나서 짜증도 많이 났고 git pull만 받으면 자꾸 ㅋㅋㅋ ㅋ오류나서 그거 잡고 증맬 어려웠었다. 처음엔 무조건 기능 구현만 하면 된다고 생각하고 있었는데 스터디 팀장님이 그래도 경험이 많으신 분이라 이것저것 하시느라 고생이 많으셨다.. ^0^ 마지막엔 혼자 배포까지 하심.. 리스펙합니다
    덕분에 쿼리 수를 줄이기 위해 BatchSize, Fetchjoin등 여러가지 방법들을 사용해보기도 했고 호텔이미지를 redis에 저장해 캐싱기능도 추가하기도 했다 !

  • 가장 기억에 남았던 기능은 (진짜 어려워서 짜증났던) 호텔이미지 저장이였다..
    호텔이미지의 이름까지 저장하는건 다했었는데 타임리프로 불러와야하는데 어떻게 화면에 띄우는지 몰라서 팀장님 설명도 듣곤 했는데 계속 이해못해서 며칠동안 진짜 씨름했던 기억이 ... ^^.. 근디 모든 기능들이 아주 하나하나 다 고비였음 사소한 오타하나로 자꾸 오류가 나기도 했고 .. 그냥 그랬다

  • 그거말고도 Controller와 Service, 아무것도 몰랐던 내가 스프링 실시간 수업을 시작하기 전부터 프로젝트를 진행하며 어느정도 이해를 할 수 있게 되었고 정말 백문이 불여일견이라는 말이 맞는 것 같다!
    물론 클론코딩도 좋겠지만 나에게 더 맞는 공부법은 정말 모르겠어도 일단 한 번 해보면서 학습하는 것 같다.

  • 만약 검색을 통해 이 글을 보시고 패스트캠퍼스 부트캠프를 고민하신다면 그룹스터디에서 사이드 프로젝트 하는 것을 강추드린다! (혼자해도 좋겠지만 어렵기도 하고 문제가 생겼을때 팀원들이랑 같이 해결하는게 훠얼씬 나음)

  • 다음주부터는 미니프로젝트를 시작해 그룹스터디도 이번주가 마지막이다..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅜ ㅜ
    모두들 화이팅

post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 4월 28일

안녕하세요! 저는 패캠 제로베이스 벡엔드 5기로 수강하게된 sudong입니다. 선배님 글 잘 읽고 있습니다!
혹시 이거는 마지막 한달 동안 진행되는 프로젝트인가요? 아니면 따로 하신 프로젝트일까요??

궁금하게 많은데 혹시 이메일 알려주시거나 tkddlsqkr21@gmail.com으로 메일 알려주실 수 있으신가욤 ㅠㅠ

1개의 답글