인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

devdev님의 프로필 이미지
devdev

작성한 질문수

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

리턴타입 사용시 any를 사용해도 괜찮은가요?

작성

·

47

1

코틀린으로 스프링을 개발해 보고 있습니다.

리턴할떄 ResponseEntity<Any> 이런식으로 Any를 사용해도 괜찮을까요?

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! devdev님! 🙂 좋은 질문 감사드립니다.

 

결론부터 말씀드리면 문법적으로 문제가 없지만 좋은 코드와는 거리가 멀다고 생각합니다.

예를 들어 Any 를 반환하는 어떤 함수를 하나 만든다고 생각해 보겠습니다.

fun doSomething(vararg params: Any): Any {
  // 꽤 긴 함수라면...?
}

만약 이 함수가 50줄, 100줄, 1000줄이 넘는다면 도대체 어떤 값이 반환되는지 파악하기가 무척 어려울거에요! 심지어 이런 Any 를 반환하는 함수를 여러개 조합하고 있는 코드가 있다면, 잘 작성된 코드에 비해 코드를 추적하고 파악하는 시간이 최소 10배 이상 들어가게 됩니다. 결국 SW 공학적인 관점에서 볼 때 유지보수 cost가 높은 좋지 않은 함수라 할 수 있죠.

 

따라서 Controller에서도 역시 ResponseEntity<T> 를 반환하실 때에는 명확한 리턴 타입을 적어주시는 것을 적극 권장 드립니다.

관련해서 질문이 있으시면 편하게 대댓글 달아 주세요. 감사합니다. 🙇

devdev님의 프로필 이미지
devdev
질문자

답변해주셔서 감사합니다!
추가적으로 ResponseEntity<T>를 반환할때 pair라던지 map 이 들어갈 경우에는 형식이 고르지 않은 코드는 명확한 dto를 만들어 반환하는게 좋은 코드인가요?

최태현님의 프로필 이미지
최태현
지식공유자

넵넵! 🙂 Pair는 결국

{
  "field1": ?
  "field2": ?
}

와 같은 DTO가 되고

Map 역시 결국은 필드가 여러개인 JSON이 되기에 명확한 DTO를 만드시는 편이 좋습니다.

 

또한 일반적으로는 한 API가 같은 JSON을 반환하게 되지만, 간혹 다형성을 활용한 여러 JSON을 반환해야 하는 경우는 상속 구조를 그대로 사용하실 수도 있습니다. 예를 들어

{
  "name": String
}

또는

{
  "name": String,
  "age": Int
}

를 반환해야 한다고 가정하면

 

interface XXXDto // sealed class 혹은 abstract class도 좋습니다.

class XXXNameDto(
  val name: String
) : XXXDto

class XXXPersonDto(
  val name: String,
  val age: Int
) : XXXDto

처럼 구성할 수 있습니다.

 

다만 위의 예시는 생각해보면

{
  "name" String,
  "age": Int?
}

로 합칠 수 있는 것처럼 다형성이 꼭 필요한 API인지 고민해보는 것도 필요합니다.

devdev님의 프로필 이미지
devdev

작성한 질문수

질문하기