H2 Dababase Console


Spring 기반의 어플리케이션을 개발할때, 개발 환경에서 H2 메모리 데이터베이스를 사용할 것이다. 

(왜냐면, 이것은 가볍고, 빠르며, 또한 사용이 쉽다.)

일반적으로 큰 업무를 진행하는 운영 서버에서는 다른 RDMBS(Oracle, Mysql, Postgres)를 사용 한다.

Spring 어플리케이션과 함께 개발을 한다면, JAP/Hibernate 그리고 Hibernate의 스키마 생성 기능을 사용 할것이다.

어플리케이션이 시작할때, H2 DB와 함께라면, Hibernate에서는 DBMS를 항상 생성한다.

따라서 DB는 일관된 상태를 유지하게 된다. 또한 개발과 테스트에서 JPA mapping을 허용한다.


H2는 어플리케이션을 개발하는 동안, 웹 기반의 데이터베이스 콘솔을 함께 제공한다.

이것으로 Hibernate로 생성된 테이블이나 query를 통한 결과 값을 확인 수 있다.



[H2 데이터베이스 콘솔 예제]


Spring Boot에서 H2 데이터베이스를 사용하기 위한 설정


- H2 Maven 의존성


Spring boot 는 H2 데이터베이스를 지원한다. 만약 H2를 Spring 초기화에 추가하고 싶다면 Maven 의존성에 H2 의존성을 추가해야 한다.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

이 설정은 Spring Boot 어플리케이션이 기동중에만 H2 데이터베이스가 동작한다. 그러나, H2 데이터베이스 콘솔을 사용하고 싶다면, Maven의 runtime scope를 complie로 변경해야한다.이것은 Spring Boot 어플리케이션의 설정을 변경하여 지원하도록 한다. 그냥, scope 에 대당하는 값을 지우면, Maven의 기본 값인 compile로 변경 될 것이다.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

- Spring 설정


보통은 web.xml 파일에 servlet 을 통해 H2 데이터베이스를 설정한다. 그러나 Spring Boot는 내부에 포함된 Tomcat 인스턴스로 동작하여, 우리는 web.xml파일에 접근 할수 없다. Spring Boot는ServletRegistationBean을 통하여 서빌릿을 선한하는데 사용하는 메커니즘을 제공한다.


다음은 Spring 설정을 통해 H2 데이터베이스 콘솔을 /console 위치로 servlet선언을 한다.

WebConfiguration.java

설명 - 적절한 WebServlet 클래스에서 설정하면 됩니다.(H2에서)

import org.h2.server.web.WebServlet;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfiguration {
    @Bean
    ServletRegistrationBean h2servletRegistration(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean( new WebServlet());
        registrationBean.addUrlMappings("/console/*");
        return registrationBean;
    }
}

만약 Spring Security를 사용하지 않는다면, H2 데이터베이스 콘솔을 위한 설정은 완료 되었다. Spring Boot 어플리케이션을 시작하고 H2 데이터베이스 콘솔에 접근하고 싶다면, http://localhost:8080/console 로 접근 하면 확인 할 수 있다.


- Spring Security 설정


Spring Boot 어플리케이션에서 Spring Security을 사용한다면, H2 데이터베이스 콘솔에 접근 할 수 없을 것이다. 

Spring Boot의 기본 설정 아래서는 Spring Security 에서 H2 데이터 베이스 콘솔에 접근을 차단 할 것이다.


H2 데이터베이스 콘솔에 대한 접근을 허용하려면 Spring Security의 아래의 세개를 변경 해야 한다.

  • /console/* 의 URL접근 허용
  • CRSF(Cross-Site Request Forgery) 중지. 기본 값이고, CRSF 공격에 대하여 방어
  • H2 데이터베이스 콘솔이 frame 안에서 동작 하도록 하는 Spring Security 옵션


다음의 Spring Security 설정을 진행 : 

  • root url("/") 에 대한 요청 허용(Line 12)
  • H2 데이터베이스 콘솔 url("/console/*") 요청에 대한 허용(Line 13)
  • CSRF 중지(Line 15)
  • X-Frame-Options in Spring Security 중지(Line 16)


경고 : 웹사이트에 대한 방어를 원한다면 다음의 Spring Security 설정을 사용하지 않기를 권장한다. 이 설정은 오직 Spring Boot 어플리케이션을 개발하고 H2 데이터베이스 콘솔의 접근을 지원 한다.

실운영 에서 H2 데이터 베이스 콘솔을 사용하는 데이터베이스의 예를 생각할 수 없다.

SecurityConfiguration.java


package guru.springframework.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests().antMatchers("/").permitAll().and()
                .authorizeRequests().antMatchers("/console/**").permitAll();

        httpSecurity.csrf().disable();
        httpSecurity.headers().frameOptions().disable();
    }

}


H2 데이터베이스 콘솔 사용


Spring Boot 웹 어플리케이션을 간단하게 시작하고 http://localhost:8080/console 을 URL에 입력 하면 다음과 같은 H2 데이터베이스 콘솔 화면을 볼수 있을 것이다.


[H2 데이터베이스 콘솔 로그인]


- Spring Boot에서 H2 데이터베이스 기본 설정


로그인 하기 전에, H2 데이터베이스 설정이 되어야 한다.

나는 Spring Boot를 이용한 기본 설정을 찾는것에 힘든 시간을 보냈고, Hibernate 로그를 이용해서 Spring Boot에서 사용되는 JDBC URL을 찾을 수 있었다.


Value 

Setting 

Driver Class 

org.h2.Driver 

JDBC URL 

jdbc:h2:mem:testdb 

User Name 

sa 

Password 

<blank> 



맺음말


나는 많은 프로젝트를 Grails framework를 이용해서 완료 하였다. Grails 팀은 H2 데이터베이스 콘솔을 Grails 2에 포함하여 배포 하였다. 나는 빠르게 이 기능에 빠져들었다. 물론 사랑은 아니지만, 내가 자주 사용하는 Grails의 특징이 되었다. 당신이 Spring /Hibernate(Grails과 함께) 사용해서 어플리케이션을 개발한다면, 당신에게 데이터베이스가 필요 할 것이다. H2 데이터베이스 콘솔은 당신의 업무처리에 도움이 되는 좋은 도구이다.


H2 데이터베이스 콘솔을 이용하지 않는다면, 데이터를 확인하는 것이 매우 어려운 일이 될 것이다.




PS : 좋은 자료를 공유 해주시고 또한, 번역을 허락 해준 John Thompson 님에게 감사드립니다.

Thank you for John Thompson.



원본 출처 : https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

Posted by lahuman