부스트 코스(웹) PROJ5-1

Posted by 이창권 on September 04, 2019

부스트 코스 proj5-1를 진행하였습니다.

네이버 예약 서비스의 예약 관련 페이지들을 위한 Controller와 API를 위한 Controller를 개발하였습니다.
예매하기 페이지와 예약자 이메일 입력 페이지, 예약확인 페이지로 총 3개와 더불어 예약정보 조회를 위한 /api/reservations와 예약하기 /api/reservations, 예약취소하기 /api/reservations/{reservationId} 총 3개의 API까지 개발하였습니다.
이번에는 select문 외에 update문과 delete,insert문을 사용한다는 것을 제외하면 기본적인 Controller작성은 proj3-1이나 proj4-1과 비슷하였습니다.
Controller작성과 더불어 이번 과제에서는 특별히 session이라는 것을 사용하였는데 이와 비슷한 기능을 하는 cookie와 함께 알아 보도록 하겠습니다.

Controller

사실 proj4-1에서 잘못한 점이 있습니다.
select문만을 사용하는 dao함수들을 사용할 때는 굳이 @Transactional을 사용할 필요가 없습니다.
왜냐하면 데이터베이스의 무결성을 해치는 것도 아닐 뿐더러 함수가 중간에 에러가 난다 하더라도 이상한 값을 반환하거나 하진 않기 때문입니다.(저는 2개이상의 sql문을 사용하면 무조건 사용해야하는 줄 알았습니다.)
이번에는 예약하기의 기능을 하는 service 함수를 위해서는 reservation_info테이블에도 insert를 해야하고, reservation_info_price테이블에도 insert해야하기 때문에 이와같이 db를 변경하는 sql문들을 2개이상 사용할 때 @Transactional을 사용해야 합니다.
@Transactional annotation을 사용하면 함수가 실행되거나, 중간에 문제가 생기면 아예 함수를 실행하기 전으로 rollback하게끔 도와줍니다.

    @Override
    @Transactional
    public ReservationResponse reserveTicket(ReservationParam reservationParam) {
        reservation_info테이블에 insert
        reservation_info_price테이블에 insert//2개의 insert문 사용으로  @Transactional추가

쿠키와 세션의 가장 큰 차이점이라 한다면 쿠키는 클라이언트에 정보를 저장해두는 기술이고, 세션은 서버에 저장을 한다는 점입니다.
그림으로 이해하여 봅시다!

  1. cookie

쿠키는 위와 같이 웹 클라이언트가 서버에 요청을 하면 서버에서 쿠키를 만들어 응답에 같이 보내주는 형식을 취합니다.
그 후에는 클라이언트에서 요청을 보낼 때 쿠키와 같이 보내고, 서버에서는 받은 쿠키를 확인하여 정보를 쿠키에 맞게 보냅니다.
단 저장된 정보가 클라이언트에 있으므로, 사용자나 시스템이 쿠키를 들여다볼 수 있다는 단점이 있습니다.

  1. session

세션은 결국 쿠키를 사용한 기술입니다.
단 서버에서 보관한다는 점에서 다릅니다.
클라이언트가 요청을 보내면 서버에서 세션키와 세션을 생성해 세션키를 담은 cookie를 응답에 포함시켜 보내줍니다.
이후 클라이언트가 요청을 했을 때는 세션키를 담은 쿠키를 서버에 보내 서버에서 세션키를 왁인하여 저장된 정보를 응답해줍니다.

쿠키를 사용하면 사용자나 시스템이 들여다 볼수도 있기 때문에, 중요한 정보를 담지 못합니다. 하지만 세션을 사용하면 저장소가 서버에 있기 때문에, 어떤 정보도 세션에 담아둘 수 있는 장점이 있습니다.(단 서버가 힘들어 하겠죠?)

Spring에서 session을 사용하는 법을 익혀봅시다.

    @Controller
    @SessionAttributes("user")
    public class ReservationController {

        @GetMapping(path = "/myreservation")
        public String renderMyReservationPage(@ModelAttribute("user") User user, ModelMap modelMap) {
            user email 참조해 reservation_info검색!
        }

        @ModelAttribute("user")
        public User setUser() {
            return new User();
        }
    }

첫 번째로 다음과 같이 컨트롤러에 @SessionAttributes annotation을 추가하여 줍니다.
@SessionAttributes 파라미터로 지정된 이름과 같은 이름이 @ModelAttribute에 지정되어 있을 경우 메소드가 반환되는 값은 세션에 저장됩니다. 이후 다른 함수에서 @ModelAttribute를 parameter로 사용하면 session에서 해당 이름을 가진 객체를 가져와 사용할 수 있습니다.(간단하죠?)

함수 내 parameter로 @ModelAttribute대신 @SessionAttribute를 사용할 수도 있습니다.

개인적으로 강의 중에 배운 인터셉터나 아규먼트 리졸버도 공부한 만큼 사용해보고 싶었는데 프로젝트의 기획서나 명세에 없어서 아쉬웠습니다.

다음에 도전할 기회가 있었으면 좋겠습니당.~~~