오늘은 이동욱 님의 스프링부트와 AWS로 혼자 구현하는 웹 서비스 책을 공부하며 코딩을 하다가 h2 관련해서 모호한 부분이 있어 정리할 겸 글을 씁니다.
h2 document의 아래 부분에 따르면, url 설정에 따라 다음과 같은 차이점이 존재한다.
- jdbc:h2:mem : private한 data connection을 유일하게 생성한다. (이름 별도로 없음)
- jdbc:h2:mem:xxx : 여러 개의 connection을 같은 in-memory db에 대해서 생성하고 싶은 경우 다음과 같이 사용한다.
참고로 이 방식은 in-memory 방식으로 h2 db를 사용하는 방식이다.
따라서 다음과 같이 application.yml 파일에 datasource 정보를 입력하면, in-memory db를 사용한다고 명시하는 것이 된다.
또한 기본적으로 spring boot project의 경우 application.yml 파일을 생성만 해도 기본적으로 h2 in-memory database를 사용하도록 설정되어 있어, 별도로 명시하지 않은 경우에도 h2 database를 사용하는 결과를 확인할 수 있다.
h2의 세 가지 모드
Embeded mode (In-memory mode) vs Server mode
- embedded mode (in-memory)
- 별도로 h2를 다운받고, 설치하는 과정이 필요 없다.
- 의존성 추가만으로 실행 가능
- spring이 build 되고, 실행되는 시점에 의존성으로 받아온 h2의. jar로 h2를 자체적으로 띄워 접속 가능함
- embedded, in-memory 둘은 유사한 방식이지만, embedded의 경우 로컬 파일에 데이터를 직접 저장하고 사용하는 반면, in-memory 모드의 경우 그렇지 않다는 차이점이 존재한다.
- server mode
- h2 다운로드한 후, 별도의 port를 통해 실행해야 한다.
기본적으로 h2를 두 가지 모드로 사용할 수 있다고 한다.
위에서 본 예시들은 embedded mode로 사용하고 있는 것으로 in-memory db의 형태로 h2 db를 사용하는 것을 의미한다.
임베디드 모드로 구동하게 되면, 당연히 db에 저장된 데이터들은 영속적이지 않고, 프로그램 종료 시에 휘발되는 단점이 존재한다. 하지만, server mode에 비해서 성능이 빠르다는 장점이 존재한다.
그렇다고 하더라도 embedded mode의 경우 application의 thread와 자원을 사용해 데이터에 접근하는 방식이기 때문에, application의 상태에 영향을 받는다는 것이 단점이 될 수 있다.
server mode 사용의 장단점은 다음과 같다고 한다. (다른 글 참조)
- 제한이 없는 Application과 DB의 커넥션 (TCP/IP를 사용함으로써 흐름 제어가 가능한 듯하다.)
- PageStore 엔진의 동기화를 이용하여 멀리 스레딩을 지원함으로 데이터 정합성을 지킬 수 있다.
- TCP/IP를 이용하여 데이터의 흐름을 가지기 때문에, 커넥션을 맺고 데이터를 전송하는 등의 성능 오버헤드가 존재
- 외부 서버에서 제공하고 연동 설정을 지정하지 않는다면, 환경에 따라서 해당 모드를 사용하는 프로젝트에 대해 별도의 H2 설정과 데이터베이스에 대한 데이터 (DDL, DML 등)가 요구된다.
여태까지 h2 db를 설정할 때 이렇게 했었던 이유
세 가지 모드를 알고 나니 그동안 강의를 듣거나, h2를 사용할 때 db 파일을 생성하는 과정을 왜 그렇게 진행하는지 알게 되었다.
예를 들어 test라는 db를 생성하여 프로젝트에서 사용한다면, 우선 다음과 같이 h2 web console에서 url을 입력해 db 파일을 만들었던 것이 기억할 것이다.
그다음 연결을 한 뒤에 다시 연결을 해제하고, 다음과 같이 접속을 하는 과정을 진행했는데
이러한 이유는 우선 embedded mode로 접속해 db 파일을 생성한 뒤에 server mode로 TCP 통신을 통해 DB에 접속하는 방식으로 설정하기 위함이었던 것이었다..!!
이렇게 또 하나를 배웠다..
그래서 삽질한 내역
그래서 무엇으로 삽질을 했느냐하면..
spring boot 프로젝트에서 application.yml 파일에 datasource 설정을 추가하는데, 아무리 해도 테스트 코드를 실행할 때에는 잘 동작하는 것 같은데, application 실행 만 하면, 제대로 동작하지 않아서 이거저거 계속 시도해보면서 하루를 썼습니다..
문제의 원인은 황당하게도
멍청하게 test 폴더에만 appliation.yml 파일을 생성해 db 설정을 이거저거 바꿔가며 실행하고 있었습니다..
그걸 마지막에 알아서 java 폴더에 application.yml 파일을 복붙하니까 바로 정상 작동을 하네요..
spring:
jpa:
hibernate:
ddl-auto: create #create, create-drop, update ...
properties:
hibernate:
show_sql: true
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
h2:
console:
enabled: true
path: /h2
settings:
trace: false
web-allow-other: true # 브라우저에서 접근 가능하도록 설정
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:test3
username: sa
password:
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql: trace
아는 설정이랑 설정은 다 해보면서 했는데 너무 바보같은 실수를 했네요
그래도 다음에는 이런 실수는 절대 안하지 않을까 생각하며, 오늘은 여기서 글을 마치겠습니다!!
참조
https://lob-dev.tistory.com/13
https://www.h2database.com/html/features.html
'TIL(Today I Learned)' 카테고리의 다른 글
Window 환경에서 putty를 이용한 EC2 환경 접속 방법 기록 (0) | 2023.08.22 |
---|---|
[삽질 기록] YAML 파일 작성 시 double quotes를 사용하는 경우 (0) | 2023.08.21 |
[Java] String, StringBuilder, StringBuffer 파고 들어보기 (0) | 2023.08.04 |
Thymeleaf에 대한 정리 (0) | 2023.07.28 |
Java의 Exception에 대해서 (0) | 2023.07.05 |
댓글