JSP 예약 프로젝트 - JSP yeyag peulojegteu

기능

예매내역확인 (예약확인) - 예약취소기능

  • 아래 기획서 내용대로 인터랙션이 동작한다.
  • 취소를 누르면 취소하겠냐는 메시지 레이어가 화면 가운데 뜨고 확인/취소를 통해 즉시 반영된다. 취소된 이후에는 '취소된 예약' 으로 새롭게 화면에 결과가 나온다.

소스코드

JAVA - 이름규칙

  • JAVA Naming Conventions 을 지킨다.(참고 1) (참고 2)
  • 클래스의 이름과 메소드의 이름은 직관적으로 작성하도록 한다. 클래스의 이름과 메소드의 이름만 보아도,어떤 기능을 가지고 있을지 어떤 내용이 구현되어 있을지 짐작할 수 있어야 한다.
  • 코드를 읽는 사람이 개념을 쉽게 파악할 수 있도록 읽기 쉬운 코드를 작성하도록 한다. 예를 들어 변수 이름을 구체적으로 작성하도록 한다.
    JAVA - 중복된 코드 제거 및 코드 구조화
  • 중복된 코드가 있다면, 별도의 메소드나 클래스로 분리하도록 한다.
  • 하나의 메소드가 너무 많은 코드를 담지 않는다. 코드의 양이 많을 경우 private한 메소드를 이용해서 메소드를 분리하거나 별도의 객체를 만들어 사용하도록 한다.
  • 클래스의 코드 길이가 너무 길어진다면, 해당 클래스가 몇개의 클래스로 분리될 수 있는지 고민한다.
  • 변수는 최대한 덜 사용하고, 최대한 가볍게 만들어 가독성을 높이도록 한다.
    JAVA - 가독성
  • 조건문의 경우 긍정적이고 흥미로운 (주 흐름에 해당하는) 경우가 앞쪽에 위치하도록 한다.
  • 삼항연산자, do-while문장은 코드 가독성을 떨어트리니 되도록 사용하지 않는다.
  • 블럭이 너무 많이 중첩되면 코드를 읽기 어려워진다. 블록을 private메소드로 추출할 수 있는지 고민한다.
  • 코드는 빈줄을 이용해 커다란 블록을 논리적인 문단으로 구분한다.
  • 코드는 들여쓰기를 잘 지키도록 한다.
  • 필요하지 않은 코드는 제거한다.
    JAVA - 프로젝트 구조
  • Controller, Service, Repository를 사용하여 구현되어 있어야 한다.
  • Controller에서 Service를 Service에서 Repository의 기능을 호출할 수 있지만, 그 반대는 허용되지 않는다.
    Java - Web API
  • 티켓 정보, 예약자정보를 전달받아 저장하는 Web API를 작성한다.
  • email을 입력받아, 해당 email로 예약된 예약정보 목록을 보여주는 Web API를 작성한다.
  • email로 검색된 결과가 1건 이상이 있을 경우 세션에 email정보를 저장한다.
    Java - JSP
  • 세션에 email이 있을 경우 메인 페이지의 우측 상단의 "예약확인" 은 세션의 email값으로 변경된다.
  • 메인 페이지의 email링크를 클릭하면 해당 email로 예약된 예약 정보 목록을 보여주는 Web API를 호출한 결과가 보여진다.

먼저 할 일을 나눠보았다.

  1. 비회원 유저 예약 목록 가져오기 (GET)
  2. 예매 내용 저장하기 (POST)

목록을 가져오는 부분은 swagger 를 보고 dto 모델을 생성하고 그 모델에 대한 쿼리문들을 짰다. 반복 학습의 힘일까, 데이터를 가져오는 부분은 금방 끝낼 수 있었다. 예매하기 부분은 강의에서 알려주신 것처럼 insert 는 쿼리문을 쓰지 않는 방법을 사용했다.

ReservationInfoDao.java

ReservationInfo selectReservationInfoOnlyOne(Integer reservationInfoId) // 예매 내역 번호로 내역 하나만 가져옴
List<ReservationInfo> selectReservationInfo(String reservationEmail) // 예매 내역을 가져옴
Integer selectReservationInfoCount(String reservationEmail) // 예매 내역 개수를 가져옴

ReservationDao.java

Integer insertReservationInfo(ReservationParam reservationParam, String nowDate) // 예매 정보 저장 (reservation_info)
int updateReservationInfoCancelYn(Integer reservationInfoId) // 예매 내역 취소

ReservationPriceDao.java

int insertReservationPrice(ReservationPrice reservationPrice, Integer reservationInfoId) // 고른 티켓과 개수 저장 (reservation_info_price)

insert 를 할 때 MapSqlParameterSource 를 사용하여 .addValue 로 해당 테이블의 각 컬럼명에 해당하는 파라미터 값을 넣어주었다.

reservation_info_price 에서 reservation_info 의 id 값을 필요로 하기 때문에 reservation_info 정보를 insert 한 뒤, 얻은 id 값을 reservation_info_price 에 insert 할 때 사용하였다.

예매일을 오늘로 부터 +1 ~ +5 일로 해야하는 부분은 ReservationDateResponse 라는 이름의 dto 를 따로 만들어서 controller 단에서 조작해주었다.

취소하는 부분은 update 로 cancel_flag 를 1로 간단히 바꿔줄 수 있었다.

JSP 예약 프로젝트 - JSP yeyag peulojegteu

헉 저번에 너무너무 꼼꼼하게 리뷰를 해주신 moons 리뷰어님께 다시 한 번 리뷰를 받게 되었다. 아싸 !!!!!!!!!!!

JSP 예약 프로젝트 - JSP yeyag peulojegteu

항상 가독성을 생각하면서 삼항 연산자를 사용할 때는 한 번 더 생각해야겠다.

JSP 예약 프로젝트 - JSP yeyag peulojegteu

리뷰어님 말씀대로 다 지워보았는데 훨씬 깔끔해보이고 좋았다.

JSP 예약 프로젝트 - JSP yeyag peulojegteu

정말 꼼꼼히 리뷰해주신게 느껴지는 부분이였습니다.... ㅠㅡㅜ 감사합니다

JSP 예약 프로젝트 - JSP yeyag peulojegteu

부끄럽지만 삼항 연산자 실수가 하나 또 있다. 리뷰어님 말씀이 백번 옳다. 앞으로 조심하자 !

JSP 예약 프로젝트 - JSP yeyag peulojegteu

아래로 옮기고 나니 훨씬 보기도 좋고 찾아보기도 쉬운 느낌이였다.

JSP 예약 프로젝트 - JSP yeyag peulojegteu

기본값이 false 였다니... 리뷰어님 말씀대로 true 일 경우에만 사용하면 훨씬 가독성이 좋을 것 같다. (바로 싹 다 지웠습니당)

JSP 예약 프로젝트 - JSP yeyag peulojegteu

리뷰어님께서 중요한 부분을 콕 찝어 주셨다. 항상 어려웠던 변수명, 함수명 짓기..... 그래서 네이밍 규칙을 찾아보았고 프로젝트에 적용해 보았다.

이번 파트를 하면서 내가 실수했던 것들을 적어보았다.

reservation service 에 insert 하는 부분에서 readOnly 를 true 로 해놓고 꽤 오랜시간 삽질을 했다...윽.....

예약 조회 쿼리에서 예매 가격 총합이 이상하게 나와서 쿼리문을 봤더니 group by 를 안했었다.

cancel_flag 대신에 cancelYn 을 적어놓는 너무 창피한 실수....

this.jdbc = new NamedParameterJdbcTemplate(dataSource); 를 빼먹는 실수...

똑같은 실수를 두 번 반복하는 바보가 되진 않을 것이다.

정말 꼼꼼하게 리뷰해 주신 리뷰어님께 다시 한 번 감사드립니다 :D

#부스트 코스