본문 바로가기
Project/ThreeMovie(영화리뷰및예약도우미)

ShowTime 데이터 저장 시간 줄이기

by HDobby 2023. 3. 14.
showTimeRepository.truncateShowTime()
val showTimeMovieInfo = movieInfoRepositorySupport.getShowTimeMovieInfo()
val movieInfoMap = chgListTOMap(showTimeMovieInfo)

val allstartTime = LocalDateTime.now()
val mbTheaters = theaterDataRepositorySupport.getTheaterData("MB")
val lcTheaters = theaterDataRepositorySupport.getTheaterData("LC")
val cgvTheaters = theaterDataRepositorySupport.getTheaterData("CGV")


var showTimeList = getMBShowtimes(mbTheaters, movieInfoMap)
showTimeList += getLCShowtimes(lcTheaters, movieInfoMap)
showTimeList += getCGVShowtimes(cgvTheaters, movieInfoMap)
val theaterendTime = LocalDateTime.now()

val dbstartTime = LocalDateTime.now()
showTimeRepository.saveAll(showTimeList)
val endTime = LocalDateTime.now()
println("theaterStart   : ${allstartTime}")
println("theaterend     : ${theaterendTime}")
println("dbstart        : ${dbstartTime}")
println("allend         : ${endTime}")

시간 체크 및 넣는 코드는 모두 동일

서로 다른 데이터는 StartTime, EndTime, RestSeat, TicketPage 4가지가 있다.


각자 분리하여 넣기

 

Entity

@Entity
@IdClass(ShowTimePK::class)
@Table(name = "ShowTimes")
data class ShowTime(
	@Id
	@Column(name = "MovieId")
	val movieId: String = "",

	@Id
	@Column(name = "MovieTheater")
	val movieTheater: String = "",

	@Column(name = "City")
	val city: String = "서울",

	@Id
	@Column(name = "BrchKR")
	val brchKR: String = "",

	@Column(name = "BrchEN")
	val brchEN: String = "",

	@Id
	@Column(name = "MovieKR")
	val movieKR: String = "",

	@Column(name = "MovieEN")
	val movieEN: String = "",

	@Id
	@Column(name = "ScreenKR")
	val screenKR: String = "",

	@Column(name = "ScreenEN")
	val screemEN: String = "",

	@Id
	@Column(name = "Date")
	val date: String = "",

	@Column(name = "RunningTime")
	val runningTime: Int = 200,

	@Column(name = "TotalSeat")
	val totalSeat: Int = 200,

	@Id
	@Column(name = "PlayKind")
	val playKind: String = "",

	@Id
	@Column(name = "StartTime")
	val startTime: String = "",

	@Column(name = "EndTime")
	val endTime: String = "",

	@Column(name = "RestSeat")
	val restSeat: String = "",

	@Column(name = "TicketPage")
	val ticketPage: String = "",
)
val showTime = ShowTime(
                        movieId,
                        "MB",
                        city,
                        brchKR,
                        brchEN,
                        movieKR,
                        movieEN,
                        screenKR,
                        screenEN,
                        datestr,
                        runningTime,
                        totalSeat,
                        playKind,
                        startTime,
                        endTime,
                        restSeat,
                        ticketPage
                    )

showTimeList.add(showTime)

데이터 가져오는데 걸린 시간 : 약 4분 30초

DB에 넣는데 걸린 시간 : 약 2분

전체 과정에 걸린 시간 : 약 6분 30초

총 3049 * 25 = 76225 건

 

전체 데이터를 가져오는 시간

val getdata = showTimeRepositorySupport.getShowTimeAll()

약 3초

 

MB의 데이터만 가져오는 시간

val getdata = showTimeRepositorySupport.getShowTime("MB")

약 2.5초


StartTime, EndTime, RestSeat, TicketPage 를 각각 List로 묶어서 넣기

 

Entity

@Entity
@IdClass(ShowTimePK::class)
@Table(name = "ShowTimes")
data class ShowTime(
	@Id
	@Column(name = "MovieId")
	val movieId: String = "",

	@Id
	@Column(name = "MovieTheater")
	val movieTheater: String = "",

	@Column(name = "City")
	val city: String = "서울",

	@Id
	@Column(name = "BrchKR")
	val brchKR: String = "",

	@Column(name = "BrchEN")
	val brchEN: String = "",

	@Id
	@Column(name = "MovieKR")
	val movieKR: String = "",

	@Column(name = "MovieEN")
	val movieEN: String = "",

	@Id
	@Column(name = "ScreenKR")
	val screenKR: String = "",

	@Column(name = "ScreenEN")
	val screemEN: String = "",

	@Id
	@Column(name = "Date")
	val date: String = "",

	@Column(name = "RunningTime")
	val runningTime: Int = 200,

	@Column(name = "TotalSeat")
	val totalSeat: Int = 200,

	@Id
	@Column(name = "PlayKind")
	val playKind: String = "",

	@Column(name = "StartTime", columnDefinition = "json")
	val startTime: String = "",

	@Column(name = "EndTime", columnDefinition = "json")
	val endTime: String = "",

	@Column(name = "RestSeat", columnDefinition = "json")
	val restSeat: String = "",

	@Column(name = "TicketPage", columnDefinition = "json")
	val ticketPage: String = "",
)

데이터 가져오는데 걸린 시간 : 약 4분

DB에 넣는데 걸린 시간 : 약 1분

전체 과정에 걸린 시간 : 약 5분

 

1070 * 25 약 26,750건


StartTime, EndTime, RestSeat, TicketPage 를 json으로 묶어서 넣기

 

Entity

@Entity
@IdClass(ShowTimePK::class)
@Table(name = "ShowTimes")
data class ShowTime(
	@Id
	@Column(name = "MovieId")
	val movieId: String = "",

	@Id
	@Column(name = "MovieTheater")
	val movieTheater: String = "",

	@Column(name = "City")
	val city: String = "서울",

	@Id
	@Column(name = "BrchKR")
	val brchKR: String = "",

	@Column(name = "BrchEN")
	val brchEN: String = "",

	@Id
	@Column(name = "MovieKR")
	val movieKR: String = "",

	@Column(name = "MovieEN")
	val movieEN: String = "",

	@Id
	@Column(name = "ScreenKR")
	val screenKR: String = "",

	@Column(name = "ScreenEN")
	val screemEN: String = "",

	@Id
	@Column(name = "Date")
	val date: String = "",

	@Column(name = "RunningTime")
	var runningTime: Int = 200,

	@Column(name = "TotalSeat")
	val totalSeat: Int = 200,

	@Id
	@Column(name = "PlayKind")
	var playKind: String = "",

	@Column(name = "Items", columnDefinition = "json")
	val items: String = "",
)
val dtos = HashMap<Triple<String, String, String>, ShowTimeDTO>()
for (i in 0 until showtimes.length()) {
    val showtime = showtimes.getJSONObject(i)
    val totalSeat = showtime.getInt("totSeatCnt")
    val playSchldNo = showtime.getString("playSchdlNo")
    val runningTime = showtime.getString("moviePlayTime").toInt()
    val movieKR = showtime.getString("rpstMovieNm")
    val playKind = showtime.getString("playKindNm")
    val screenKR = showtime.getString("theabExpoNm")
    val screenEN = showtime.getString("theabEngNm")
    val ticketPage = "https://www.megabox.co.kr/bookingByPlaySchdlNo?playSchdlNo=${playSchldNo}"

    val restSeat = showtime.getInt("restSeatCnt").toString()
    val startTime = showtime.getString("playStartTime")
    val endTime = showtime.getString("playEndTime")

    val showTimeKey = Triple(movieKR, screenKR, playKind)

    val item = HashMap<String, String>()
    item["StartTime"] = startTime
    item["EndTime"] = endTime
    item["RestSeat"] = restSeat
    item["TicketPage"] = ticketPage
    if (dtos[showTimeKey] == null) {
        val items = ArrayList<HashMap<String, String>>()
        items.add(item)
        val showTimeDTO =
            ShowTimeDTO(movieKR, screenKR, screenEN, runningTime, totalSeat, playKind, items)
        dtos[showTimeKey] = showTimeDTO
    } else {
        dtos[showTimeKey]?.items?.add(item)
    }

}

for (dto in dtos) {
    val data = dto.value
    val movieKR = data.movieKR
    val screenKR = data.screenKR
    val screenEN = data.screemEN
    val runningTime = data.runningTime
    val totalSeat = data.totalSeat
    val playKind = data.playKind
    val items = JSONArray(data.items).toString()

    val movieInfo = movieInfoMap[movieKR]

    val movieId = movieInfo?.first ?: movieKR
    val movieEN = movieInfo?.second ?: ""

    val showTime = ShowTime(
        movieId,
        "MB",
        city,
        brchKR,
        brchEN,
        movieKR,
        movieEN,
        screenKR,
        screenEN,
        datestr,
        runningTime,
        totalSeat,
        playKind,
        items
    )

    showTimeList.add(showTime)

데이터 가져오는데 걸린 시간 : 약 5분 30초

DB에 넣는데 걸린 시간 : 약 1분

전체 과정에 걸린 시간 : 약 6분 30초

 


nas 서버의 성능이 컴퓨터 보다 많이 떨어질 것으로 예상되어 tmp 테이블을 만들어 둔 후 데이터를 tmp 테이블에 담고 원본 테이블과 이름을 swap 원본 테이블은 truncate할 예정.

1시간 단위로 tmp 테이블을 업데이트 후 이름 swap 진행.

실시간으로 요청들어오는 영화관과 날짜만 라이브로 업데이트 진행.

728x90

댓글