본문 바로가기
관리자

Project/Poppin

스프링부트 Swagger 3.0, JPAAuditing, ZonedDateTime

728x90
반응형

 

1. Swagger 3.0

 

spring 3.0 이상부터는 swagger 3.0이 아닌 springdoc-openapi-ui 라이브러리 import

ref.)https://resilient-923.tistory.com/414

 

공식문서

https://springdoc.org/#getting-started

 

 

프로퍼티

 

공식문서 5번 항목에 있음. application.yml 같은 설정 파일에 추가하라고 나와있다.

 

localhost:8080/swagger로도 접속가능하도록 path 지정.

특정 패키지들은 제외되도록 packagesToExclude 속성에 패키지 경로들을 ',' 구분자로 추가해주었다.

 

https로만 접속을 허용했다면, CORS 에러가 난다.

ref.) https://kbwplace.tistory.com/173

 

아래처럼 @OpenAPIDefinition 부분에 Server를 추가해준다.

@OpenAPIDefinition(
    info = Info(title = "hello", description = "hello api", version = "v1"),
    servers = [Server(url = "https://{내가 설정한 EC2 도메인 이름}", description = "hello!")]
)

 

 

 

PUT 요청 시 403 에러

put 요청 시 403 에러가 났었다. 개발자 도구를 켜보니 요청은 가는데 Response가 403이라, 여러 글들을 검색해보니 주로 Spring Security 관련한 문제였다. 나의 경우 CSRF 설정은 일단 disable 처리를 해놓은 상태여서 이 문제는 아니였다.

 

그 외에 Spring Security에서 관리하는 CORS 객체 설정 부분이 있었고, CorsConfigurationSource를 설정하는 Bean에서 allowedOrigins에 내 도메인을 추가해주니 문제없이 동작했다.

// SecurityConfig 클래스에 등록하는 FilterChain Bean

@Bean
open fun filterChain(http: HttpSecurity): SecurityFilterChain {
    http.invoke {

        authorizeRequests {
            authorize("/signup/**", permitAll)
            authorize("/login/**", permitAll)
            ...
        }
        
        // 이 부분
        cors {
            configurationSource = corsConfigurationSource()
        }
        //... 중략
    }
    }
    

@Bean
    open fun corsConfigurationSource(): CorsConfigurationSource {
        val configuration = CorsConfiguration()
        configuration.allowedOrigins = listOf("http://localhost:3000", "http://localhost:8080", "/swagger-ui/**", {내 도메인 주소})
        configuration.allowedMethods = listOf("GET", "POST", "PUT", "DELETE")
        configuration.addAllowedHeader("*")
        configuration.allowCredentials = true
        val source = UrlBasedCorsConfigurationSource()
        source.registerCorsConfiguration("/**", configuration)
        return source
    }

 

ref.) https://stackoverflow.com/questions/50486314/how-to-solve-403-error-in-spring-boot-post-request

 

 

 

 

2. JPAAuditing

 

JPAConfig 클래스를 추가해주었다.

 

@Configuration
@EnableJpaAuditing
open class JpaConfig {
}

 

각 Entity가 상속받은 BaseDateEntityAbstract에 @CreatedDate, @LastModifiedDate를 아래처럼 설정했다. 여기서 컬럼 속성값들을 ZonedDateTime으로 설정하는 실수를 했었는데, JPAAuditing은 Date 타입만 받기 때문에 이를 상속받는 LocalDateTime으로 변경해주었다. ZonedDateTime은 DTO 쪽에서 Converting이 필요하다.

@Data
@SuperBuilder
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseDateEntityAbstract : BaseEntityAbstract() {
    @CreatedDate
    @Column(updatable = false, name = "created_at")
    var createdAt: LocalDateTime? = LocalDateTime.now()

    @LastModifiedDate
    @Column(name = "updated_at")
    var updatedAt: LocalDateTime? = LocalDateTime.now()
}
728x90
반응형