나랏말싸피 프로젝트 MSA 전환의 첫 걸음으로 UserService를 살려보기로 했다.
MSA 특성상 API Gateway에서 인증/인가를 진행하기에 다른 서비스들과 연관점이 가장 적을것이라는 생각을 했기 때문이다.
뿐만 아니라 프로젝트 첫 기능은 로그인 / 로그아웃이 국룰 같지 않은가...?
나랏말싸피가 갖고 있는 회원정보는 정말 간단하다. 카카오계정에 등록된 이메일
, 이름
, 닉네임
, 지역
카카오 로그인만 지원하기 때문에 별도로 패스워드를 사용하진 않았다.
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생성 및 사용자 생성, 권한 부여를 진행했다.
생성된 사용자는 외부접속을 허용한 상태로 진행했다.
테이블까지 생성해줬다.
User라는 이름의 프로젝트를 새로 생성했다.
Springboot 2.7.8을 사용했다.
기본적인 starter를 제외하고 lombok, jpa, slf4j, gson, jwt를 추가해줬다.
포트는 8083번을 사용했다.
이전 프로젝트에서는 카카오 등록을 다른 팀원이 했기에 내 계정에 프로젝트를 추가했다.
이후 테스트를 위해 FE 코드를 약간 수정했다.(request url, kakao api key, redirect uri 등)
백엔드 개발은 크게 어렵지 않았다. 이전에 작성했던 코드를 바탕으로 거의 그대로 옮겨오면 됐기 때문이다.
MSA구축에만 집중한다면 별다른 코드 수정이 없어도 됐겠지만 지난번에는 짧은 기간동안 프로젝트를 완성해야 했기에 놓쳤던 부분을 보완하기로 했다.
첫 번째는 예외처리이다. 이전에는 결과에 따라 if문을 사용해 return값을 다르게 주며 예외를 처리했다. 내가 입사하고 회사 코드를 처음 봤을 때 try catch를 보고 아 예외처리는 이렇게 하는구나 라는걸 느꼈고, 이를 바탕으로 이번에는 Exception을 발생시켜 try catch로 해당 예외를 처리할 수 있게 했다.
지난번에는 Access Token만을 사용했다. 하지만 이번에는 Refresh Token을 함께 발급하려 한다.
토큰을 이용한 인증 처리에 고민이 하나 있었다. MSA는 요청이 들어오면 API gateway에서 인증 / 인가 절차를 거치고 다른 서비스로 요청을 라우팅하는걸로 이해하고 있다.
그렇다면 API Gateway에서 토큰을 발급하고 인증절차를 거쳐야 하나?
하는 생각을 먼저 했고, 조금 찾아봤다. 대부분은 인증서버를 따로 두는 걸로 보였다. 하지만 여기서 또 하나 의문이 생겼다. 인증서버에서 토큰을 발급해주는 건 맞을거 같은데 그럼 요청이 들어올때마다 API Gateway는 인증서버에 토큰을 전달하고 인증 결과를 받는건가?
이 질문에 대한 정보는 찾지 못했다.
딱히 정답이 없어보여 나는 User Service에서는 토큰만 발급하고, API Gateway에서 인증처리를 한다
로 가기로 했다.
실제로 Spring Cloud Gateway에서 필터 구성을 하다보니 생각보다 위 과정이 까다롭다는 느낌을 많이 받아서 Gateway에서는 토큰의 유효성만 검사하고 나머지는 UserService에서 처리하기로 했다. (토큰 발급, 재발급, Redis 연동 등)
물론 아직 Spring Cloud Gateway에 대한 지식이 전무한 상태이기 때문에 내가 생각한게 안될 수도 있다.
일단 UserService 복구는 성공했다. 회원가입, 카카오로그인, 토큰 재발급등 문제없이 작동한다. 다음엔 API Gateway 개발에 대한 글을 써보겠다.
로그 관리에 대한 고민도 있다.MSA라는 환경 특성상 서비스가 실행중인 환경 로컬에 저장하는것도 힘들 뿐더러 관리도 힘들기 때문에 이를 어떻게 해야할지 좀 찾아봐야 할 것 같다.