diff --git a/build.gradle.kts b/build.gradle.kts index 526700b1..9a917f11 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,18 +41,15 @@ dependencies { implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") - implementation("org.springframework.boot:spring-boot-starter-web") - // spring test testImplementation("org.springframework.boot:spring-boot-starter-test") testFixturesImplementation("org.springframework.boot:spring-boot-starter-test") // jpa implementation("org.springframework.boot:spring-boot-starter-data-jpa") - runtimeOnly("com.mysql:mysql-connector-j") - // mongodb - implementation("org.springframework.boot:spring-boot-starter-data-mongodb") + //mysql + runtimeOnly("com.mysql:mysql-connector-j") // security implementation("org.springframework.boot:spring-boot-starter-security") @@ -77,7 +74,6 @@ dependencies { // caffeine implementation("com.github.ben-manes.caffeine:caffeine:3.1.8") - // RestDocs testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc") asciidoctorExt("org.springframework.restdocs:spring-restdocs-asciidoctor") @@ -85,12 +81,10 @@ dependencies { // webclient implementation("org.springframework.boot:spring-boot-starter-webflux") + //JSON implementation("org.json:json:20231013") - //Gson - implementation("com.google.code.gson:gson:2.8.9") - // logger implementation("io.github.oshai:kotlin-logging-jvm:5.1.0") diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomInfoProvider.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomInfoProvider.kt new file mode 100644 index 00000000..d1b9f556 --- /dev/null +++ b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomInfoProvider.kt @@ -0,0 +1,31 @@ +package com.asap.asapbackend.batch.classroom + +import com.asap.asapbackend.domain.classroom.domain.model.Classroom +import com.asap.asapbackend.domain.school.domain.model.School + +interface ClassroomInfoProvider { + fun retrieveClassroomInfo(batchSize: Int, pageNumber: Int): ClassroomDataContainer + + data class ClassroomDataContainer( + val classroomInfo: List, + val hasNext: Boolean + ) + + data class ClassroomInfo( + val school: School, + val grade: Int, + val classNumber: String + ) { + fun toClassroom(): Classroom { + return Classroom( + school = school, + grade = grade, + className = classNumber + ) + } + } +} + +fun List.toClassrooms(): List { + return this.map { it.toClassroom() } +} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomOpenApiClient.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomOpenApiClient.kt deleted file mode 100644 index 030eb2b9..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomOpenApiClient.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.asap.asapbackend.batch.classroom - -import com.asap.asapbackend.batch.classroom.dto.ClassInfo -import com.asap.asapbackend.batch.classroom.dto.ClassroomResponse -import com.asap.asapbackend.domain.school.domain.model.School -import com.asap.asapbackend.domain.school.domain.repository.SchoolRepository -import com.google.gson.Gson -import org.json.JSONObject -import org.json.XML -import org.springframework.stereotype.Service -import org.springframework.web.reactive.function.client.WebClient -import org.springframework.web.util.UriBuilder - -@Service -class ClassroomOpenApiClient( - private val schoolRepository: SchoolRepository -) { - - fun getClassroom(): List { - val schools = schoolRepository.findAll() - val resultList: MutableList = mutableListOf() - schools.forEach { school -> - val apiUrl = "https://open.neis.go.kr/hub/classInfo" - val client = WebClient.create(apiUrl) - val result = client.get() - .uri { uriBuilder: UriBuilder -> - uriBuilder - .queryParam("KEY", "32e897d4054342b19fd68dfb1b9ba621") - .queryParam("ATPT_OFCDC_SC_CODE", school.eduOfficeCode) - .queryParam("SD_SCHUL_CODE", school.schoolCode) - .queryParam("AY", "2024") - .build() - } - .retrieve() - .bodyToMono(String::class.java) - .block() - val jsonObject = XML.toJSONObject(result) - if (jsonObject.has("classInfo")) { - val classInfo = jsonObject.getJSONObject("classInfo").getJSONArray("row") - val resultJsonObject = JSONObject().put("classInfo", classInfo) - val jsonResult = resultJsonObject.toString(4) - val info = Gson().fromJson(jsonResult, ClassInfo::class.java) - resultList.addAll(setDataList(info, school)) - } - } - return resultList - } - - private fun setDataList(classInfo: ClassInfo, school: School): List { - val resultList: MutableList = mutableListOf() - - for (row in classInfo.classInfo) { - resultList += ClassroomResponse( - row.GRADE, - row.CLASS_NM, - school - ) - } - return resultList - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomScheduler.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomScheduler.kt index e895a730..b0c3f965 100644 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomScheduler.kt +++ b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomScheduler.kt @@ -1,16 +1,27 @@ package com.asap.asapbackend.batch.classroom +import com.asap.asapbackend.domain.classroom.domain.service.ClassroomAppender +import com.asap.asapbackend.global.util.TransactionUtils import org.springframework.scheduling.annotation.Scheduled -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RestController +import org.springframework.stereotype.Component -@RestController +@Component class ClassroomScheduler( - private val classroomService: ClassroomService + private val classroomInfoProvider: ClassroomInfoProvider, + private val classroomAppender: ClassroomAppender ) { - @Scheduled(cron = "0 0 4 1 3 ?") // 매년 3월 1일 04:00:00에 실행 - @GetMapping("/addClassroom") - fun addClassroom(){ - classroomService.addClassroom() + @Scheduled(cron = "0 5 4 1 3 ?") // 매년 3월 1일 04:05:00에 실행 + fun addClassroom() { + val batchSize = 100 + var pageNumber = 0 + do { + val classroomDataContainer = classroomInfoProvider.retrieveClassroomInfo(batchSize, pageNumber) + + pageNumber++ + + TransactionUtils.writable { + classroomAppender.addClassroom(classroomDataContainer.classroomInfo.toClassrooms()) + } + } while (classroomDataContainer.hasNext) } } \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomService.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomService.kt deleted file mode 100644 index 34a3f45e..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/ClassroomService.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.asap.asapbackend.batch.classroom - -import com.asap.asapbackend.domain.classroom.domain.service.ClassroomAppender -import org.springframework.stereotype.Service - -@Service -class ClassroomService( - private val classroomReader: ClassroomOpenApiClient, - private val classroomAppender: ClassroomAppender -) { - fun addClassroom() { - val classroom = classroomReader.getClassroom() - classroomAppender.addClassroom(classroom) - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassInfo.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassInfo.kt deleted file mode 100644 index 05476243..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassInfo.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.asap.asapbackend.batch.classroom.dto - -data class ClassInfo( - val classInfo: List -) diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassRoomInfo.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassRoomInfo.kt deleted file mode 100644 index fbf33499..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassRoomInfo.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.asap.asapbackend.batch.classroom.dto - -data class ClassRoomInfo ( - val ATPT_OFCDC_SC_CODE: String?, - val ATPT_OFCDC_SC_NM: String?, - val SD_SCHUL_CODE: String?, - val SCHUL_NM: String?, - val AY: String?, - val GRADE: Int, - val DGHT_CRSE_SC_NM: String?, - val SCHUL_CRSE_SC_NM: String?, - val ORD_SC_NM: String?, - val DDDEP_NM: String?, - val CLASS_NM: String, - val LOAD_DTM: String? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassroomResponse.kt b/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassroomResponse.kt deleted file mode 100644 index 287136df..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/classroom/dto/ClassroomResponse.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.asap.asapbackend.batch.classroom.dto - -import com.asap.asapbackend.domain.school.domain.model.School - -data class ClassroomResponse( - val grade: Int, - val classNumber: String, - val school: School -) diff --git a/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolInfoProvider.kt b/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolInfoProvider.kt index 19f4a970..69fac133 100644 --- a/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolInfoProvider.kt +++ b/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolInfoProvider.kt @@ -1,6 +1,5 @@ package com.asap.asapbackend.batch.school -import com.asap.asapbackend.client.openapi.school.dto.SchoolInfo import com.asap.asapbackend.domain.school.domain.model.School interface SchoolInfoProvider { @@ -16,8 +15,8 @@ interface SchoolInfoProvider { val eduOfficeCode: String, //ATPT_OFCDC_SC_CODE val schoolCode: String, //SD_SCHUL_CODE val school: String, //SCHUL_NM - val address:String //ORG_RDNMA - ){ + val address: String //ORG_RDNMA + ) { fun toSchool(): School { return School( eduOfficeCode = eduOfficeCode, diff --git a/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolScheduler.kt b/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolScheduler.kt index 87d2dd26..1b461294 100644 --- a/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolScheduler.kt +++ b/src/main/kotlin/com/asap/asapbackend/batch/school/SchoolScheduler.kt @@ -2,23 +2,18 @@ package com.asap.asapbackend.batch.school import com.asap.asapbackend.domain.school.domain.service.SchoolAppender import com.asap.asapbackend.global.util.TransactionUtils -import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component -private val logger = KotlinLogging.logger {} - @Component class SchoolScheduler( private val schoolInfoProvider: SchoolInfoProvider, private val schoolAppender: SchoolAppender ) { @Scheduled(cron = "0 0 4 1 3 ?") // 매년 3월 1일 04:00:00에 실행 -// @Scheduled(fixedRate = 500000) // 500초마다 실행 fun addSchool() { val batchSize = 100 var startIndex = 1 - logger.info { "start scheduler" } do { val schoolDataContainer = schoolInfoProvider.retrieveSchoolInfo(batchSize, startIndex) @@ -27,6 +22,6 @@ class SchoolScheduler( TransactionUtils.writable { schoolAppender.appendUniqueSchool(schoolDataContainer.schoolInfo.toSchools()) } - }while (schoolDataContainer.hasNext) + } while (schoolDataContainer.hasNext) } } \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/school/exception/NotFoundSchoolException.kt b/src/main/kotlin/com/asap/asapbackend/batch/school/exception/NotFoundSchoolException.kt deleted file mode 100644 index 7b1a3a95..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/school/exception/NotFoundSchoolException.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.spot.refactoring.global - -class NotFoundSchoolException( - message: String -) : RuntimeException(message) { -} diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableOpenApiClient.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableOpenApiClient.kt deleted file mode 100644 index 52f053d9..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableOpenApiClient.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.asap.asapbackend.batch.timetable - -import com.asap.asapbackend.batch.timetable.dto.ElsTimetable -import com.asap.asapbackend.batch.timetable.dto.TimetableResponse -import com.google.gson.Gson -import com.spot.refactoring.global.NotFoundTimetableException -import org.json.JSONObject -import org.json.XML -import org.springframework.stereotype.Service -import org.springframework.web.reactive.function.client.WebClient -import org.springframework.web.util.UriBuilder - -@Service -class TimetableOpenApiClient { - fun getTimetable(): List { - val apiUrl = "https://open.neis.go.kr/hub/elsTimetable" - val client = WebClient.create(apiUrl) - val result = client.get() - .uri { uriBuilder: UriBuilder -> - uriBuilder - .queryParam("KEY", "32e897d4054342b19fd68dfb1b9ba621") - .queryParam("ATPT_OFCDC_SC_CODE", "T10") - .queryParam("SD_SCHUL_CODE", "9299048") - .queryParam("AY", "2024") - .queryParam("SEM", "1") - .queryParam("GRADE", "1") - .queryParam("CLASS_N", "1") - .queryParam("TI_FROM_YMD", "20240429") - .queryParam("TI_TO_YMD", "20240503") - .build() - } - .retrieve() - .bodyToMono(String::class.java) - .block() - val jsonResult = parseXmlData(result) - val elsTimetable = Gson().fromJson(jsonResult, ElsTimetable::class.java) - return result?.let { setDataList(elsTimetable) } ?: throw RuntimeException() - } - - private fun setDataList(elsTimetable: ElsTimetable): List { - val resultList: MutableList = mutableListOf() - - for (row in elsTimetable.elsTimetable) { - resultList += TimetableResponse( - row.ALL_TI_YMD, - row.PERIO, - row.ITRT_CNTNT - ) - } - return resultList - } - - private fun parseXmlData(xmlString: String?): String { - val jsonObject = XML.toJSONObject(xmlString) - try{ - val elsTimetableArray = jsonObject.getJSONObject("elsTimetable").getJSONArray("row") - val resultJsonObject = JSONObject().put("elsTimetable", elsTimetableArray) - return resultJsonObject.toString(4) - }catch (e: Exception){ - val message = jsonObject.getJSONObject("RESULT").getString("MESSAGE") - throw NotFoundTimetableException(message) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableScheduler.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableScheduler.kt deleted file mode 100644 index 2370da9d..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableScheduler.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.asap.asapbackend.batch.timetable - -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RestController - -@RestController -class TimetableScheduler ( - private val timetableService: TimetableService -){ - @Scheduled(cron = "0 0 * * * *", zone = "Asia/Seoul") //1시간마다 - @GetMapping("/timetable") - fun getTimetable() { - println(timetableService.getTimetable()) //연관관계 설정 후 db에 넣는 것으로 변경 예정 - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableService.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableService.kt deleted file mode 100644 index 0c87fdf0..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/TimetableService.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.asap.asapbackend.batch.timetable - -import com.asap.asapbackend.batch.timetable.dto.TimetableResponse -import org.springframework.stereotype.Service - -@Service -class TimetableService( - private val timetableOpenApiClient: TimetableOpenApiClient -) { - fun getTimetable(): List { - return timetableOpenApiClient.getTimetable() - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/ElsTimetable.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/ElsTimetable.kt deleted file mode 100644 index 4cdb90d7..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/ElsTimetable.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class ElsTimetable( - var elsTimetable: List -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Head.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Head.kt deleted file mode 100644 index 43b56309..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Head.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class Head( - val list_total_count: Int?, - val RESULT: Result? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Result.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Result.kt deleted file mode 100644 index 60ccb8e4..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Result.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class Result( - val CODE: String?, - val MESSAGE: String? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Row.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Row.kt deleted file mode 100644 index c17e8d81..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Row.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class Row( - val ATPT_OFCDC_SC_CODE: String?, - val PERIO: String?, - val ATPT_OFCDC_SC_NM: String?, - val SD_SCHUL_CODE: String?, - val AY: String?, - val GRADE: String?, - val SEM: String?, - val CLASS_NM: String?, - val ALL_TI_YMD: String?, - val SCHUL_NM: String?, - val ITRT_CNTNT: String?, - val LOAD_DTM: String? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Timetable.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Timetable.kt deleted file mode 100644 index 355a177f..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/Timetable.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class Timetable( - val head: List?, - val row: List? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/TimetableResponse.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/TimetableResponse.kt deleted file mode 100644 index 045b8a5a..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/dto/TimetableResponse.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.asap.asapbackend.batch.timetable.dto - -data class TimetableResponse ( - val day: String?, - val time: String?, - val subject: String? -) \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/batch/timetable/exception/NotFoundTimetableException.kt b/src/main/kotlin/com/asap/asapbackend/batch/timetable/exception/NotFoundTimetableException.kt deleted file mode 100644 index 58e7c9a5..00000000 --- a/src/main/kotlin/com/asap/asapbackend/batch/timetable/exception/NotFoundTimetableException.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.spot.refactoring.global - -class NotFoundTimetableException( - message: String -) : RuntimeException(message) { -} diff --git a/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/ClassroomOpenApiClient.kt b/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/ClassroomOpenApiClient.kt new file mode 100644 index 00000000..3f635edc --- /dev/null +++ b/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/ClassroomOpenApiClient.kt @@ -0,0 +1,49 @@ +package com.asap.asapbackend.client.openapi.classroom + +import com.asap.asapbackend.batch.classroom.ClassroomInfoProvider +import com.asap.asapbackend.client.openapi.classroom.dto.ClassroomOpenApiResponse +import com.asap.asapbackend.domain.school.domain.repository.SchoolRepository +import com.fasterxml.jackson.databind.ObjectMapper +import org.springframework.data.domain.PageRequest +import org.springframework.stereotype.Component +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.util.UriBuilder +import java.time.Year + +@Component +class ClassroomOpenApiClient( + private val schoolRepository: SchoolRepository, + private val objectMapper: ObjectMapper +) : ClassroomInfoProvider { + override fun retrieveClassroomInfo(batchSize: Int, pageNumber: Int): ClassroomInfoProvider.ClassroomDataContainer { + val pageable = PageRequest.of(pageNumber, batchSize) + val schools = schoolRepository.findAll(pageable) + val hasNext = schools.hasNext() + val classroomInfoList = schools.map { school -> + val apiUrl = "https://open.neis.go.kr/hub/classInfo" + val classroomInfoResult = WebClient.create(apiUrl).get() + .uri { uriBuilder: UriBuilder -> + uriBuilder + .queryParam("KEY", "32e897d4054342b19fd68dfb1b9ba621") + .queryParam("ATPT_OFCDC_SC_CODE", school.eduOfficeCode) + .queryParam("SD_SCHUL_CODE", school.schoolCode) + .queryParam("AY", Year.now()) + .queryParam("Type", "json") + .build() + } + .retrieve() + .bodyToMono(String::class.java) + .map { + objectMapper.readValue(it, ClassroomOpenApiResponse::class.java) + } + .block() + classroomInfoResult?.classInfo?.flatMap { classInfo -> + classInfo.row?.map { it.toClassroomInfo(school) } ?: emptyList() + } ?: emptyList() + }.flatten() + return ClassroomInfoProvider.ClassroomDataContainer( + classroomInfo = classroomInfoList, + hasNext = hasNext + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/dto/ClassroomOpenApiResponse.kt b/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/dto/ClassroomOpenApiResponse.kt new file mode 100644 index 00000000..adfdeab5 --- /dev/null +++ b/src/main/kotlin/com/asap/asapbackend/client/openapi/classroom/dto/ClassroomOpenApiResponse.kt @@ -0,0 +1,37 @@ +package com.asap.asapbackend.client.openapi.classroom.dto + +import com.asap.asapbackend.batch.classroom.ClassroomInfoProvider +import com.asap.asapbackend.domain.school.domain.model.School + +data class ClassroomOpenApiResponse( + val classInfo: List?, + val RESULT: Result? +) + +data class ClassInfo( + val head: List?, + val row: List? +) + +data class Head( + val list_total_count: Int?, + val RESULT: Result? +) + +data class Result( + val CODE: String, + val MESSAGE: String +) + +data class Row( + val GRADE: Int, + val CLASS_NM: String +) { + fun toClassroomInfo(school: School): ClassroomInfoProvider.ClassroomInfo { + return ClassroomInfoProvider.ClassroomInfo( + school, + GRADE, + CLASS_NM + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/client/openapi/school/SchoolOpenApiClient.kt b/src/main/kotlin/com/asap/asapbackend/client/openapi/school/SchoolOpenApiClient.kt index b4056250..30351092 100644 --- a/src/main/kotlin/com/asap/asapbackend/client/openapi/school/SchoolOpenApiClient.kt +++ b/src/main/kotlin/com/asap/asapbackend/client/openapi/school/SchoolOpenApiClient.kt @@ -6,8 +6,8 @@ import org.springframework.stereotype.Component import org.springframework.web.reactive.function.client.WebClient @Component -class SchoolOpenApiClient : SchoolInfoProvider{ - override fun retrieveSchoolInfo(batchSize: Int, startIndex: Int): SchoolInfoProvider.SchoolDataContainer{ +class SchoolOpenApiClient : SchoolInfoProvider { + override fun retrieveSchoolInfo(batchSize: Int, startIndex: Int): SchoolInfoProvider.SchoolDataContainer { val endIndex = startIndex + batchSize val apiUrl = "http://openapi.seoul.go.kr:8088/4b78477274736f6d36386d505a614b/json/neisSchoolInfoJS/$startIndex/$endIndex" val schoolInfoResult = WebClient.create(apiUrl).get() @@ -15,7 +15,7 @@ class SchoolOpenApiClient : SchoolInfoProvider{ .bodyToMono(SchoolOpenApiResponse::class.java) .block() val neisSchoolInfoJS = schoolInfoResult?.neisSchoolInfoJS - val hasNext = (schoolInfoResult?.neisSchoolInfoJS?.list_total_count ?: 0) > endIndex + val hasNext = (neisSchoolInfoJS?.list_total_count ?: 0) > endIndex return SchoolInfoProvider.SchoolDataContainer( schoolInfo = neisSchoolInfoJS?.row?.map { it.toSchoolInfo() } ?: emptyList(), hasNext = hasNext diff --git a/src/main/kotlin/com/asap/asapbackend/client/openapi/school/dto/SchoolOpenApiResponse.kt b/src/main/kotlin/com/asap/asapbackend/client/openapi/school/dto/SchoolOpenApiResponse.kt index b6230739..6483831d 100644 --- a/src/main/kotlin/com/asap/asapbackend/client/openapi/school/dto/SchoolOpenApiResponse.kt +++ b/src/main/kotlin/com/asap/asapbackend/client/openapi/school/dto/SchoolOpenApiResponse.kt @@ -4,47 +4,26 @@ import com.asap.asapbackend.batch.school.SchoolInfoProvider data class SchoolOpenApiResponse( - val neisSchoolInfoJS: NeisSchoolInfoJS + val neisSchoolInfoJS: NeisSchoolInfoJS ) data class NeisSchoolInfoJS( - val list_total_count: Int, - val row: List? + val list_total_count: Int, + val row: List? ) data class SchoolInfo( - val ATPT_OFCDC_SC_CODE: String, - val ATPT_OFCDC_SC_NM: String, - val SD_SCHUL_CODE: String, - val SCHUL_NM: String, - val ENG_SCHUL_NM: String, - val SCHUL_KND_SC_NM: String, - val LCTN_SC_NM: String, - val JU_ORG_NM: String, - val FOND_SC_NM: String, - val ORG_RDNZC: String, - val ORG_RDNMA: String, - val ORG_RDNDA: String, - val ORG_TELNO: String, - val HMPG_ADRES: String, - val COEDU_SC_NM: String, - val ORG_FAXNO: String, - val HS_SC_NM: String, - val INDST_SPECL_CCCCL_EXST_YN: String, - val HS_GNRL_BUSNS_SC_NM: String, - val SPCLY_PURPS_HS_ORD_NM: String, - val ENE_BFE_SEHF_SC_NM: String, - val DGHT_SC_NM: String, - val FOND_YMD: String, - val FOAS_MEMRD: String, - val LOAD_DTM: String -){ - fun toSchoolInfo(): SchoolInfoProvider.SchoolInfo{ - return SchoolInfoProvider.SchoolInfo( - ATPT_OFCDC_SC_CODE, - SD_SCHUL_CODE, - SCHUL_NM, - ORG_RDNMA - ) - } + val ATPT_OFCDC_SC_CODE: String, + val SD_SCHUL_CODE: String, + val SCHUL_NM: String, + val ORG_RDNMA: String +) { + fun toSchoolInfo(): SchoolInfoProvider.SchoolInfo { + return SchoolInfoProvider.SchoolInfo( + ATPT_OFCDC_SC_CODE, + SD_SCHUL_CODE, + SCHUL_NM, + ORG_RDNMA + ) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/domain/classroom/domain/service/ClassroomAppender.kt b/src/main/kotlin/com/asap/asapbackend/domain/classroom/domain/service/ClassroomAppender.kt index b9c9dacd..4095f320 100644 --- a/src/main/kotlin/com/asap/asapbackend/domain/classroom/domain/service/ClassroomAppender.kt +++ b/src/main/kotlin/com/asap/asapbackend/domain/classroom/domain/service/ClassroomAppender.kt @@ -1,10 +1,8 @@ package com.asap.asapbackend.domain.classroom.domain.service -import com.asap.asapbackend.batch.classroom.dto.ClassroomResponse import com.asap.asapbackend.domain.child.domain.model.Child import com.asap.asapbackend.domain.classroom.domain.model.ChildClassroom import com.asap.asapbackend.domain.classroom.domain.model.Classroom -import com.asap.asapbackend.domain.classroom.domain.model.Grade import com.asap.asapbackend.domain.classroom.domain.model.TeacherClassroom import com.asap.asapbackend.domain.classroom.domain.repository.ChildClassRoomRepository import com.asap.asapbackend.domain.classroom.domain.repository.ClassroomRepository @@ -37,16 +35,9 @@ class ClassroomAppender( ) } - fun addClassroom(classrooms: List) { // TODO : 리팩터링 - for (classroom in classrooms) { - if(classroomRepository.findBySchoolAndGradeAndClassName(classroom.school, Grade.convert(classroom.grade),classroom.classNumber)==null){ - val newClassroom = Classroom( - grade = classroom.grade, - className = classroom.classNumber, - school = classroom.school - ) - classroomRepository.save(newClassroom) - } + fun addClassroom(classrooms: List) { + classrooms.forEach { + classroomRepository.save(it) } } } \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/domain/menu/domain/model/Menu.kt b/src/main/kotlin/com/asap/asapbackend/domain/menu/domain/model/Menu.kt index e6467786..1dd81342 100644 --- a/src/main/kotlin/com/asap/asapbackend/domain/menu/domain/model/Menu.kt +++ b/src/main/kotlin/com/asap/asapbackend/domain/menu/domain/model/Menu.kt @@ -1,16 +1,17 @@ package com.asap.asapbackend.domain.menu.domain.model -import jakarta.persistence.Id -import org.springframework.data.mongodb.core.mapping.Document +import com.asap.asapbackend.domain.school.domain.model.School +import com.asap.asapbackend.global.domain.BaseDateEntity +import jakarta.persistence.Entity +import jakarta.persistence.FetchType +import jakarta.persistence.ManyToOne import java.time.LocalDate -@Document("menu") +@Entity class Menu( - @Id - val id: String? = null, - val schoolId: Long, - val day: LocalDate, - val food: List -) { - + school: School, + day: LocalDate +) : BaseDateEntity() { + @ManyToOne(fetch = FetchType.LAZY) + val school: School = school } \ No newline at end of file diff --git a/src/main/kotlin/com/asap/asapbackend/domain/school/domain/repository/SchoolRepository.kt b/src/main/kotlin/com/asap/asapbackend/domain/school/domain/repository/SchoolRepository.kt index ada600a0..07ee0f49 100644 --- a/src/main/kotlin/com/asap/asapbackend/domain/school/domain/repository/SchoolRepository.kt +++ b/src/main/kotlin/com/asap/asapbackend/domain/school/domain/repository/SchoolRepository.kt @@ -4,9 +4,7 @@ import com.asap.asapbackend.domain.school.domain.model.School import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query -interface SchoolRepository: JpaRepository { - fun findBySchoolCode(schoolCode: String): School? - +interface SchoolRepository : JpaRepository { @Query("SELECT s.schoolCode FROM School s WHERE s.schoolCode IN :schoolCodes") fun findSchoolCodeBySchoolCodeIn(schoolCodes: List): List } \ No newline at end of file