MSA - User Service

가수왕·2023년 2월 24일
0

MSA

목록 보기
2/2

0. UserService

나랏말싸피 프로젝트 MSA 전환의 첫 걸음으로 UserService를 살려보기로 했다.
MSA 특성상 API Gateway에서 인증/인가를 진행하기에 다른 서비스들과 연관점이 가장 적을것이라는 생각을 했기 때문이다.
뿐만 아니라 프로젝트 첫 기능은 로그인 / 로그아웃이 국룰 같지 않은가...?

1. DB 생성

나랏말싸피가 갖고 있는 회원정보는 정말 간단하다. 카카오계정에 등록된 이메일, 이름, 닉네임, 지역
카카오 로그인만 지원하기 때문에 별도로 패스워드를 사용하진 않았다.
mysql을 사용하기로 했고 docker 이미지를 실행시키기로 했다.
docker로 oracle을 사용해봤어도 mysql은 처음이었다. oracle을 사용할 때 처럼 docker run을 했는데 접속이 되질 않았다. 찾아보니 mysql은 run 할 때 root password를 지정해줘야 했다.

docker pull mysql

docker run --name mysql -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest

이후 mysql 쉘에 접속해 database생성 및 사용자 생성, 권한 부여를 진행했다.
생성된 사용자는 외부접속을 허용한 상태로 진행했다.
테이블까지 생성해줬다.

2. 프로젝트 생성

User라는 이름의 프로젝트를 새로 생성했다.
Springboot 2.7.8을 사용했다.
기본적인 starter를 제외하고 lombok, jpa, slf4j, gson, jwt를 추가해줬다.
포트는 8083번을 사용했다.

3. 개발시작

이전 프로젝트에서는 카카오 등록을 다른 팀원이 했기에 내 계정에 프로젝트를 추가했다.
이후 테스트를 위해 FE 코드를 약간 수정했다.(request url, kakao api key, redirect uri 등)
백엔드 개발은 크게 어렵지 않았다. 이전에 작성했던 코드를 바탕으로 거의 그대로 옮겨오면 됐기 때문이다.
MSA구축에만 집중한다면 별다른 코드 수정이 없어도 됐겠지만 지난번에는 짧은 기간동안 프로젝트를 완성해야 했기에 놓쳤던 부분을 보완하기로 했다.

  • 예외처리

    첫 번째는 예외처리이다. 이전에는 결과에 따라 if문을 사용해 return값을 다르게 주며 예외를 처리했다. 내가 입사하고 회사 코드를 처음 봤을 때 try catch를 보고 아 예외처리는 이렇게 하는구나 라는걸 느꼈고, 이를 바탕으로 이번에는 Exception을 발생시켜 try catch로 해당 예외를 처리할 수 있게 했다.

  • Refresh Token 사용

    지난번에는 Access Token만을 사용했다. 하지만 이번에는 Refresh Token을 함께 발급하려 한다.
    토큰을 이용한 인증 처리에 고민이 하나 있었다. MSA는 요청이 들어오면 API gateway에서 인증 / 인가 절차를 거치고 다른 서비스로 요청을 라우팅하는걸로 이해하고 있다.
    그렇다면 API Gateway에서 토큰을 발급하고 인증절차를 거쳐야 하나? 하는 생각을 먼저 했고, 조금 찾아봤다. 대부분은 인증서버를 따로 두는 걸로 보였다. 하지만 여기서 또 하나 의문이 생겼다. 인증서버에서 토큰을 발급해주는 건 맞을거 같은데 그럼 요청이 들어올때마다 API Gateway는 인증서버에 토큰을 전달하고 인증 결과를 받는건가? 이 질문에 대한 정보는 찾지 못했다.

    딱히 정답이 없어보여 나는 User Service에서는 토큰만 발급하고, API Gateway에서 인증처리를 한다 로 가기로 했다.
    실제로 Spring Cloud Gateway에서 필터 구성을 하다보니 생각보다 위 과정이 까다롭다는 느낌을 많이 받아서 Gateway에서는 토큰의 유효성만 검사하고 나머지는 UserService에서 처리하기로 했다. (토큰 발급, 재발급, Redis 연동 등)

    • API Gateway에서 1차적으로 AccessToken을 검증한다.
    • 유효하지 않은 토큰이라면 요청을 거절한다.
    • 클라이언트는 거절당하면 RefreshToken을 보낸다.
    • API Gateway가 RefreshToken을 검증한다.
    • 유효하다면 User Service에 토큰 재발급을 요청한다.
    • 유효하지 않다면 로그아웃 시킨다.

    물론 아직 Spring Cloud Gateway에 대한 지식이 전무한 상태이기 때문에 내가 생각한게 안될 수도 있다.

4. 결론

일단 UserService 복구는 성공했다. 회원가입, 카카오로그인, 토큰 재발급등 문제없이 작동한다. 다음엔 API Gateway 개발에 대한 글을 써보겠다.
로그 관리에 대한 고민도 있다.MSA라는 환경 특성상 서비스가 실행중인 환경 로컬에 저장하는것도 힘들 뿐더러 관리도 힘들기 때문에 이를 어떻게 해야할지 좀 찾아봐야 할 것 같다.

0개의 댓글