20240311 (월) 최종 프로젝트 티켓레이더 3주차 - 1차 발표 준비 계획

2024. 3. 11. 20:06TIL

TIL

 

1. 1차 발표 준비 계획

1차 발표가 벌써 다음주 월요일까지 다가왔다.

현재 우리가 진행한것을 바탕으로 1차 발표 이전까지 완성해둘 것과 발표 준비 기간을 잡았다.

 

우선 마저 진행해야 할것들은

 

1. updateEvent 코드 간결화

2. updatePlace 코드 간결화

3. 티켓 삭제시 availableSeat 늘리는 코드 작성

4. 티켓 결제 가능 시간 지나면 삭제처리 되도록. (캐시, DB)

5. 장소 기준으로 이벤트 검색 기능 구현

 

등이 있고, 내가 맡은 부분은 1,2번 부분

 

현재 짜놓은 updateEvent 는 반복되는것도 많고 무엇보다 너무 길다.

create와 비교해서 반복되는 부분은 메소드를 작성해서 사용하도록 할 예정

 

2. updateEvent 코드 간결화

현재 우리 UpdateEvent의 코드는 이렇다.

@Transactional
override fun updateEvent(eventId: Long, eventRequest: EventRequest) {
    val event = eventRepository.findByIdOrNull(eventId)
        ?: throw ModelNotFoundException("Event", eventId)
    val price = priceRepository.findByEventId(eventId)
        ?: throw ModelNotFoundException("Price", eventId)
    val category = categoryRepository.findByIdOrNull(eventRequest.categoryId)
        ?: throw ModelNotFoundException("category", eventRequest.categoryId)
    val place = placeRepository.findPlaceByName(eventRequest.place)
        ?: throw ModelNotFoundException("place", 0)
    val orgStartDate = event.startDate
    val orgEndDate = event.endDate
    //시작일과 끝나는 일 비교후 false 시 예외처리
    check(eventRequest.startDate < eventRequest.endDate) {
        "끝나는날짜는 시작날짜보다 빠를수 없습니다."
    }
    event.let {
        it.posterImage = eventRequest.posterImage
        it.title = eventRequest.title
        it.eventInfo = eventRequest.eventInfo
        it.startDate = eventRequest.startDate
        it.endDate = eventRequest.endDate
        it.place = place
        it.category = category
    }
    eventRepository.save(event)
    price.let {
        it.seatRPrice = eventRequest.seatRPrice
        it.seatSPrice = eventRequest.seatSPrice
        it.seatAPrice = eventRequest.seatAPrice
        it.event = event
    }
    event.price = price
    priceRepository.save(price)

    //날짜 변동이 생겼는지 확인
    if (orgStartDate != event.startDate || orgEndDate != event.endDate) {
        val date = event.startDate
        val duration = event.endDate.compareTo(event.startDate)
        //해당 날짜에 이미 존재하는 이벤트가 있는지 확인
        for (i in 0..duration) {
            val seat = availableSeatRepository.findByPlaceIdAndDate(place.id!!, date.plusDays(i.toLong()))
            if (seat != null) {
                check(seat.event!!.id == event.id) {
                    "다른 이벤트가 존재함"
                }
            }
        }
        //변경된 날짜 범위 이외의 시트는 모두 삭제(소프트딜리트)처리
        val seatList = availableSeatRepository.findAllByEventId(eventId)
        seatList.map{
            if(it!!.date.isBefore(event.startDate) || it.date.isAfter(event.endDate)){
                it.isDeleted = true
            }
        }
        //없는 시트를 찾아서 생성
        for (i in 0..duration) {
            val seat = availableSeatRepository.findByEventIdAndDate(eventId, date.plusDays(i.toLong()))
            if (seat == null) {
                val newSeat = eventRequest.toAvailableSeat(event, place, date.plusDays(i.toLong()))
                availableSeatRepository.save(newSeat)
            }
        }
    }
}

 

여러가지 확인절차가 있다보니 이렇게 길어졌지만 자세히보니 CreateEvent와 겹치는 부분이 조금 있었다.

 

바로 availableSeat 관련 부분

 

CreateEvent에서도 시트를 생성시에 해당 날짜에 이미 다른 이벤트가 공연을 예약해놨는지 확인하고, 없다면 만드는 식의 코드가 짜여져있는데, 이는 업데이트에서도 상당부분 겹치는 것이였다.

 

따라서 따로 checkSeatForUpdateAndCreate 메서드를 만들어주고 Create와 Update에서 호출하는 형식으로 바꿨다.

 

바뀐 updateEvent

@Transactional
override fun updateEvent(eventId: Long, eventRequest: EventRequest) {
    val event = eventRepository.findByIdOrNull(eventId)
        ?: throw ModelNotFoundException("Event", eventId)
    val price = priceRepository.findByEventId(eventId)
        ?: throw ModelNotFoundException("Price", eventId)
    val category = categoryRepository.findByIdOrNull(eventRequest.categoryId)
        ?: throw ModelNotFoundException("category", eventRequest.categoryId)
    val place = placeRepository.findPlaceByName(eventRequest.place)
        ?: throw ModelNotFoundException("place", 0)
    val orgStartDate = event.startDate
    val orgEndDate = event.endDate
    //시작일과 끝나는 일 비교후 false 시 예외처리
    check(eventRequest.startDate < eventRequest.endDate) {
        "끝나는날짜는 시작날짜보다 빠를수 없습니다."
    }
    event.let {
        it.posterImage = eventRequest.posterImage
        it.title = eventRequest.title
        it.eventInfo = eventRequest.eventInfo
        it.startDate = eventRequest.startDate
        it.endDate = eventRequest.endDate
        it.place = place
        it.category = category
    }
    eventRepository.save(event)
    price.let {
        it.seatRPrice = eventRequest.seatRPrice
        it.seatSPrice = eventRequest.seatSPrice
        it.seatAPrice = eventRequest.seatAPrice
        it.event = event
    }
    event.price = price
    priceRepository.save(price)

    //날짜 변동이 생겼는지 확인
    if (orgStartDate != event.startDate || orgEndDate != event.endDate) {
        checkSeatForUpdateAndCreate(event, eventRequest, availableSeatRepository)
    }
}

 

+createEvent

@Transactional
override fun createEvent(eventRequest: EventRequest) {
    val category = categoryRepository.findByIdOrNull(eventRequest.categoryId)
        ?: throw ModelNotFoundException("category", eventRequest.categoryId)
    val place = placeRepository.findPlaceByName(eventRequest.place)
        ?: throw ModelNotFoundException("place", 0)//예외 추가 필요함

    //시작일과 끝나는 일 비교후 false 시 예외처리
    check( eventRequest.startDate >= eventRequest.endDate) {
        "끝나는날짜는 시작날짜보다 빠를수 없습니다."
    }

    val (price, event) = eventRequest.toPriceAndEvent(category, place)
    event.price = price
    eventRepository.save(event)
    priceRepository.save(price)

    checkSeatForUpdateAndCreate(event, eventRequest, availableSeatRepository)
}

 


순탄하게 진행되고 있다. 6주차까지 파이팅