Mini 프로젝트. 여기 어때?(숙박업소)

박경희·2023년 8월 5일
0

프로젝트

목록 보기
5/16
post-thumbnail

이번 프로젝트는 백엔드 기술에 집중해 보고자 화면에서 호출할 때 사용할 수 있는 RESTful API만만들었다.

주제선정: 테이블을 20개 이상 구성해 보라는 조건이 있어서 많은 테이블을 구성할 수 있는 것을 생각해 보다 숙박업소(그 중 여기어때 참고)를 만들어보기로 했다.

테이블을 나누고 4명 분으로 역할을 나눈 후 각자 하고 싶은 분야를 맡았다.
내가 맡은 부분은 reservation과 review.
아직 CRUD도 혼자서 작성해본 적이 많지 않아서 이정도 양이 내겐 아주 적합하다 생각이 들었다.
(원래 세가지 였지만 지금 진행하는 프로젝트에서 api로 구현하기에 어려움이 있어 빼기로 했다.) 빠르게 완성 된다면 다른 부분도 더 추가 하면 되는 것이니 첫 시작을 너무 크게 맡지 않아서 부담이 덜 되었고 이번에는 무엇을 해야할지를 알겠어서 자신있게? 시작할 수 있었다.


그동안 C만 열심히 연습했는데 이젠 RUD를 해내야만 했다.
그런데 어디서부터 시작을 해야 하는가~??

내가 맡은 부분 => reservation, review, payment

고민1. payment를 어떻게 만들까

  • 예약정보에 결제를 했는지 안했는지 api로 어떻게 보여줄 것인가??
  • 수기로?
  • 결제는 어떻게?
    등 payment라는 부분 자체를 어떻게 구현해야할지 모르겠었다.
    => 그래서 맨 마지막에 하기로 하고 나머지 두개를 하다가 결국 구현하기 애매한 부분들이 있어 조원들이 이야기를 나눈 후 빼기로 결정!

고민2. 날짜 사이값은 어떻게 가져오지?

  • 예를들어
    예약 23.08.12 ~ 23.08.15 라고 한다면
    CheckInDate(23.08.12), CheckOutDate(23.08.15) 이렇게만 넣을텐데
    8.13, 8.14 -> 이 부분으로 예약을 찾으려면 찾을 수 있나?
    ==> 고민 끝에 강사님께 여쭤보니 비트윈으로 찾으면된다고 했다.
    (그렇구나~ 비트윈이라는걸 쓰면 되는구나~ 하고 생각했지만 사실 어떻게 사용해야 하는지는 모르는 상태라 좀 막막했다. '나중에 코드치다가 이 부분을 할 때 다시 물어봐야지~' 하고 우선 넘어가기~)

고민3. 토탈금액을 낼 수 있는가?

  • 내가 하고싶은 토탈금액은 roomPrice 숙박 일.
    고민2 부분에 살짝 이어서 '23.08.12 ~ 23.08.15' 라고 들어간다면 이 부분에서 숫자3이 나오고 여기에
    roomPrice를 가져와서 곱해줘야 한다.
    ==> 강사님께 이렇게도 할 수 있는지 물어보니 가능하다고 했다.
    대신 밀리세컨드로 나오니까 1000으로 나누고
    60 *24 해줘야한다고~
    (이 부분도 이 때 까지는 잘 모르겠었어서 우선 구현할 때 다시~ 하고 지나갔다.)

  • 먼저 결론을 말하자면 구현해보니 그냥 3을 뽑아낼 수 있어서 위와 같이 하지는 않았다!

==> 이렇게 어떻게 해야 할지 생각하다가 시작도 못하고 있는 것 같아서 우선 CRUD부터 해보기로 했다.


이번 프로젝트를 회고를 하면서 내가 했던 모든것을 담고 싶지만 여기에 코드까지 모두 넣기에는 너무 복잡할 듯 하여 코드에 대한 것은 따로 빼서 작성해봤다.
새로 알게 된 Link도 사용해볼겸~🤗 (코드Link는 맨아래에~)


프로젝트 진행 중 만난 문제

1. 모호한 GetMapping

  • 예약에 대해 전체조회를 하면 한 페이지에 너무 많아지지 않을까? 하는 생각으로 페이징 처리를 했다.
    그리고 이름으로 예약을 찾아볼 수 있도록 하기 위해 findName도 만들어보는데, 연습겸 이것도 페이징으로 만들어봤다.
    그런데 이 두가지 코드가 모두 살아있는 상태로 어플리케이션을 실행시키니 GetMapping이 모호하다는 오류가 났다. 그래서 한 쪽을 주석하고 실행해 봤는데 잘 실행됐다.
    -> 강사님께 어떻게 하면 좋을지 물어보니 그래서 query dsl을 사용하는거라고 한다.
    => 그래서 query dsl을 해볼까 하다가 이 부분이 최우선이 아닌 듯 하여 우선 다른 것들을 처리를 하고 해기로~!(그러나 시간이 부족하여 이부분은 아직 넣지 못했다.)

2. TotalPrice(고민3)

@GetMapping("/price")
public void price() {
    Reservation byId = reservationService.findById(1L);
    System.out.println(ChronoUnit.DAYS.between(byId.getCheckInDate(), byId.getCheckOutDate()));
}
  • 내가 생각하는 방식으로 계산이 되는지 확인해보기 위해 controller에서 이렇게 만들어서 테스트를 해봤다. 강사님께 많은 도움을 받아 여러 방법을 시도고 나온 최종 코드!

  • 이렇게 들어있는 1번을 확인해보면 10이 나온다.
  • 처음에는 'CheckOutDate - CheckInDate' 일 거라 생각해서
    byId.getCheckOutDate(),byId.getCheckInDate() 이렇게 넣어봤는데 이렇게 넣고 돌리니 -10이 나왔다. 그래서 그냥 사이값을 잘 찾아주는구나~ 하고 알게됐다.

이렇게 test를 해본 후 실제 Service에 넣은 코드(더 자세한건 reservation 참고.)

 double totalPrice =
 ChronoUnit.DAYS.between(request.getCheckInDate(), request.getCheckOutDate()) * room.getPrice();

하면 안되는 실수..^-^

double testPrice = ChronoUnit.DAYS.between(request.getCheckInDate(), request.getCheckOutDate()); 
double totalPrice = testPrice * room.getPrice();
System.out.println();
  • totalPrice에 null도 아닌 0이 들어가서 왜 값이 제대로 안들어가는지 검증을 해봤었다.
    값이 잘 넘어오는지 확인할 때 어떤식으로 떼어와서 넣어야 했는지 잘 모르겠었는데 이런식으로 하면 되는구나~ 싶어 남겨본다.
  • 결론적으로 값이 0이 들어간 이유는... 인텔리제이가 알아서 잘 추천 해주길래 tap, tap하며 눌렀더니 CheckInDate - CheckInDate을 하고 있었다. 하하하하 다음에 이런 실수 하지 않도록 하자😂


API

security를 사용해서 로그인 시 토근을 넣어줘야 한다. (참고* 403에러는 토큰에러다.)

회원가입

로그인 -토근이 발급된다.

  • accessToken을 사용하면 된다.

hotel

  • 이렇게 HEADERS에 Authorization과 Bearer 토큰 을 넣어줘야 들어간다.

reservation

  • 토큰 없이 넣으면 이렇게 403에러나 난다.

  • 토큰을 넣고 send해주면 성공~!

review

reservation - findAll

➡️ page로 만들었다. 페이지를 따로 지정하지 않으면 default로 10개의 예약까지 보이도록 했다.


➡️ default값을 3으로 줄여본 후 다시 Get을 해보면

➡️ 3개만 나오는걸 볼 수 있다.

➡️ page와 size를 직접 지정해주면 원하는 페이지만 열어서 볼 수 있다. (*참고- 0page부터 시작한다.)

펼쳐보면 유저 정보와 예약을 확인할 수 있다.
password는 보이게 하면 안된다! 이거는 최종본을 합치기 전이라 password를 수정하기 전꺼여서 나온다..😗

✅ totalPrice가 잘 나왔는지 확인!

➡️ 체크인 -8월 5일 체크아웃 -8월 17 => 17일 숙박.
➡️ room가격 - 예약시 6번room을 선택 -> 1박당 15000원.
➡️ 17일 * 15000 = 2,550,000 잘 나온다~!

reservation - findName

➡️ 주석을 바꿔본 후 이름으로 예약 찾기

✅ findAll과 findName의 주석을 모두 풀면 에러가 난다!
err - Ambiguous mapping. Cannot map 'reservationController' method

✅ findName만 가능할 떄는 전체 예약을 한번에 볼 수 없다. 이름 검색으로만 가능.
➡️ 둘 다 다용하고 싶다면 query dsl을 사용해야함! (시간이을 내서 한번 도전해 보려 생각중)

review - findAll

➡️ 내 코드만 완성하고 돌릴 때는 분명히 잘 나왔는데 조원들과 합치고나서 getAll이 되지 않았다.
쿼리는 나가는데 body에는 아무것도 찍히지 않음. 왜지?????

➡️ 디버깅을 해보려고 review에 찍고 돌려봤다. 디버그가 잡히지 않았다. 그런데 쿼리는 잘 나가고 오류도 안난다..???

➡️ 쿼리를 살펴보니 room어쩌구하며 쿼리가 나가서 roomController로 가봤다.

➡️ room에서 이렇게 작성되어 있어서 여기 roomController와 매핑이 되고 있었던 것..! room을 만든 조원은 @PathVariable을 사용하여 이렇게 해놓은 듯 싶다. 그래서 마지막에 최종 합친 코드에서 몇가지들이 잘 안됐던 것 같다. (최종 모두 합친 부분에서 몇가지 오류가 있다고해서 나는 아직 다 합치지 않은 코드로 가지고 돌려보는 중)

➡️나중에 최종 코드를 합친다면 지금 나오지 않는 부분들도 잘 나오겠지..!


느낀점

프로젝트를 시작하기에 앞서 지난 주에 조별 발표가 있었고.
조별 발표는 프로젝트 워밍업으로 생각하며 조금 일찍 준비해 보기로 했었다.
나는 그동안 다들 한번 쯤 해봤었을 '회원가입' 과 '로그인'을 해보지 못해 이번 기회에 맡아서 만들어 봤다.
프로젝트의 방향과 조별발표의 방향이 달라서 이 부분을 프로젝트에 반영하진 않았지만,
회원가입과 로그인에 대한 부분에 대해 '나만 못하는게 아닐까' 하는 마음을 없앨 수 있어서 좋았다.
생각보다 빠르게 만들어져서 '내 생각보다 내가 알고 있는 부분이 더 있구나!' 싶기도 해서 더 좋았다~!!

  • 주말에 spring에 대한 강의를 들으며 이해도를 높였던 것이 이번 프로젝트를 하는데 중요한 역할을 한 것 같다.

좋았던점

  • 테이블이 겹치지 않게 잘 나눠서 작업할 수 있어서 좋았다.
  • 충분한 시간을 가지고 고민해보고 구현해볼 수 있어서 좋았다. 다른 사람들이랑 겹치는 부분이 많으면 빨리 해서 줘야 된다는 압박감이 생겨서 아직은 그게 촘 부담스러운데 이번에는 분담이 잘 되서 좋았다.
  • 조원들이 물어보는 것에 대해 적극적으로 잘 도와주고 설명도 잘 해줘서 좋았다.
  • 이번 프로젝트를 진행하며 좀 더 코드 작성에 대한 이해가 생긴 것 같다.

아쉬웠던점

➡️ query dsl을 배웠지만 사용해보지 못한 점이 좀 아쉽다.
➡️ 예외처리도 우선순위를 뒤에 두고 모든 코드를 짠 후 어떤 예외를 처리해줘야 할지 생각해봤는데 남은 시간동안 처리하기에는 시간이 부족하여 손댈 수 없었다.

  1. 예약날짜별로 예약 가능한 방 1개씩. 겹치지 않도록 -> 지금할 수 없다.
  2. 리뷰쓰려면 실제 예약하고 사용한 사람만 가능하게 -> 코드를 고쳐야함. 지금 못함!

➡️ totalPrice 에 ,(콤마)가 들어갈 수 있게 해봐도 좋을 것 같다.


코드 참고 - reservation, review

0개의 댓글

관련 채용 정보