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
'실무 프로젝트로 배우는 Kotlin & Spring > 회원 인증 서비스 개발하기' 카테고리의 다른 글
| 리포트 조회 / 내정보 수정 (0) | 2022.12.16 |
|---|---|
| 내정보 조회 (0) | 2022.12.16 |
| 로그인과 로그아웃 (0) | 2022.12.15 |
| 회원가입 (0) | 2022.12.14 |
| JWT 기반 인증 구현 (0) | 2022.12.13 |