이번엔 바로 이어서 Consuming a RESTful Web Service, 말 그대로 restful api를 직접 코드적으로 활용하는 방법을 알아본다.
HTTP 통신으로 받은 json을 프로젝트의 Entity로 받을 수 있다는 것을 알아본다.
지난 글과 동일하게 간단하게 작성한다.
가이드에서 제공하는 api가 작동하지 않아서 따로 android 프로젝트 용으로 받았던 TMDB api key를 이용해서 가이드를 진행했다.
@JsonIgnoreProperties(ignoreUnknown = true)
@Entity
data class Movie(
val adult: Boolean,
@OneToMany val genres: List<Genre>,
@Id val id: Long? = null
)
@Entity
data class Genre(
@Id val id: Long,
val name: String
)
사용하려고 하는 api의 return type을 사진으로 첨부한다. 간단하게 처리하기 위해서 adult와 genres 만을 살렸고, @JsonIgnoreProperties(ignoreUnknown = true)을 통해서 다른 property들이 무시되게 만들었다.
Entity들이 관계가 있을 경우 관계 annotation을 당연하게도 꼭 써줘야 한다. 실수를 했어서 남겨둔다.
application에서 밖으로 HTTP Get을 쏘기 위해 RestTemplate라는 라이브러리를 사용한다. 이 부분에서 삽질이 들어갔지만 결국 작성한 코드는 아래와 같다.
@Configuration
@SpringBootApplication
@EnableConfigurationProperties(Properties::class)
class ConsumingARestfulWebServiceApplication(
private val properties: Properties
) {
val log: Logger = LoggerFactory.getLogger(ConsumingARestfulWebServiceApplication::class.java)
@Bean
fun restTemplate(builder: RestTemplateBuilder): RestTemplate = builder.build()
@Bean
fun run(restTemplate: RestTemplate): CommandLineRunner = CommandLineRunner {
val movie = restTemplate.getForObject(
"https://api.themoviedb.org/3/movie/550?api_key=${properties.key}", Movie::class.java
)
log.info(movie.toString())
}
}
fun main(args: Array<String>) {
runApplication<ConsumingARestfulWebServiceApplication>(*args)
}
@Configuration과 @EnableConfigurationProperties(Properties::class)는 api_key를 감추기 위해 application.properties를 사용하면서 추가하였다.
실제적으로 코드는 간단하다. restTemplate를 사용해 api를 통해 받은 json을 Object class로 바꿔서 받는다. 그리고 해당 결과가 잘 받아졌는지 확인하기 위해 log를 통해 결과를 확인한다.
실제로 코드에서 쏜 api에서 return 되는 값은 다음과 같다. (Insomnia를 통해 확인했다.)
그리고 실제로 log를 통해 찍혀나온 값은 다음과 같다. 보면 Movie class 부터 여러 Genre class까지 성공적으로 생성된 것을 볼 수 있다.
당연한 작업이긴 했지만 restTemplate이라거나 얻어가는게 조금 있었다. 반복적으로 RESTful 한 case를 알려줘서 좀 더 친숙해졌다~ 정도일 것 같다.
작성한 코드는 다음과 같다.