실무 프로젝트로 배우는 Kotlin & Spring/회원 인증 서비스 개발하기

서비스 연동 & 프론트 연동

webmaster 2022. 12. 16. 16:42
728x90

서비스 연동

Issue-service/WebConfig

@Component
class AuthUserHandlerArgumentResolver(
    @Value("\${auth.url}") val authUrl: String,
) : HandlerMethodArgumentResolver {
    override fun supportsParameter(parameter: MethodParameter): Boolean =
        AuthUser::class.java.isAssignableFrom(parameter.parameterType) //해당 조건이 맞아야 조건 통과

    override fun resolveArgument(
        parameter: MethodParameter,
        mavContainer: ModelAndViewContainer?,
        webRequest: NativeWebRequest,
        binderFactory: WebDataBinderFactory?
    ): Any? {
        val authHeader = webRequest.getHeader("Authorization") ?: throw UnAuthorizedException()

        return runBlocking {
            WebClient.create()
                .get()
                .uri(authUrl)
                .header("Authorization", authHeader) //Bearer JWT토큰
                .retrieve()
                .awaitBody<AuthUser>()
        }
    }
}

data class AuthUser(
    @JsonProperty("id")
    val userId: Long,
    val username: String,
    val email: String,
    val profileUrl: String? = null,
) {

}

Build.gradle

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")

}
  • 이전에 사용했던 ArgumentResolver를 실제 다른 서비스에서 값을 읽어오도록 변경하였다.
  • WebClient를 사용하여, Non-Blocking 방식으로 서비스 호출이 가능하도록 한다.
    • 이때, WebClient를 코루틴 기반으로 동작시킬 것이기 때문에, awaitBody 함수를 사용하여 코루틴으로 변경하여야 하며, build.gradle에 코루틴 의존성을 추가해주어야 한다
    • awaitBody함수는 코루틴 기반으로 suspend 키워드가 있어야하지만, 현재 MVC 기반으로 작성하여 suspend 키워드를 붙힐 수 없는데, runBlocking으로 감싸, 코루틴 스코프 내에 포함시켜 동작시킬 수 있다.

프론트 연동

issue-service 하위 resources 하위에 파일 복사

https://github.com/digimon1740/jara

 

GitHub - digimon1740/jara

Contribute to digimon1740/jara development by creating an account on GitHub.

github.com

Controller

@Controller
class PageController {
    @GetMapping(value = ["", "/index"])
    fun index() = "index"

    @GetMapping("/issueapp")
    fun issueApp() = "issueapp"

    @GetMapping("/signup")
    fun signup() = "signup"
}
  • @Controller를 사용해, 뷰와 매핑한다.

WebConfig의 addResourceHandlers 오버라이딩

@Configuration
class WebConfig(
    private val authUserHandlerArgumentResolver: AuthUserHandlerArgumentResolver
) : WebMvcConfigurationSupport() {
    override fun addArgumentResolvers(argumentResolvers: MutableList<HandlerMethodArgumentResolver>) {
        argumentResolvers.apply {
            add(authUserHandlerArgumentResolver)
        }
    }

    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/**")
            .addResourceLocations(
                "classpath:/META-INF/resources/",
                "classpath:/resources/",
                "classpath:/static/",
                "classpath:/public/"
            )
    }
}
  • resources의 경로를 매핑시켜준다.

후에 User의 port가 변경되면, resource 파일 하위에 static 경로에 있는 config 파일 수정하자

728x90