본문 바로가기
카테고리 없음

Trouble SHOOTING (SPRING - PLUS)

by 차리하루일기 2024. 11. 21.

application.YML -> H2-CONSOLE 에 연결이 안되는 이슈 발생. 

 

내가 알아본 문제점, 

왜지? 라는 생각과 함께 h2에 대해서 다시 한번 알아보았다.

 

spring:
  application:
    name: spring-plus
  h2:
    console:
      enabled: true
      path: /h2-console

 

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:db;MODE=MYSQL
    username: sa
    password:

 

 

전체 설정 목적은 다음과 같았다. 

  1. H2 메모리 DB:
    • 빠른 테스트 및 개발 환경에서 사용.
    • 매번 초기화되므로 데이터 영구성은 없음.
  2. JPA/Hibernate:
    • 데이터베이스 작업을 효율적으로 처리.
    • Hibernate의 SQL 생성 및 스키마 관리를 통해 개발 편의성 제공.
  3. JWT:
    • 인증/인가 기능을 위한 토큰 기반 인증을 구현하기 위한 비밀 키 설정.
  4. 서버 설정:
    • UTF-8 인코딩과 함께 실행.

하지만, 목적과는 다르게 

Whitelabel Error Page  오류 발생했다.

 

1.  H2 Console 관련 문제

     path  설정값이 일치하기에 문제가 없다고 판단했다.

 

2.   Spring Security와 H2 Console 충돌 

 

Spring Security를 사용하면 기본적으로 /h2-console 접근이 차단된다고 한다. 이를 위해 다음 설정을 추가해야 한다. 

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.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .headers().frameOptions().disable() // H2 Console 사용을 위해 Frame 옵션 비활성화
            .and()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/h2-console/**").permitAll() // H2 Console 접근 허용
                .anyRequest().authenticated()
            );

        return http.build();
    }
}

 

 

3. CSRF 설정 확인

spring Security에서 기본적으로 CSRF 보호가 활성화되어 있는데, 이를 H2 Console에 접근하려면 CSRF 보호를 비활성화해야 한다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .headers().frameOptions().disable()
        .and()
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/h2-console/**").permitAll()
            .anyRequest().authenticated()
        );

    return http.build();
}

 

 

하지만, 이렇게 해봤는데도 실패 ㅡ,ㅡ;;

 

결국 yml-> properties로 돌아가길 선택 

익숙한 mysql 로 돌아감,,, 

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springplus
spring.datasource.username=root
spring.datasource.password=1238963

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.format-sql=true
spring.jpa.hibernate.show-sql=true
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.default_batch_fetch_size=100


server.port=8080
server.servlet.encoding.charset=utf-8
server.servlet.encoding.force=true

jwt.secret.key=d348641f16ebb1db9b17382a4694fa59476d764a9914337d7cc6beeeae858a475ed6cfabbfe4551fe8b13e1b8d305bff74dff399d52632a9f8aff1bef393ffc1023af9a97b4b2afea2d12001fe34358b1dbc6e7670a5d93fb04fc1c0a328faa153c016a129443583ca4b67181b3102ed9a6ec626a0de37f8060babf1aa0b37c5371d77b054fab9b595e1289576986b998cb479ed6096aa90e4d12cbcd900732ad27224c920da4d451e2e34b3c9224afc0176cfb704ab4044b6a72720ae3c0d604fe2b25831f5962367629006cb6b3564b3354c185239adeeca856dbb4e88aadfdbba30096bc5ebc1bb7ac9765707b7c482cf7e3544dbeea2eb72d13b8360f9d0


이렇게 돌려두었고 db는 결국 mysql로 연결하여 실행하였다.