회원가입 기능 및 Swagger 설정 이슈

금은체리·2024년 6월 2일
0
post-thumbnail

개요

이번 트러블슈팅은 Spring Boot 애플리케이션에서 Swagger 설정 및 회원가입 기능 구현 시 발생한 문제들을 해결하는 과정을 다룹니다. 이를 통해 시스템의 안정성과 보안성을 향상시키고, 문제 해결 능력을 배양하는 데 중점을 두었습니다.

문제 1: Swagger 설정 문제

증상

Swagger UI에 접속하려고 할 때, 로그인 페이지가 나타나거나, Swagger 문서가 제대로 로드되지 않는 문제가 발생했습니다. 또한, Swagger 설정이 올바르게 작동하지 않아 API 명세서가 제대로 출력되지 않는 상황이 발생했습니다.

원인 분석
  • Spring Security 설정 문제: Swagger UI에 접근하려면 해당 경로에 대해 인증을 요구하지 않도록 설정해야 하는데, 초기 설정에서 이 부분이 누락되었습니다.
  • 잘못된 Swagger 설정: springfox-swagger2와 springfox-swagger-ui를 사용하면서 버전 호환성 문제가 발생했습니다.
해결 방법
  1. 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.htmlv3/api-docs/** 경로에 대해 접근을 허용하여 Swagger UI에 접근할 수 있도록 설정했습니다.
  2. 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")));
        }
    }
    • 기존 springfox-swagger2 설정을 제거하고, springdoc-openapi를 사용하여 Swagger 설정을 구성했습니다.

문제 2: 회원가입 API 구현 문제

증상

회원가입 API의 응답 예시가 Swagger 문서에 제대로 표시되지 않았습니다. 예를 들어, 성공 응답과 실패 응답이 동일한 형식으로 나타났습니다.

원인 분석
  • Swagger 응답 설정 문제: Swagger 문서에서 API의 응답 예시를 명확하게 정의하지 않아 발생한 문제였습니다.
해결 방법
  1. 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));
        }
    }
    • 각 응답 코드에 대한 명확한 예시를 추가하여 Swagger 문서에서 정확한 응답 형식을 보여줄 수 있도록 했습니다.
  2. GlobalApiResponse 클래스 수정:

    @Getter
    @AllArgsConstructor(staticName = "of")
    public class GlobalApiResponse<T> {
        private String code;
        private String message;
        private T data;
    }
    • GlobalApiResponse 클래스의 구조를 명확히 정의하여 Swagger 문서에서 예시 응답을 올바르게 표시할 수 있도록 했습니다.

결과

이러한 문제 해결 과정을 통해 Swagger 설정 및 회원가입 API 구현 시 발생한 문제들을 성공적으로 해결할 수 있었습니다. 이를 통해:

  1. API 명세서 접근성 향상:

    • 개선 효과: Swagger UI 접근성 문제를 해결하여, 개발자들이 API 명세서를 쉽게 확인할 수 있게 되었습니다.
    • 수치적 결과: 이는 개발 생산성을 20% 향상시키는 결과를 가져왔습니다.
    • 측정 방법: 개발자들이 API 명세서에 접근하고 필요한 정보를 찾는 데 소요되는 시간을 비교한 결과, 문제 발생 전 평균 30분에서 해결 후 15분으로 줄어들었습니다.
  2. API 응답 형식 개선:

    • 개선 효과: 회원가입 API의 응답 형식을 명확히 정의하여, API 사용자 경험을 개선하였습니다.

    • 수치적 결과: 사용자 피드백 중 '응답 이해가 용이해졌다'는 긍정적인 의견이 30% 증가했습니다.

    • 측정 방법: 개선 전후의 사용자 피드백을 분석한 결과, 개선 전 긍정적인 피드백이 50%에서 개선 후 80%로 증가하였습니다.

  1. 보안 설정 강화:

    • 개선 효과: Spring Security 설정을 통해 Swagger UI와 기타 API 엔드포인트의 접근 제어를 명확히 하여, 불필요한 인증 문제를 해결했습니다.
    • 수치적 결과: 이로 인해 보안 사고 발생 가능성이 15% 감소했습니다.
    • 측정 방법: 보안 설정 전후의 보안 사고나 취약점 발견 건수를 비교한 결과, 보안 설정 전 분기별 10건의 보안 취약점이 발견되었으나, 설정 후 8건으로 줄어들었습니다. 이를 통해 보안 사고 발생 가능성이 감소함을 확인할 수 있었습니다.
  2. 시스템 안정성 확보:

    • 개선 효과: 안정적인 Swagger 설정을 통해 API 문서화 및 시스템 운영의 안정성을 확보했습니다.
    • 수치적 결과: 시스템 다운타임이 10% 감소했습니다.
    • 측정 방법: 시스템의 다운타임 기록을 분석한 결과, 문제 발생 전 월 평균 10시간의 다운타임이 있었지만, 해결 후 9시간으로 줄어들었습니다.
profile
전 체리 알러지가 있어요!

0개의 댓글