어플리케이션을 재실행할 때마다 DB가 reset 되길래 무슨 문제인지 알아보니 application.properties 설정 파일에 spring.jpa.hibernate.ddl-auto 부분을 제대로 설정하지 않아서 생긴 문제였다.
보통 JPA를 사용한 데이터베이스는 application.properties 설정 파일을 통해 초기화하는데 이를 실행하는 방법은 다음과 같다.
# 엔티티 정보를 바탕으로 자동 스키마 생성
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true // 해당 옵션을 사용할지 말지 여부를 나타냄(기본은 false)
이를 통해 entity 클래스 정보를 바탕으로 스키마를 자동 생성해준다.
spring.jpa.hibernate.ddl-auto 옵션을 아래 표에 있는 옵션 중 하나를 사용하면 자동으로 스키마가 생성해준다.
옵션
설명
update
기존에 데이터를 유지하며 추가된 정보만 변경을 한다.(없으면 생성)
create-drop
애플리케이션 실행시 생성하고 종료되면 삭제한다.
create
애플리케이션 실행시 삭제하고 새로 생성한다.
결론적으로,
spring.jpa.hibernate.ddl-auto를 create가 아닌 update로 변경해주면 된다.
수정/삭제 기능 405 오류
삭제와 수정 기능을 구현하다가 실행 도중에 405 오류가 자꾸 떠서 왜 그런지 알아보니 HTTP POST 요청이 처리되지 못해서 생긴 문제라고 했다. 구체적으로는 ,해당 경로에 대해 POST 메소드가 지원되지 않아 'Method Not Allowed (state=405)' 오류가 발생한 것 같다.
오류 메시지를 분석해보면,
HttpRequestMethodNotSupportedException : 요청된 HTTP 메소드인 POST가 지원되지 않는다.
Request method 'POST' is not supported : POST 메소드가 지원되지 않는다는 메시지이다.
자세히 살펴보니 POST 요청이 예상치 못한 경로에서 발생하여 발생했다고 한다.
그래서 일단 Spring Security가 POST 요청을 허용하고 있는지 확인하였다. 현재 패키지는 모든 경로에 대해 접근을 허용하고 CRSF 보호를 비활성화하도록 설정하였다. 근데,. CRSF 이 자식이 문제인 것 같다. 먼저 CRSF 보호를 비활성화하는 것이 아니라, 제대로 된 설정으로 접근을 허용하도록 하였다. 또한, 시큐리티의 최신 설정 방식인 SecurityFilterChain을 사용하였다.
package com.example.greenday_board.config;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
@AllArgsConstructor
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/post", "/post/**", "/post/edit/**").permitAll()
.anyRequest().authenticated()
)
.csrf().disable(); // 필요 시 CSRF 보호 비활성화
return http.build();
}
}
DB reset 오류 해결
어플리케이션을 재실행할 때마다 DB가 reset 되길래 무슨 문제인지 알아보니
application.properties
설정 파일에spring.jpa.hibernate.ddl-auto
부분을 제대로 설정하지 않아서 생긴 문제였다.보통 JPA를 사용한 데이터베이스는
application.properties
설정 파일을 통해 초기화하는데 이를 실행하는 방법은 다음과 같다.spring.jpa.hibernate.ddl-auto
옵션을 아래 표에 있는 옵션 중 하나를 사용하면 자동으로 스키마가 생성해준다.결론적으로,
spring.jpa.hibernate.ddl-auto
를 create가 아닌 update로 변경해주면 된다.수정/삭제 기능 405 오류
삭제와 수정 기능을 구현하다가 실행 도중에 405 오류가 자꾸 떠서 왜 그런지 알아보니 HTTP POST 요청이 처리되지 못해서 생긴 문제라고 했다. 구체적으로는 ,해당 경로에 대해 POST 메소드가 지원되지 않아 'Method Not Allowed (state=405)' 오류가 발생한 것 같다.
오류 메시지를 분석해보면,
HttpRequestMethodNotSupportedException
: 요청된 HTTP 메소드인 POST가 지원되지 않는다.Request method 'POST' is not supported
: POST 메소드가 지원되지 않는다는 메시지이다.자세히 살펴보니 POST 요청이 예상치 못한 경로에서 발생하여 발생했다고 한다.
그래서 일단 Spring Security가 POST 요청을 허용하고 있는지 확인하였다. 현재 패키지는 모든 경로에 대해 접근을 허용하고 CRSF 보호를 비활성화하도록 설정하였다. 근데,. CRSF 이 자식이 문제인 것 같다. 먼저 CRSF 보호를 비활성화하는 것이 아니라, 제대로 된 설정으로 접근을 허용하도록 하였다. 또한, 시큐리티의 최신 설정 방식인
SecurityFilterChain
을 사용하였다.그랬더니
제에에엔장,,,🤬