Spring & SpringBoot
Spring Boot MSA 구조에서 Auth-Service 개발하며 겪은 실제 문제와 해결 방법
창따오
2025. 7. 17. 22:43
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 인증 필터 적용까지도 별도로 정리할 계획입니다.