https://github.com/Seungkyu-Han/Toge-do-backend
GitHub - Seungkyu-Han/Toge-do-backend: Toge-do 앱의 백엔드 리포지토리입니다
Toge-do 앱의 백엔드 리포지토리입니다. Contribute to Seungkyu-Han/Toge-do-backend development by creating an account on GitHub.
github.com
해당 프로젝트 중에 아래와 같은 data class를 object mapper를 사용하여 읽은 후 redis에 String으로 저장하는 코드가 있었다.
package vp.togedo.model.documents.personalSchedule
import org.bson.types.ObjectId
import vp.togedo.model.exception.personalSchedule.PersonalScheduleEndTimeBeforeStartTimeException
import vp.togedo.model.exception.personalSchedule.PersonalScheduleTimeIsNotRangeException
data class PersonalScheduleElement(
val id: ObjectId = ObjectId.get(),
val startTime: String,
val endTime: String,
val name: String,
val color: String
){
/**
* 해당 개인 스케줄 요소의 시작 시간이 종료 시간보다 앞인지 확인
* @return true
* @throws PersonalScheduleEndTimeBeforeStartTimeException 종료 시간이 시작 시간보다 앞에 있음
*/
private fun isStartTimeBefore(): Boolean{
if(startTime.length != endTime.length ||
startTime > endTime)
throw PersonalScheduleEndTimeBeforeStartTimeException()
return true
}
/**
* 해당 스케줄의 시간이 범위 내에 있는지 확인
* @param startTimeRange 시작 범위
* @param endTimeRange 종료 범위
* @return true
* @throws PersonalScheduleTimeIsNotRangeException 유효한 시간 범위가 아님
*/
private fun isTimeRange(
startTimeRange: String,
endTimeRange: String): Boolean{
if(startTime.length != startTimeRange.length ||
endTime.length != endTimeRange.length ||
startTime !in startTimeRange..endTimeRange ||
endTime !in startTimeRange..endTimeRange){
throw PersonalScheduleTimeIsNotRangeException()
}
return true
}
/**
* 유동 스케줄의 시간이 유효한지 확인
* @return true
* @throws PersonalScheduleTimeIsNotRangeException 유효한 시간 범위가 아님
* @throws PersonalScheduleEndTimeBeforeStartTimeException 종료 시간이 시작 시간보다 앞에 있음
*/
fun isValidTimeForFlexibleSchedule(): Boolean{
return isStartTimeBefore() &&
//00(년)_01(월)_01(일)_00(시)_00(분) ~ 99(년)_12(월)_31(일)_23(시)_59(분)
isTimeRange(
startTimeRange = "0001010000",
endTimeRange = "9912312359",)
}
/**
* 고정 스케줄의 시간이 유효한지 확인
* @return true
* @throws PersonalScheduleTimeIsNotRangeException 유효한 시간 범위가 아님
* @throws PersonalScheduleEndTimeBeforeStartTimeException 종료 시간이 시작 시간보다 앞에 있음
*/
fun isValidTimeForFixedSchedule(): Boolean{
return isStartTimeBefore() &&
//1(요일)_00(시)_00(분) ~ 7(요일)_23(시)_59(분)
isTimeRange(
startTimeRange = "10000",
endTimeRange = "72359")
}
}
그리고 여기에서 고정 일정을 추가하기 위해 isValidFimeForFixedSchedule만 호출을 하고 저장을 하는데, 계속 isValidTimeForFixedSchedule이 호출되어 Exception이 발생했다.
디버깅을 아무리 해보아도, 해당 API에서는 Fix 검증 코드만 사용하고 있었기에 버그를 잡기가 굉장히 어려웠다.
그러던 중 해당 에러가, redis 저장과정에서 생긴 다는 것을 알게 되었고 object mapper의 writeValueAsString에서 에러가 발생했다.
아니....왜 직렬화만 하라니까 함수를 호출하지?라고 생각을 하며 이유를 찾아보고 있었는데 함수의 이름 때문이었다.
직렬화 과정에서 함수 앞에 "is"가 붙어있으면 호출하여 해당 함수로 조건검사를 시도한다는 것이었다.
지금 함수명들이 IsValidTime이기 때문에 해당 함수들로 조건검사를 했던 것이다.
이 방법을 알고 있지 않았기 때문에 직접 조건검사를 하고 추가를 해주었고, 지금은 이 조건검사를 해제해야 했다.
@JsonIgnore
함수들에 이 annotation을 붙여주면 된다.
직렬화를 하지 않겠다는 것이다.
다음에는 굳이 ignore가 아닌, 직렬화를 조건검사를 한 후에 할 수도 있겠다라는 생각이 들었다.
'토이 프로젝트' 카테고리의 다른 글
Stomp에서 Jwt Filter 구현하기 (1) | 2025.01.23 |
---|---|
Hexagonal Architecture 적용하기 (1) | 2025.01.22 |
Spring Webflux + Stomp를 사용해 채팅 구현하기 (0) | 2025.01.05 |
MSA에서 Kafka없이 MongoDB만으로 채팅서버 구현하기 (1) | 2025.01.03 |
WebFlux SwitchIfEmpty가 항상 시작되는 에러 (2) | 2024.12.23 |