[Spring Boot] H2

YuLim·2023년 1월 16일
1

💻 H2란?

  • 인메모리(In-memory) DB입니다.
  • 테스트 실행 시마다 DB의 테이블을 초기 상태로 유지하기 위해 로컬 개발 환경, 테스트 환경에서 주로 사용합니다.

    인메모리(In-memory) DB란?
    메모리 안에 데이터를 저장하는 데이터베이스입니다. (메모리는 휘발성으로 컴퓨터를 종료하면 저장되어 있는 데이터가 모두 삭제됩니다.)
    인메모리(In-memory) DB는 애플리케이션이 실행되는 동안에만 데이터를 저장하고, 애플리케이션 실행을 종료했다가 다시 실행시키면 인메모리(In-memory) DB안에 저장되어 있던 데이터는 모두 삭제 됩니다.


✔ 의존 라이브러리

  • build.gradle의 dependencies에 의존 라이브러리 추가
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // JPA 사용
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' // JDBC 사용
	runtimeOnly 'com.h2database:h2' // H2 사용
	
}

✔ H2 Browser 활성화 설정

Spring에서는 application.properties 또는 application.yml 파일을 통해 Spring에서 사용하는 다양한 설정 정보들을 추가합니다.

  • application.yml 파일에 H2 Browser 활성화 설정 추가
spring:
  h2:
    console:
      enabled: true # H2 Console 사용 여부
      path: /h2     # Context path 변경
  datasource:
    url: jdbc:h2:mem:test     # JDBC URL 변경
  sql:
    init:
      schema-locations: classpath*:db/h2/schema.sql  # 테이블 생성 파일 경로
  • path변경으로 http://localhost:8080/h2로 H2 Console 접속 가능
    • default path /h2-console
  • H2 DB는 애플리케이션을 재시작할 때마다 애플리케이션 로그에 출력되는 JDBC URL이 매번 랜덤하게 바뀝니다.
    • url: jdbc:h2:mem:test로 변경, URL이 유지됩니다.
    • H2 Console의 [JDBC URL]에 적어줍니다.
  • (JDBC) 테이블 생성을 위한 SQL문이 추가된 schema라는 파일명으로 .sql 파일의 경로를 지정해주면 schema.sql 파일에 있는 스크립트 읽어서 애플리케이션 실행 시, DB에 테이블을 자동으로 생성해준다.
    • 인메모리 DB를 사용할 경우, 애플리케이션이 실행될 때마다 schema.sql 파일의 스크립트가 매번 실행된다.
    • src/main/resources/db/h2에 위치

✔ Spring Security에서의 H2


Spring Security를 사용하면 H2 Console에서 위와 같은 오류가 발생할 수 있습니다.

X-Frame-Options
Spring Security는 Clickjacking 공격을 막기 위해 기본적으로 frameOptions() 기능이 활성화 되어 있으며 디폴트 값은 DENY입니다.
<frame>, <iframe>, <object>의 HTML 태그를 이용한 페이지 렌더링을 허용하지 않겠다는 의미입니다.

  • 해결법
    애플리케이션의 SecurityConfiguration클래스의 filterChain()메서드에 .headers().frameOptions().sameOrigin()를 추가해주면 정상정인 H2 Console화면이 보입니다.

frameOptions().sameOrigin()은 동일 도메인으로부터 들어오는 request만 페이지 렌더링을 허용합니다.
H2 웹 콘솔의 화면이 내부적으로 태그를 사용하고 있기 때문에 H2 웹 콘솔을 정상적으로 사용할 수 있도록 위와 같이 설정하면 됩니다.
배포 애플리케이션에 H2를 사용하지 않는다면 삭제 후 배포합니다.

.headers().frameOptions().disable()
X-Frame-Options를 비활성화 하는 설정
보안측면에서 sameOrigin()보단 덜 안전하지만, 도메인이 다른 request의 페이지 렌더링을 허용해야 할 때 사용합니다.


환경 버전

Spring Boot 2.7.2
Gradle 7.5
JDK 11

profile
개인 공부 기록장

0개의 댓글