MSA

[MSA] Part 8. H2 Database 연동 그리고 'ddl-auto' property

cwchoiit 2023. 10. 11. 10:14
728x90
반응형
SMALL
728x90
반응형
SMALL

H2 Database를 연동해서 좀 더 그럴싸한 서비스를 구현해 보자. H2 Database는 Java로 만들어진 오픈 소스 형태의 RDBMS다.

 

 

H2 Dependency

Maven Repository 사이트에 들어가서 H2라고 검색해보자. https://mvnrepository.com

검색하면 가장 상단에 H2 Database Engine 이라는 dependency가 노출된다.

거기에 가장 최신 버전을 클릭해서 dependency를 복사한 후 pom.xml 파일에 추가하자.

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.2.224</version>
    <scope>runtime</scope>
</dependency>

한 가지 변경사항이 있는데 scope를 runtime으로 변경해 주자. test로 하게 되면 실제로 서비스를 실행할 때 H2 Database를 사용할 수 없기 때문에 runtime scope으로 바꿔서 추가한 후 maven build를 다시 실행.

 

그 후 application.yml 파일에 h2 관련 설정을 추가해줘야 한다.

server:
  port: 0
spring:
  application:
    name: user-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console

eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka

h2.console.enabled: true = console이라는 웹 브라우저에서 h2 database를 작업할 수 있는 설정을 적용한다는 의미

h2.console.settings.web-allow-others: true = 웹 브라우저로 접속하는 것을 허용

h2.console.path: /h2-console = 웹 브라우저 접속 URI는 /h2-console

 

이렇게 작성하고 서버를 실행해보자.

 

 

 

H2 console

브라우저에 H2 Database를 연동하기 위해 실행한 서비스 URL에 path로 /h2-console을 입력해 보면, 위와 같은 화면이 노출된다. 이것이 H2가 제공하는 console인데 여기서 데이터베이스에 접속할 수 있다. 

 

Settings는 H2, MariaDB, MySQL 등 여러 Database가 있지만 H2를 그대로 사용할 것이고 Driver Class는 org.h2.Driver, JDBC URL은 jdbc:h2:mem:testdb라고 작성하면 In Memory 형식의 데이터베이스로 testdb라는 데이터베이스 이름을 가진 데이터베이스에 접속하겠다는 의미가 된다. Username과 Password는 default로 Username은 sa, Password는 없다.

 

이 상태에서 접속을 시도해 보면 이러한 에러를 마주치게 된다.

데이터베이스를 찾지 못했다는 뜻인데, 예전 버전에서는 데이터베이스를 못 찾으면 데이터베이스를 생성해 줬는데 이제는 그렇지 않다. 이제는 데이터베이스를 직접 만들어 놓은 상태로 접속해야 한다. 이를 해결하기 위해 UserService에 Entity 클래스를 만들어 User 테이블을 하나 추가해서 데이터베이스를 만들 거다.

 

 

User Entity

Entity 클래스를 만들려면 JPA라는 Dependency를 추가해야 한다.

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>3.1.3</version>
</dependency>

JPA는 Java Persistence API의 약자로, RDB와 Java Objects 간 데이터에 대한 접근, 관리, 지속성에 대한 명세라고 생각하면 된다.

좀 더 간단하게는 Relational Database와 Java application이 상호작용하게 도움을 주는 녀석이라고 생각하자.

JPA는 아래 작성한 포스팅을 통해 조금 더 자세하게 이해할 수 있다.

2023.10.11 - [Spring, Apache, Java] - JPA(Java Persistence API)란?

 

JPA(Java Persistence API)란 ?

JPA는 Java Persistence API의 약자로, RDB와 Java Objects 간 데이터 접근, 관리, 지속성에 대한 명세라고 생각하면 된다. 좀 더 간단하게는 Relational Database와 Java application이 상호작용하게 도움을 주는 녀석

cwchoiit.tistory.com

 

그래서 이제 UserEntity를 만들기 위해 entity라는 패키지를 하나 생성하고 그 안에 User.java파일을 생성하자.

package com.example.tistoryuserservice.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50, unique = true)
    private String email;

    @Column(nullable = false, length = 50)
    private String name;

    @Column(nullable = false, unique = true)
    private String userId;

    @Column(nullable = false, unique = true)
    private String encryptedPassword;
}

필드로는 id, email, name, userId, encryptedPassword가 있다.

이 클래스에서 @Entity, @Table, @Id, @GeneratedValue, @Column 어노테이션 모두가 JPA로부터 사용가능한 어노테이션인데 데이터베이스의 테이블을 어떻게 표현할지에 대한 도움을 주는 어노테이션이다.

 

이제 application.yml 파일을 수정해서, 만든 User Entity를 데이터베이스에 적용해 보자.

 

 

application.yml

수정하고 확인할 부분은 다음과 같다.

spring:
  application:
    name: user-service
  datasource:
    url: jdbc:h2:mem:users
    username: sa
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console

spring.datasource.url: 데이터베이스 URL

spring.datasource.username: H2 Database의 Username(Default: sa)

spring.jpa.show-sql: 수행되는 SQL문을 출력할지에 대한 여부

 

spring.jpa.hibernate.ddl-auto

ddl-auto는 어떻게 데이터베이스 스키마가 생성과 변경되는지에 대한 제어값인데, 여러 값이 있다. 

  • create: 애플리케이션이 실행될 때마다 Hibernate가 데이터베이스 스키마를 매번 scratch 상태에서 만들어낸다. 이는 기존에 존재했던 데이터들에 손상이 있을 수 있다.
  • update: Hibernate는 애플리케이션의 엔티티 클래스들의 현재 상태와 매치되도록 데이터베이스 스키마를 업데이트한다. 이는 테이블, 칼럼, 제약 조건들이 추가되거나 변경될 수 있다. 그러나 기존에 존재했던 것들을 삭제하지는 않는다. 이 옵션은 개발 또는 테스트 단계에서 유용할 수 있다.
  • validate: Hibernate는 어떠한 데이터베이스 스키마에도 변경을 가하진 않는다. 오직 애플리케이션 내 정의된 엔티티들의 매핑들이 유효한지를 판단한다. 만약 애플리케이션에서 정의된 값과 데이터베이스 사이에 어떠한 불일치라도 있으면 에러를 던진다.
  • none: Hibernate는 스키마에 대해 어떠한 생성이나 유효성 검증에 대한 수행을 하지 않는다. 정상적으로 또는 엔티티 클래스들의 매핑값과 일치한 데이터베이스 스키마를 만들어내는 모든 책임은 사용자에게 가해진다.  

 

create/update 속성값은 Production 환경에서는 주의 또 주의해야 한다. 데이터 손실 또는 예상하지 못한 스키마의 변화가 생길 수 있으며 이 속성값들은 흔히 개발 단계 또는 테스팅 단계에서 간편하게 데이터베이스 셋업을 하기 위해 설정하는 옵션들이기 때문에 Production 환경에서는 validate 또는 none 속성값을 사용할 것을 권장한다.

 

 

 

H2 Database 연동 확인하기

이렇게 모든 설정을 마치고 나면 서버를 재실행해보자. Hibernate 관련 로그들이 여럿 찍히는 걸 확인할 수 있다.

H2 Database에 User Table을 생성한 로그가 찍힌 것이다. H2 Console로 가서 다시 로그인해 보자.

JDBC URL을 jdbc:h2:mem:users라고 변경한 후 접속하면 정상적으로 접속이 되고 Users라는 테이블 하나가 보인다.

또한, User.java 파일에서 정의한 필드들이 칼럼으로 만들어진 것도 확인할 수 있다.

 

728x90
반응형
LIST

'MSA' 카테고리의 다른 글

[MSA] Part 10. User Service (Find User/s)  (0) 2024.01.08
[MSA] Part 9. UserService (Create User)  (2) 2023.10.11
[MSA] Part 7. API Gateway를 Eureka에 등록하기  (0) 2023.10.10
[MSA] Part 6. Gateway Filter  (2) 2023.10.10
[MSA] Part 5. API Gateway  (0) 2023.10.06