val tokenUserId = userPrincipal.id
val tokenUserPlatform = userPrincipal.platform
when (tokenUserPlatform) {
Platform.SPARTA -> {
val checkUserId = userRepository.findByIdOrNull(tokenUserId)
?: throw ModelNotFoundException("UserId", tokenUserId)
return checkUserId.toResponse()
}
Platform.GOOGLE -> {
val checkUserId = socialRepository.findByIdOrNull(tokenUserId)
?: throw ModelNotFoundException("UserId", tokenUserId)
return checkUserId.toResponse()
}
else -> throw IllegalStateException("플랫폼 정보가 확인되지 않았습니다.")
}
소셜로그인과, 사이트 회원가입을 통해 저장되는 데이터가 달라,
각자의 테이블에 데이터를 보관했다.
처음에는 userId를 가지고, requestParam으로 플랫폼을 받아야 해당 플랫폼의 userId를 조회했다.
이 방식이 너무 비효율 적이라고 생각했고, userId를 입력했을 때 알아서 테이블을 찾아 조회하는 것이 맞지 않나? 라는 생각이 들었다.
그래서 위 코드와 같이, Jwt에 담긴 Platfrom을 기준으로 조회를 진행할 수 있게끔 설정을 했다.
진행 중 문득 Google의 Zanzibar 라는 시스템이 떠올랐다.
복잡한 권한을 파일명@권한#UserId 등으로 맵핑하여 보관한다는 개념이었는데
여기서 써먹을 수 있지 않을까? 라는 생각이 들었다.
integratedUser 이라는 테이블을 생성하여, 사이트 회원 가입된 유저 정보와,
소셜 로그인 유저 정보를 가져와서 하나의 테이블에서 관리할 수 있지 않을까?
라는 아이디어였다.
DB를 생성하고, 연관 관계를 설정해 봤는데 하나의 컬럼에 두 테이블의 컬럼을 fk로 설정할 수가 없었다.
소셜로그인용 컬럼과, 회원가입용 컬럼을 만들기에는 이게 무슨 비효율적인 일인가 라는 생각이 들어서 결국 포기해버렸다.
다른 방법이 분명히 있겠지만 지금 해결해야될 문제가 더 많아, 시간을 쏟기보다는
추후 조금 더 공부해서 내 방법을 구현하겠다.