스프링에서 dto의 LocalDate.now()의존성 풀기
이전글
https://rkrkrr0101.tistory.com/126
모든코드는 코틀린임
일단 밸리데이션의 LocalDate.now()는 해결했는데,문제는 dto에서 따로 검증하는 로직중에서 LocalDate.now()를 사용하는 로직이 있었음
이거도 테스트에서 LocalDate.now()를 의존하니까 의존성을 약하게해야했음
@PostMapping("/aa")
fun save(@Valid @RequestBody aaDto: AaDto){
...
}
data class AaDto(...){
init {
...
val a=LocalDate.now()
...
}
}
대충 이런식
이래서 이런식의 문제를 해결할때 사용하는 가장 국룰패턴인,
인터페이스를 뽑고,
구현체에 해당객체를 바로 리턴한다음,
@Component를 붙이고,
테스트에선 페이크객체를 사용하는 방법을 사용했음
이렇게 인터페이스를 만들고
interface CustomDate {
fun now():LocalDate
}
구현체를 만들어서 LocalDate.now()를 바로 리턴함
@Component
class CustomDateImpl:CustomDate {
override fun now():LocalDate {
return LocalDate.now()
}
}
그리고 테스트쪽에 해당인터페이스를 받는 fake객체를 만듬
class CustomDateFake(private val fixedDate:String):CustomDate {
override fun now(): LocalDate {
return LocalDate.parse(fixedDate)
}
}
여기까진 스무스하게 했는데,문제는 dto안에 저 customDate를 넣어줄 방법이 없었음
리퀘스트바디로 값을 받는이상 인터페이스로 di를 받을수가 없었음
그렇다고 구현체를 직접 생성하면 의미가 없어지고
물론 컨트롤러에서 직접 dto를 받는게 아닌,직접 값을 받아서 조립하면 될거같긴한데 그러고싶지않았고..
그래서 한시간동안
applicationContext로 bean직접 받기->하려다가 코드개판나는거보고 손뗐음
어케 잘하면 저거무시하고 못받나하고 컨트롤러와 씨름하기->실패
이런저런짓을 하다가 결국엔
data class AaDto(...){
lateinit var customDate:CustomDate
fun checkDate() {
...
val a=customDate.now()
...
}
}
이렇게 lateinit로 받고,컨트롤러에서 해당값을 넣어준다음 함수까지 호출하는,즉 컨트롤러쪽에 책임을 넘겨버렸음
이게 어지간하면 dto안에서 처리하고싶었는데(일단 저래버리면 customDate를 까먹고 호출하지않으면 검증을 하지않는거니)따로 방법을 찾지못했음..
일단 이렇게 해결을 하고,테스트코드에서도
@Test
fun ada(){
val aaDto = AaDto("name","price")
aaDto.customDate=CustomDateFake("2020-06-15")
aaDto.checkDate()
}
이런식으로 해서 일단 결과는 나왔는데..
나중에 더 깔끔하게 묶는방법을 찾으면 글 수정하겠음
아시는분 있으면 댓글달아주세요 ㅜㅜ