본문 바로가기
Spring & SpringBoot

Spring Boot MSA 구조에서 Auth-Service 개발하며 겪은 실제 문제와 해결 방법

by 창따오 2025. 7. 17.
728x90

이 글은 Spring Boot 기반 MSA(Microservices Architecture) 환경에서 Auth-Service와 User-Service를 나눠 개발하면서 직접 겪었던 문제들과 그에 대한 해결 과정을 정리한 기록입니다.

 

1️⃣ Auth-Service vs User-Service 분리 설계 고민

문제:

  • 회원가입 시 이메일, 비밀번호, 닉네임, 주소 등의 정보가 한 번에 들어오지만, 비밀번호는 Auth-Service가 관리하고,
  • 나머지 정보는 User-Service가 관리하는 구조를 어떻게 깔끔하게 나눌지?

결론:

  • Auth-Service → 이메일, 비밀번호, role만 저장
  • User-Service → 닉네임, 이름, 전화번호, 주소 등 상세 정보 저장
  • 회원가입 시 Auth-Service가 DB 저장 후 User-Service로 API 동기 호출로 프로필 생성 요청

참고:

  • Kafka 이벤트 방식은 데이터 일관성 이슈가 있어 핵심 흐름에는 사용하지 않음

2️⃣ DTO 구조 설계 팁

문제:

  • Auth-Service → User-Service로 넘길 때 불필요한 필드까지 넘기는 상황 방지

해결:

  • SignUpRequest: 클라이언트 → Auth-Service
  • CreateUserProfileRequest: Auth-Service → User-Service
public record SignUpRequest(
    String email,
    String password,
    String nickname,
    String name,
    String phoneNumber,
    AddressDto address
) {
    public record AddressDto(String city, String street, String zipcode) {}
}

 


3️⃣ FeignClient 설정과 Connection Refused 문제

문제:

  • User-Service가 없는 상태에서 FeignClient 호출 시 "Connection refused"

해결:

  • 개발 중에는 @MockBean UserClient 설정 후 테스트
  • 운영 환경에서는 User-Service 컨테이너 먼저 실행 확인
  • application.yml:
  • user-service.url: http://localhost:8082

4️⃣ AuthUser Entity Unique 제약조건

문제:

  • email뿐만 아니라 nickname도 unique해야 할 때 설정 방법

해결:

@Table(name = "auth_users", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"email"}),
    @UniqueConstraint(columnNames = {"nickname"})
})

5️⃣ Spring Security PasswordEncoder 빈 설정

문제:

  • PasswordEncoder 주입 에러 발생

해결:

  • SecurityConfig:
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

 


6️⃣ 테스트 코드 작성 팁 (AuthServiceTest)

문제:

  • UserClient 실제 호출 없이 테스트하고 싶음
  • verify(userClient).createUserProfile(any()) 작동 안 함

해결:

  • @MockBean을 이용한 UserClient 주입
  • Mockito verify 사용 시 static import 필수:
import static org.mockito.Mockito.verify;
import static org.mockito.ArgumentMatchers.any;

 

✅ 마무리

MSA 구조에서는 기능 분리뿐 아니라 데이터 흐름, API 호출 구조까지 고려해야 할 부분이 많습니다. 단순히 코드만 나누는 것이 아니라, 어떻게 데이터 일관성을 유지하고, 테스트 환경을 설계할지까지 고민했던 실제 경험을 공유했습니다.

추후에는 Spring Security와 Gateway 연동, Token 인증 필터 적용까지도 별도로 정리할 계획입니다.