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
댓글