어제에 이어서 첫 웹 프로젝트 였던 개인 프로젝트를 Kotlin으로 옮기는 작업을 하였다.
몇 개월전에 Java로 짠 코드를 보며, 생각보다 아쉬운 부분이 많이 보이는데, 이 부트캠프를 거치면서, 생각보다 실력이 올랐구나를 느끼게 되었다. 가장 기억에 남는 것은 Kotlin에서의 Any와 *의 차이점이였다.
ModelNotFoundException은 강의에 수록된 Exception인데, Repository에 해당 id 값이 없으면 발생시키는 간단한 Exception이였기에, 부트캠프 시작된 이래로 꾸준히 사용하고 있는 Exception이다. 그런데 간단한 코드이긴 하지만, 매번 Repository에서 해당 Id를 가진 엔티티가 있는지 확인하는 것은 번거롭게 느껴졌다.
private fun getValidatedTodo(todoId: Long): Todo
{
return todoRepository.findByIdOrNull(todoId)
?: throw ModelNotFoundException("Todo", todoId);
}
이 코드는 이전 프로젝트에서 사용을 한 코드인데, todo 뿐만 아니라, comment 같은 엔티티도 비슷한 형태를 띄워서 이것을 좀더 일반화할 수 있는지 고민을 하였다. 그래서 companion object를 활용해 Util 클래스를 만들고, repository를 파라미터로 받아서 사용하자는 생각이 들었다.
여기서 repository는 JPARepository를 상속받았기에 JPARepository를 파라미터로 전달하면 되는데, 내가 제너릭으로 된 클래스 내지 인터페이스를 파라미터로 어떻게 전달할지를 고민하였다. 일단은 Any를 파라미터로 전달하였는데, 코드 자체는 오류가 없지만, JPARepository를 상속받은 객체를 전달하면 오류가 발생하였다. 그래서 이전에 사용했던 *를 사용해본 결과 코드 자체에서 문제가 발생했던 것이였다. 여기서 이러한 차이점이 발생한 원인이 궁금해져서 Any와 *의 차이점을 조사를 하였다.
일단 Any는 Kotlin에서 모든 타입이 상속받는 최상위 타입이다. 즉, 어떠한 값도 들어갈 수 있다. *은 어떤 타입이 들어올지 미리 알 수 없지만, 한 번 타입이 결정되면 해당 타입만을 받을 수 밖에 없다. 구체적인 타입이 결정될 때 까지는 Any? 타입 취급을 한다. 그래서 *의 사용은 코드의 일반화를 목적으로하는 이 코드에서는 사용할 수가 없다.
이런한 과정을 거쳤음에도, Any를 제너릭으로 사용한 값을 다른 제너릭으로 사용을 하지 못하는 것은 다소 의문이 남았지만, 제너릭 타입이 다르면 다른 취급이여서 파라미터로 받을 수 없을 것이다는 사실을 기억해두자. 실은 다른 아이디어가 하나 더 있었다. 그것은 메소드에 제너릭을 더하는 방법이다.
그런데, 이 방법에 대해 나는 편견이 좀 있었다. 메소드에 제너릭을 사용하면, 그 메소드에도 클래스처럼 제너릭을 주입해야할 것 같았기 때문이다. 그래도 다른 아이디어들이 안되는 이상 시험이라도 해보자란 마음가짐으로 코드를 구성하였다.
시험해 본 결과 주입이 필요없었고, 내가 원하는 대로 작동한다는 사실을 알게 되었다. 답이 눈 앞에 있었는데도 이렇게 얼리 돌아가게 되다니 어이없는 결말이다.. 그래도 하나 배웠으니 수확이 없는 것 보단 낫다고 봐야겠다.
private fun <T, ID> getValidatedEntity(repository: JpaRepository<T, ID>, entityId: ID, modelName: String): Any
{
return repository.findByIdOrNull(entityId)
?: ModelNotFoundException(modelName, entityId.toString())
}
내일도 이어서 옮기는 작업을 하자 되도록, 이번 주 내로 다 완료되면 좋겠다.
'부트캠프 일지' 카테고리의 다른 글
부트캠프 75일차 후기 (0) | 2024.03.15 |
---|---|
부트캠프 74일차 후기 (0) | 2024.03.14 |
부트캠프 72일차 후기 (2) | 2024.03.12 |
부트캠프 68일차 후기 (1) | 2024.03.06 |
부트캠프 67일차 후기 (0) | 2024.03.05 |