Chaeyeon0 / GreenDay_Study

여은개의 공부 일지
0 stars 0 forks source link

[20240519] 게시판 DB reset 오류 해결, 삭제 기능 405 오류 해결 중 #13

Open janghw0126 opened 1 month ago

janghw0126 commented 1 month ago

DB reset 오류 해결

어플리케이션을 재실행할 때마다 DB가 reset 되길래 무슨 문제인지 알아보니 application.properties 설정 파일에 spring.jpa.hibernate.ddl-auto 부분을 제대로 설정하지 않아서 생긴 문제였다.

보통 JPA를 사용한 데이터베이스는 application.properties 설정 파일을 통해 초기화하는데 이를 실행하는 방법은 다음과 같다.

# 엔티티 정보를 바탕으로 자동 스키마 생성
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true  // 해당 옵션을 사용할지 말지 여부를 나타냄(기본은 false)
옵션 설명
update 기존에 데이터를 유지하며 추가된 정보만 변경을 한다.(없으면 생성)
create-drop 애플리케이션 실행시 생성하고 종료되면 삭제한다.
create 애플리케이션 실행시 삭제하고 새로 생성한다.

결론적으로, spring.jpa.hibernate.ddl-auto를 create가 아닌 update로 변경해주면 된다.

수정/삭제 기능 405 오류

삭제와 수정 기능을 구현하다가 실행 도중에 405 오류가 자꾸 떠서 왜 그런지 알아보니 HTTP POST 요청이 처리되지 못해서 생긴 문제라고 했다. 구체적으로는 ,해당 경로에 대해 POST 메소드가 지원되지 않아 'Method Not Allowed (state=405)' 오류가 발생한 것 같다.

오류 메시지를 분석해보면,

자세히 살펴보니 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();
    }
}

그랬더니

제에에엔장,,,🤬

Chaeyeon0 commented 1 month ago

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ아니 제에에엔장ㅋㅋㅋㅋㅋㅋㅋㅋ 이거 보니 정말 DB의 중요성을 깨닫게 되네요 ,,, 저도 히스토리 구현할 때 jpa 사용에 관해 더 공부해야겠네요 !! 수고 했어요 ㅎㅎ

khw010419 commented 1 month ago

와 DB정말 빡세네요 .... 송하주 영입하고 싶어진다....