diff --git a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/SpringCloudOpenFeignApplication.kt b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/SpringCloudOpenFeignApplication.kt index 45f98b0..d80c147 100644 --- a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/SpringCloudOpenFeignApplication.kt +++ b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/SpringCloudOpenFeignApplication.kt @@ -2,7 +2,9 @@ package com.banjjoknim.springcloudopenfeign import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.cloud.openfeign.EnableFeignClients +@EnableFeignClients @SpringBootApplication class SpringCloudOpenFeignApplication diff --git a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/configuration/FeignConfiguration.kt b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/configuration/FeignConfiguration.kt new file mode 100644 index 0000000..02a1512 --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/configuration/FeignConfiguration.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.springcloudopenfeign.configuration + +import com.fasterxml.jackson.databind.DeserializationFeature +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer +import org.springframework.context.annotation.Configuration +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder + +@Configuration +class FeignConfiguration : Jackson2ObjectMapperBuilderCustomizer { + override fun customize(jacksonObjectMapperBuilder: Jackson2ObjectMapperBuilder) { + jacksonObjectMapperBuilder + .featuresToEnable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL) + .featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + } +} diff --git a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/Post.kt b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/Post.kt new file mode 100644 index 0000000..bb43f31 --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/Post.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.springcloudopenfeign.domain + +data class Post( + val userId: Long, + val id: Long, + val title: String, + val completed: Boolean +) diff --git a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostClient.kt b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostClient.kt new file mode 100644 index 0000000..e37a6bb --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostClient.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.springcloudopenfeign.domain + +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable + +@FeignClient(value = "postClient", url = "https://jsonplaceholder.typicode.com/") +interface PostClient { + + @GetMapping("/posts") + fun findPosts(): List + + @GetMapping("/posts/{postId}") + fun findPost(@PathVariable postId: Long): Post +} diff --git a/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostController.kt b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostController.kt new file mode 100644 index 0000000..4d4823f --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-cloud-open-feign/src/main/kotlin/com/banjjoknim/springcloudopenfeign/domain/PostController.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.springcloudopenfeign.domain + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RestController + +@RestController +class PostController( + private val postClient: PostClient +) { + + @GetMapping("/posts") + fun posts(): List { + return postClient.findPosts() + } + + @GetMapping("/posts/{postId}") + fun post(@PathVariable postId: Long): Post { + return postClient.findPost(postId) + } +}