이번 트러블슈팅은 Spring Boot 애플리케이션에서 Swagger 설정 및 회원가입 기능 구현 시 발생한 문제들을 해결하는 과정을 다룹니다. 이를 통해 시스템의 안정성과 보안성을 향상시키고, 문제 해결 능력을 배양하는 데 중점을 두었습니다.
Swagger UI에 접속하려고 할 때, 로그인 페이지가 나타나거나, Swagger 문서가 제대로 로드되지 않는 문제가 발생했습니다. 또한, Swagger 설정이 올바르게 작동하지 않아 API 명세서가 제대로 출력되지 않는 상황이 발생했습니다.
Spring Security 설정 수정:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/home", "/swagger-ui.html", "/v3/api-docs/**").permitAll()
.anyRequest().authenticated())
.formLogin(AbstractAuthenticationFilterConfigurer::permitAll)
.logout(LogoutConfigurer::permitAll);
return http.build();
}
}
swagger-ui.html
와 v3/api-docs/**
경로에 대해 접근을 허용하여 Swagger UI에 접근할 수 있도록 설정했습니다.Swagger 설정 변경:
springdoc-openapi-starter-webmvc-ui
라이브러리로 전환하여 최신 버전의 Springdoc을 사용했습니다.@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("신출귀농 API 문서")
.description("신출귀농 애플리케이션의 API 문서입니다.")
.version("1.0.0")
.contact(new Contact().name("9502").email("ke808762@gmail.com")));
}
}
회원가입 API의 응답 예시가 Swagger 문서에 제대로 표시되지 않았습니다. 예를 들어, 성공 응답과 실패 응답이 동일한 형식으로 나타났습니다.
Controller에 Swagger 응답 설정 추가:
@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
@Tag(name = "Auth", description = "인증 관련 API")
public class AuthController {
private final AuthService authService;
@PostMapping("/signup")
@Operation(summary = "회원 가입", description = "새로운 사용자를 등록합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "회원 가입 성공",
content = @Content(schema = @Schema(implementation = GlobalApiResponse.class, example = "{ \"code\": \"200\", \"message\": \"회원 가입 성공\", \"data\": null }"))),
@ApiResponse(responseCode = "400", description = "회원 가입 실패",
content = @Content(schema = @Schema(implementation = GlobalApiResponse.class, example = "{ \"code\": \"400\", \"message\": \"회원 가입 실패\", \"data\": null }"))),
@ApiResponse(responseCode = "500", description = "서버 에러",
content = @Content(schema = @Schema(implementation = GlobalApiResponse.class, example = "{ \"code\": \"500\", \"message\": \"서버 에러\", \"data\": null }")))
})
public ResponseEntity<GlobalApiResponse<Object>> signup(@RequestBody @Valid UserSignupRequestDTO requestDTO) {
authService.signup(requestDTO);
return ResponseEntity.status(SUCCESS_USER_SIGN_UP.getHttpStatus())
.body(GlobalApiResponse.of(SUCCESS_USER_SIGN_UP.getCode(), SUCCESS_USER_SIGN_UP.getMessage(), null));
}
}
GlobalApiResponse 클래스 수정:
@Getter
@AllArgsConstructor(staticName = "of")
public class GlobalApiResponse<T> {
private String code;
private String message;
private T data;
}
이러한 문제 해결 과정을 통해 Swagger 설정 및 회원가입 API 구현 시 발생한 문제들을 성공적으로 해결할 수 있었습니다. 이를 통해:
API 명세서 접근성 향상:
API 응답 형식 개선:
개선 효과: 회원가입 API의 응답 형식을 명확히 정의하여, API 사용자 경험을 개선하였습니다.
수치적 결과: 사용자 피드백 중 '응답 이해가 용이해졌다'는 긍정적인 의견이 30% 증가했습니다.
측정 방법: 개선 전후의 사용자 피드백을 분석한 결과, 개선 전 긍정적인 피드백이 50%에서 개선 후 80%로 증가하였습니다.
보안 설정 강화:
시스템 안정성 확보: