TheaterData(movieTheater=MB, city= 인, brchKR=검단, brchEN=Geomdan, addrKR= 인천광역시 서구 서곶로 788 (당하동) 홀리랜드 4층 메가박스 검단, addrEN=788, Seogot-ro, Seo-gu, Incheon, Republic of Korea, theaterCode=4041)
TheaterData를 구하던 중 city가 제대로 안들어가 확인해 보니 주소에 띄어쓰기가 들어가 있는 친구가 있습니다. 주소들은 전부 trim을 적용해 줬습니다.
addrEN의 경우 메가박스만 존재합니다. 나머지 영화관은 영어 주소를 제공하지 않습니다.
CGV의 경우 CINE de CHEF 가 붙은 동일한 영화관이 존재합니다.
압구정의 경우 CINE de CHEF 압구정, CGV압구정으로 있습니다.
허나 둘의 영화관 코드가 다르기에 다른 영화관으로 구분됩니다. 이를 막기위해 CINE de CHEF가 붙은 영화관은 넘기도록 했습니다.
AddrEN의 경우 메가박스만 있기도 하고, save를 하는 과정에서 값이 비어있거나 null이 있는 경우 parameter의 순서가 꼬여버리더군요. 통일성과 편의성을 위해 빠져있습니다.
JpaRepository를 사용하기 위해 repository를 만들고 JpaRepository를 initialize 해줬습니다.
아마 save만을 사용하기에 CrudRepository도 상관 없을 듯 합니다.
TheaterDataRepository.kt
interface TheaterDataRepository : JpaRepository<TheaterData, TheaterDataPK> {
}
이를 사용하기 위한 Entity와 키를 만들어 줍시다.
저는 MovieTheater(CGV, LC, MB)와 각각의 TheaterCode를 복합키로 사용하여 PK라는 클래스가 있습니다.
Entity에 해당 pk class를 추가해주고 Repository에도 해당 키를 사용한다는 표시를 해줘야 합니다.
JpaRepository<TheaterData, TheaterDataPK>
TheaterDataPK
data class TheaterDataPK(
val movieTheater: String = "MT",
val theaterCode: String = "1234",
) : Serializable
TheaterData
@Entity
@Table(name = "TheaterData")
@IdClass(TheaterDataPK::class)
@SQLInsert(
sql = "INSERT IGNORE INTO TheaterData(AddrEN, AddrKR, BrchEN, BrchKR, City, MovieTheater, TheaterCode)" +
"VALUES(?,?,?,?,?,?,?) "
)
data class TheaterData(
@Id
@Column(name = "MovieTheater")
val movieTheater: String = "MT",
@Column(name = "City")
val city: String = "서울",
@Column(name = "BrchKR")
val brchKR: String = "",
@Column(name = "BrchEN")
val brchEN: String = "",
@Column(name = "AddrKR")
val addrKR: String = "",
@Column(name = "AddrEN", nullable = true)
val addrEN: String? = null,
@Id
@Column(name = "TheaterCode")
val theaterCode: String = "1234",
Insert Ignore를 사용하기 위해 SQLInsert를 사용합니다.
※주의) SQLInsert 사용 시 들어가는 parameter가 abcd순서대로 정렬되어서 들어갑니다.. 그래서 column의 순서와 다르게 insert 인자 순서를 주셔야 합니다.
이를 사용하기 위한 controller와 service 입니다.
TheaterDataController
@RestController
@RequestMapping("/api/theaterdata")
class TheaterDataController(val service: TheaterDataServiceImpl) {
@GetMapping("/{MovieTheater}")
fun getTheaterData(@PathVariable MovieTheater: String): List<TheaterData> = service.getTheaterData(MovieTheater)
@GetMapping
fun getTheaterDataAll(): List<TheaterData> = service.getTheaterDataAll()
}
TheaterDataService
interface TheaterDataService {
fun getTheaterData(movieTheater: String): List<TheaterData>
fun getTheaterDataAll(): List<TheaterData>
}
TheaterDataServiceImpl (자세한 코드는 너무 길어 이전의 크롤러 글을 확인하시기 바랍니다.)
@Service
class TheaterDataServiceImpl(
val theaterDataRepositorySupport: TheaterDataRepositorySupport,
val theaterDataRepository: TheaterDataRepository,
) : TheaterDataService {
val userAgent: String =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
val CGVurl = "http://www.cgv.co.kr"
val LCurl = "http://www.lottecinema.co.kr"
val mburl = "https://www.megabox.co.kr"
override fun getTheaterDataAll(): List<TheaterData> {
var TheaterData = getCGVTheaters()
TheaterData += getMBTheaters()
TheaterData += getLCTheaters()
theaterDataRepository.saveAll(TheaterData)
return TheaterData
}
}


완료!
'Project > ThreeMovie(영화리뷰및예약도우미)' 카테고리의 다른 글
| ShowTime 데이터 저장 시간 줄이기 (0) | 2023.03.14 |
|---|---|
| JpaRepository join using QueryProjection with DTO(kotlin) (0) | 2023.03.13 |
| CGV, Lotte Cinema, MegaBox 각각 크롤링 필요한 데이터 정리 및 DB에 맞게 수정 (요약 코드) (0) | 2023.03.06 |
| 2023/03/02 회의록 (0) | 2023.03.02 |
| 메가박스(MegaBox) 시간표 가져오기(jsoup, kotlin) (0) | 2023.03.02 |
댓글