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()
}
'Project > Poppin' 카테고리의 다른 글
ECR로 Docker Image 옮기기 (1) | 2023.12.03 |
---|---|
Kotlin No Args Plugin 및 not nullable on Entity (1) | 2023.12.03 |
SpringBoot Kotlin 프로젝트 Docker, AWS로 서버 구성하기-2. RDS, Route 53, 로드밸런서 등 (0) | 2023.11.26 |
SpringBoot Kotlin 프로젝트 Docker, AWS로 서버 구성하기-1. docker image, ec2, 환경변수 .env 등 (2) | 2023.11.25 |
kotlin build file name 변경하기, mainClass 설정 (0) | 2023.11.25 |