Spring Boot (+ RESTful)

Spring Boot - H2 Database - DB 연결 / Entity / Hibernate / Lombok

wy-family 2024. 12. 13. 23:18

 

Spring Boot EFA를 도식화해서 보여주고 있다.

R-DBMS 에 MySQL 이라고 되어 있지만, 여기서는 H2 Database를 연결했다.

 


H2 DB를 설치하고나서, DBMS가 H2 DB를 사용하겠다는 것.

관계형 DB 이기 때문에 table 단위로 데이터 저장할 것이다.

DBMS에 직접 table 을 만드는 것은 아니고,

JPA 를 이용하게 되면은, Entity 객체, VO 같은 객체를

spring data JPA에서 제공해주는 ORM Mapping 통해서

Object 를 하나의 Relational (Table - 관계형 데이터베이스에서는 Table 이라는 말 대신에 Relational 이라고도 함)

즉, Object 를  ORM Mapping 을 통해서 Table 로 자동으로 만드는 방법이 Hibernate 에서 제공해준다.

 

Member.java 라는 Entity 객체를 하나 만들거다.


H2 Database 설정 및 JPA와 ORM Mapping 정리

  1. H2 Database 설치 및 사용
    • H2 Database는 관계형 DBMS로서 데이터를 테이블(Relation) 단위로 저장합니다.
    • 관계형 데이터베이스의 특징상, 데이터를 정형화된 구조로 관리합니다.
  2. 테이블 생성 방식
    • DBMS에 직접 테이블을 생성하는 대신, **JPA(Java Persistence API)**를 사용하여 객체 지향 프로그래밍과 데이터베이스의 관계형 모델을 연결합니다.
  3. JPA와 ORM Mapping
    • JPA는 Entity 객체(예: Member.java)와 데이터베이스 테이블 간의 **ORM(Object Relational Mapping)**을 지원합니다.
    • ORM은 **Java 객체(Object)**를 데이터베이스의 **테이블(Relational)**로 매핑하여 자동으로 테이블을 생성하고 관리하는 기능입니다.
    • Spring Data JPA는 ORM의 구현체인 Hibernate를 사용하여, 객체와 테이블 간의 매핑을 처리합니다.
  4. Object와 Relational 매핑
    • Java의 객체(예: Member 클래스)와 관계형 데이터베이스의 테이블(예: member 테이블)은 다음과 같이 매핑됩니다:
      • 객체 필드 → 테이블 컬럼
      • 객체 인스턴스 → 테이블 행(Row)
    • 관계형 데이터베이스에서는 테이블을 Relational이라고도 합니다.
  5. Member.java (Entity 객체) 생성
    • Member.java는 데이터베이스의 테이블과 매핑되는 Entity 객체입니다.
    • JPA를 통해 Member 클래스에 정의된 속성(id, name, age)이 데이터베이스에 대응하는 테이블과 컬럼으로 생성됩니다.

요약 정리 (단순화)

  • H2 Database 설치: H2는 관계형 DBMS이며 데이터를 테이블 단위로 저장함.
  • JPA 사용: 직접 SQL로 테이블을 생성하지 않고, JPA를 통해 객체(Entity)를 테이블로 매핑.
  • ORM Mapping: Hibernate가 제공하는 ORM 기술로 Java 객체를 테이블로 자동 변환.
  • Member.java 생성: Member 클래스(Entity 객체)를 만들어 테이블로 매핑할 예정.

Hibernate란?

Hibernate는 Java 기반의 ORM(Object Relational Mapping) 프레임워크입니다.
JPA(Java Persistence API)의 구현체 중 하나로, 객체 지향 프로그래밍에서 사용되는 Java 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑하고, 데이터베이스 작업을 쉽게 처리할 수 있도록 도와줍니다.


Hibernate의 주요 역할

  1. 객체와 관계형 데이터베이스 매핑 (ORM)
    • Java의 객체(클래스)를 관계형 데이터베이스의 테이블과 매핑합니다.
    • 매핑된 객체를 통해 데이터베이스 작업(저장, 조회, 수정, 삭제)을 수행할 수 있습니다.
  2. SQL 대신 HQL 사용 가능
    • Hibernate는 SQL 대신 **HQL(Hibernate Query Language)**을 사용해 객체 지향적인 방식으로 데이터를 조회하거나 조작할 수 있습니다.
    • HQL은 데이터베이스에 독립적이므로, 특정 DBMS에 종속되지 않도록 설계되었습니다.
  3. JPA 구현체
    • Hibernate는 JPA 표준을 구현하며, JPA를 사용할 때 기본적으로 Hibernate를 사용하는 경우가 많습니다.
    • JPA 인터페이스와 함께 작동해 개발자가 더 적은 코드를 작성하면서도 강력한 데이터베이스 기능을 사용할 수 있게 합니다.
  4. 자동 테이블 생성 및 데이터 관리
    • Hibernate는 애플리케이션 시작 시, JPA 어노테이션을 분석하여 자동으로 테이블을 생성하거나 데이터베이스 스키마를 관리합니다.

Hibernate의 주요 특징

  1. POJO (Plain Old Java Object) 기반
    • 기존의 Java 클래스를 그대로 사용해 데이터베이스 테이블과 매핑할 수 있습니다.
  2. 데이터베이스 독립성
    • Hibernate는 다양한 DBMS를 지원하며, 특정 데이터베이스에 종속되지 않는 코드를 작성할 수 있습니다.
  3. 자동 데이터베이스 작업
    • 데이터를 저장, 수정, 삭제하는 SQL 코드를 직접 작성하지 않아도, Hibernate가 이를 자동으로 처리합니다.
  4. 캐싱 지원
    • Hibernate는 1차 캐시(기본적으로 세션 단위)와 2차 캐시(애플리케이션 단위)를 지원해 성능을 최적화합니다.
  5. 관계 매핑
    • 객체 간의 연관 관계(1:1, 1:N, N:M)를 데이터베이스의 테이블 관계와 매핑합니다.

Hibernate를 사용하는 이유

  1. 생산성 향상
    • SQL을 직접 작성하는 부담을 줄여주고, 데이터베이스 작업을 객체 중심으로 처리할 수 있습니다.
  2. 유지보수 용이
    • 테이블 이름이나 컬럼 이름이 변경되더라도 Java 클래스에서 어노테이션만 수정하면 되므로 코드 변경이 간단합니다.
  3. 데이터베이스 변경에 유연
    • 애플리케이션이 특정 DBMS에 의존하지 않게 해 주며, 다양한 데이터베이스에서 동작할 수 있습니다.

Hibernate의 간단한 동작 예시

1. Entity 클래스 생성
Hibernate를 사용하려면 먼저 Java 클래스에 JPA 어노테이션을 추가해 매핑합니다.

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int age;

    // Getter/Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

2. Hibernate 설정 파일 (application.properties)

Spring Boot와 함께 사용할 경우, Hibernate는 Spring Data JPA를 통해 동작합니다.

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
  • spring.jpa.hibernate.ddl-auto=update
    Hibernate가 자동으로 테이블을 생성하고 업데이트합니다.

3. 데이터 저장 및 조회 코드

Hibernate를 사용해 데이터를 저장하거나 조회하는 간단한 예제입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jakarta.transaction.Transactional;
import java.util.List;

@Service
public class MemberService {

    @Autowired
    private MemberRepository memberRepository;

    @Transactional
    public void addMember(String name, int age) {
        Member member = new Member();
        member.setName(name);
        member.setAge(age);
        memberRepository.save(member);
    }

    public List<Member> getAllMembers() {
        return memberRepository.findAll();
    }
}

Hibernate의 장단점

장점:

  1. SQL을 직접 작성하지 않아도 되므로 생산성 향상.
  2. 데이터베이스 변경 시에도 코드 수정 최소화.
  3. 다양한 관계형 데이터베이스와 호환 가능.
  4. 객체 지향적인 데이터베이스 설계를 쉽게 지원.

단점:

  1. 초기 설정이 복잡할 수 있음.
  2. 대규모 프로젝트에서 성능 조정을 잘못하면 느려질 가능성.
  3. ORM 학습 곡선이 있을 수 있음.

결론

Hibernate는 JPA 표준 구현체로, 관계형 데이터베이스와 객체 지향 프로그래밍 간의 간극을 메워주는 강력한 도구입니다. 이를 통해 Java 애플리케이션에서 데이터베이스 작업을 더 쉽고 효율적으로 처리할 수 있습니다.


H2 Database의 H는 Hibernate의 H와 관련이 없습니다.

H2 Database의 이름 유래

  • H: H2의 개발자인 Thomas Mueller가 과거에 개발한 **Hypersonic SQL (HSQLDB)**라는 데이터베이스에서 따온 것입니다. H2는 HSQLDB의 후속작으로, 이를 개선한 새로운 데이터베이스로 개발되었습니다.
    • HSQLDB의 H에서 영감을 받아 이름에 H를 붙였다고 볼 수 있습니다.
  • 2: H2가 HSQLDB의 두 번째 버전이라는 의미로 붙여진 것입니다.
    • 즉, H2는 HSQLDB의 "2세대" 프로젝트로 볼 수 있습니다.

H2와 Hibernate의 관계

  • H2 DatabaseHibernate는 독립적인 기술입니다.
  • 다만, 둘 다 Java 기반으로 만들어졌고, 함께 사용하는 경우가 많습니다.
    • Hibernate는 ORM 프레임워크로 데이터베이스와 Java 객체를 매핑하는 데 사용되며,
    • H2는 관계형 데이터베이스(DBMS)로서 Hibernate가 데이터를 저장하거나 가져올 때 사용하는 저장소 역할을 합니다.

요약

  • H2 Database의 H는 Hibernate와 무관하며, HSQLDB에서 유래했습니다.
  • 2는 HSQLDB의 두 번째 버전(2세대 데이터베이스)이라는 의미입니다.
  • Hibernate는 H2 Database와 독립적인 기술이지만, 함께 사용하기에 좋은 조합입니다.

Hibernate의 영어 단어 뜻과 쓰임

1. Hibernate의 기본 영어 뜻

  • Hibernate (동사)
    • : "겨울잠을 자다", "동면하다"
    • 동물이 겨울철에 활동을 멈추고 에너지를 절약하기 위해 동면하는 것을 가리킵니다.
  • 예문:
    • "Bears hibernate during the winter."
      (곰은 겨울 동안 동면한다.)
    • "Some animals hibernate to survive harsh climates."
      (일부 동물은 혹독한 기후를 견디기 위해 동면한다.)

2. 컴퓨터 과학에서 Hibernate의 쓰임

컴퓨터 과학에서 Hibernate는 동면의 개념을 빌려온 것으로, 보통 시스템이나 상태를 보존하면서 일시적으로 중단하는 것을 의미합니다.

  1. 운영체제에서의 Hibernate
    • : "컴퓨터의 절전 모드(하이버네이트 모드)"
    • 컴퓨터가 실행 중인 상태를 하드 드라이브에 저장하고, 완전히 종료된 것처럼 전원을 끈 뒤 나중에 다시 부팅했을 때 작업 상태를 복원합니다.
    • 예문:
      • "The laptop went into hibernate mode to save energy."
        (노트북이 전력을 절약하기 위해 하이버네이트 모드로 전환되었다.)
  2. 프로그래밍에서 Hibernate
    • Hibernate 프레임워크의 이름은 "데이터를 영속적으로 저장(Persistence)"한다는 개념과 연결됩니다.
    • 객체 지향 프로그래밍에서, Hibernate는 객체를 데이터베이스에 저장하고 필요할 때 다시 불러올 수 있는 '상태 보존'을 의미합니다.
    • 즉, Hibernate는 "데이터베이스 상태를 보존하고 재사용한다"는 점에서 동면(hibernate)의 의미를 빌려온 것입니다.

Hibernate 프레임워크 이름의 유래와 비유적 의미

Hibernate라는 이름은 동면과 데이터 상태 보존의 유사성에서 유래된 것으로 보입니다:

  • 동물의 동면: 에너지를 절약하고 필요할 때 다시 활동 상태로 복귀.
  • Hibernate 프레임워크: 데이터 객체를 영구 저장소에 보관하고 필요할 때 다시 객체로 복원.

요약

  1. Hibernate의 기본 뜻: "동면하다" (겨울잠을 자다).
  2. 컴퓨터에서의 쓰임: 절전 모드 또는 데이터 상태를 저장하고 복원하는 개념.
  3. Hibernate 프레임워크: 객체 데이터를 데이터베이스에 저장하고 필요할 때 다시 사용할 수 있도록 "영구 보존(Persistence)"하는 기능을 강조한 이름.

H2 DB 설치를 하러 가보자.

 

내가 나중에 다시 이 게시글을 확인하면서 공부를 할 때, 기억을 제대로 하기 위해서 좀 자세히 적어보자면,

다운로드한 zip 파일을 프로젝트 파일로 가지고 가서 압축을 풀었다.

그러면 h2 라는 폴더가 나오고, 그 안에 bin 이라는 디렉토리에 h2w.bat 라는 배치 파일이 있다.

그걸 더블클릭하면,

h2 db에 접속할 수 있는 콘솔이 열리는 것. 어찌됐든, spring boot에서 h2 db에 커넥션, 연결을 해서 쓰는 것이기 때문에,

spring boot 에서 h2 db 에 연결하는 세션을 만들어서 접근한다라고 생각하면 된다.

지금까지는 그냥 다운로드한 것 밖에 없다보니 spring boot 랑 특별한 연결고리는 없다.

 

더블클릭을 하면, java 로 h2 db 를 연결(실행)한다. (나는 openJDK 를 설치했어서 openJDK 접근 허용을 할 것인지 창이 떴다. 그런데, 루트에서 실행되어서 그런것인지 캡쳐는 안 되어서 글로만 남긴다.)

JDBC URL 이 접속 URL 이다.

jdbc:h2:~/test 

에서, ~ 는 localhost 를 의미한다. 내 컴퓨터에 h2 db 가 설치되어 있기 때문에 localhost 이고,

~/test 라고 하는건, test 가 db 이름이 되는 것이다. test 라는 db 에 접근, 접속을 하겠다는 것.

그런데 아직 test 라는 db 를 만들지를 않았다.

그래서 아랫쪽에 연결 이라는 버튼을 누르면, test 라는 db 가 하나가 만들어진다라고 생각하면 된다.

db 가 하나 만들어지고 그리고 그 db 안에 뭔가 table 이 만들어진다고 보면 되겠다.

사용자명은 그냥 sa, 루트 사용자명이 sa. 비밀번호는 처음에 만들어지지 않는다.

 

연결을 누르면 DB가 만들어졌다. 아직까지 아무런 table 이 만들어진 건 없다.

이거는 h2 db 를 사용하기 위해 접속해본 것이고,

이따가는 spring boot 에서 이 db 랑 연결할 세션을 만들어서 접속하는 걸 해볼 것이다.

 

내컴퓨터 -> C드라이브 -> 사용자 -> 사용자명(나는 ASUS ROG) -> 여기 들어와보면, test.mv.db 라는 파일이 만들어져 있는 걸 확인할 수 있다. 파일로 db 를 만든다. 

원래 만들어진 db 라면 접속을 할 것이고, 없는 걸 연결 버튼을 누르면 이렇게 새롭게 만들어진다.

 


Entity 객체 - JPA ORM Mapping - DBMS

이런식으로 연결을 한다고 했으니, Entity 를 먼저 만들어보자.

저렇게 만들면, VO 객체가 된다.

이거를 table 로 만들어주려면, @Entity 라고 해야 한다.

@Entity 라고 해야, table 로 Mapping 이 되는 것이다. id, username 등등은 열로 맵핑되는 것.

흥미롭게도, @Entity 라고 입력하면 DB 모양이 public class Member 옆에 작게 만들어진 걸 볼 수 있었다.

 

table 을 만들려면 primary key가 있어야 한다. PK 가 있어야 한다.

그 방법이 @Id 를 해주는 것.

그리고나서 @Id 로, id 를 기본키로 지정하면, 왼쪽에 열쇠 모양이 생긴 걸 확인할 수 있다.

 

그리고 id 를 1, 2, 3 이렇게 1씩 자동 증가 하는 열로 만들려면, MySQL이나 H2 같은 경우에는 IDENTITY 하게 되면 AutoIncrement 로 만들어진다. @GeneratedValue(strategy = GenerationType.IDENTITY) 라고 하게 되면,

id 열은 자동 증가 열이 되는 것이다.

 

이제 Lombok 에서는 getter와 setter 가 필요하다.
Lombok 은 @Data 를 해주게 되면 된다.

Lombok이 뭔지 간단하게 공부하고 넘어가자.

Lombok이란?

Lombok은 Java 애플리케이션 개발에서 반복적인 코드를 줄여주는 라이브러리입니다.
주로 Getter/Setter, 생성자, toString, equals 및 hashCode 메서드와 같은 반복적인 코드를 자동으로 생성해 줍니다.
Lombok을 사용하면 코드의 가독성을 높이고 유지보수를 간소화할 수 있습니다.


주요 특징 및 기능

  1. 어노테이션 기반 코드 자동 생성
    • Lombok은 다양한 어노테이션을 제공하여 반복적인 코드를 자동으로 생성합니다.
    • 코드량을 줄이고, 클래스가 더 간결하고 읽기 쉽게 만들어줍니다.
  2. 컴파일 시 코드 생성
    • Lombok은 컴파일 단계에서 코드에 접근하여 필요한 메서드를 자동으로 추가합니다.
    • IDE(예: IntelliJ, Eclipse)와 통합되어 편리하게 사용할 수 있습니다.

Lombok의 주요 어노테이션

@Getter/Setter

  • 클래스 필드에 대한 GetterSetter 메서드를 자동 생성.
@Getter
@Setter
public class Member {
    private String name;
    private int age;
}
  •  컴파일 후 자동 생성 코드:
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }

 

@ToString

  • toString() 메서드를 자동 생성.
@ToString
public class Member {
    private String name;
    private int age;
}
  • 컴파일 후 자동 생성 코드:
@Override
public String toString() {
    return "Member(name=" + name + ", age=" + age + ")";
}

 

@NoArgsConstructor, @AllArgsConstructor

  • 기본 생성자와 모든 필드를 초기화하는 생성자를 자동 생성.
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    private String name;
    private int age;
}
  • 컴파일 후 자동 생성 코드:
public Member() {}
public Member(String name, int age) {
    this.name = name;
    this.age = age;
}

 

@Data

  • @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 한 번에 적용.
@Data
public class Member {
    private String name;
    private int age;
}
  • 간단한 데이터 객체(POJO) 클래스에 유용합니다.
  1.  

Lombok 사용 방법

Lombok 의존성 추가

  • Maven:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version> <!-- 최신 버전 확인 필요 -->
    <scope>provided</scope>
</dependency>
  • Gradle:
implementation 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'

IDE 설정

  • Lombok이 제대로 작동하려면 IDE에 Lombok 플러그인을 설치해야 합니다.
    • IntelliJ: "Settings → Plugins → Lombok" 설치.
    • Eclipse: "Help → Eclipse Marketplace → Lombok" 설치.

Lombok의 장단점

장점:

  1. 코드 간소화: 반복적인 Getter/Setter, 생성자 등의 코드 작성 불필요.
  2. 가독성 향상: 클래스의 핵심 로직에 집중 가능.
  3. 생산성 향상: 개발 속도 증가 및 유지보수 간소화.

단점:

  1. 학습 곡선: Lombok 어노테이션을 처음 사용하는 개발자에게는 낯설 수 있음.
  2. 의존성 증가: 코드가 Lombok에 종속될 수 있음.
  3. IDE 의존성: IDE가 Lombok을 제대로 지원하지 않으면 디버깅이 어려울 수 있음.

Lombok을 사용하는 이유

  • Lombok은 Java에서 반복적인 코드 작성 부담을 줄이고, 생산성을 향상시키기 위해 설계되었습니다.
  • 특히, 데이터를 저장하는 단순한 POJO 클래스나 엔티티(Entity)를 작성할 때 유용하며, JPA와 함께 사용하는 경우 매우 편리합니다.

Lombok 을 사용하려면 plugin 설치랑 어노테이션 처리가 가능하도록 체크를 해줘야 한다.

 

자, 이제 DB 연결을 해보자.

H2 DB 에 Member 라는 VO 를 @Entity 라고 했으니 table 로 만들어야 하기 때문에, db 설정을 해줘야 한다.

설정은, application.properties 에 해주면 된다.

자세한 것은 JPA 공부할 때 하겠지만, 여기서 기본적으로 알고 넘어가야 할 것들을 공부하고 넘어가자.


설정 내용을 작성 중에, 이런 메세지가 떴다.

 

Deprecated (사용 중단 예정) 이란 특정 기능이나 속성이 더 이상 권장되지 않으며 향후 버전에서 제거될 가능성이 있음을 뜻한다.

spring.datasource.platform = h2 라고 하면, spring boot 에서 db platform 을 명시적으로 h2 라고 설정하는 속성이다.

예를 들어, h2, mysql, postgresql 등의 플랫폼 이름을 지정할 수 있다.

그런데 이제는 어쨌든, 더 좋은 방식으로 설정을 처리하기 위해 이 속성을 제거하려는 경우일 것이다.

db platform 을 자동으로 감지하거나 더 구체적으로 명확한 설정 방식이 도입되었을 수 있다.

8번과 9번 중에 보면, 정확한 datasource url, driver-class-name 을 작성하였기 때문에 Spring Boot 가 자동으로 감지할 수 있게 설정 작성이 제대로 되어있다. 그러니, spring.datasource.platform=h2 는 # 처리를 하겠다.

 

 

값을 맞춰서 작성을 하면 된다.

어떤 db 에 연결할 것인지, - jdbc:h2:~/test

db 에 연결하려면 jdbc driver 가 필요한데 그 driver 가 org.h2.Driver (pom.xml 에 이미 h2database 가 추가되어 있을 것!)

username 은 sa

password 는 원래 없으니까 그냥 비워놓으면 된다.

 

 

콘솔 활성화는 무엇인가

이게 h2 console 이다. spring.h2.console.enabled = 콘솔을 이용해서 접속하겠다. true 로 콘솔을 활성화시키는 것.

그 다음에, spring.h2.console.path = 이거는 console의 url 인건데, /h2-console 이라고 하면,

spring boot 에서 h2 database 와 연결이 되면은 그 h2 db 를 쓰기 위해서 url 을 spring boot 가 하나 만들게 된다.

/h2-console 에 해당하는 이름은 마음대로 해도 된다. 임의로 해도 된다.

그래서, 어떻게 콘설에 접속을 하게 되냐면,

(아까 h2 -> bin -> h2w 배치 파일을 더블 클릭해서 접속하는 건 stand alone 으로 실행할 때는 맞는데, spring boot 에서는 이걸로 콘솔을 실행하는게 아니고, spring boot 에서 세션, 커넥션을 만들어서 써야 되기 때문에

그 h2 db 에 접속할 수 있는 url 을 spring boot 가 하나 만들어주는데,

그게 http://localhost:8081/h2-console   이걸로 요청하게 되면, 저 url 주소가 콘솔을 띄우는 url 주소가 된다.

spring boot 가 h2 콘솔을 활성화시켜서 spring boot 에서 h2 console 에 접속하기 위해서 path 를 하나 만들어주면 된다.

그래서 

http://localhost:8081/h2-console

이 경로로 h2 db 를 접속하면 된다. 여기서 8081 은 tomcat port)  

 

H2 DB 에 대한 설정, H2 console에 대한 설정을 했고, JPA 설정을 해야 한다.

JPA 를 설정해야 hibernate 가 내부적으로 동작을 해서 Entity 클래스에 있는 Member.java 를 table 로 만들어야 한다.

 

spring.jpa.database-platform : 어떤 db 를 쓸건지, 우리가 접속하려고 하는 db 는 H2 이다.

 

spring.jpa.hibernate.ddl-auto : create 라고 하면, @Entity 어노테이션이 붙어있는 클래스, 여기서는 Member 클래스를 table로 자동으로 생성한다는 것.

 

spring.jpa.show-sql=true 는 만들어진 sql 쿼리문을 show, 보여달라는 뜻.

 

어쨌든, 이제,

repository 가 동작을 하려면, database에 연결이 되어야 한다.

 

extends JpaRepository<Member, Long>

여기에서 Member 자리에는 오브젝트의 이름, 테이블 이름,

그리고 Member의 PK 의 데이터타입을 그 옆에 적어주는 것. Long


자, 여기까지가, Controller (1 티어), Service (2 티어), Repository (3 티어) 까지 만들어서 이게 3-tier 구조라는 것.

나중에 DI, dependency Injection 으로 객체들끼리 서로 연결해가지고 사용하게 된다.

 

그럼, 이제 application.properties 에서,

H2 DB 설정에서, db 이름을 test 가 아니라 testdb 라고 해서, 새로운 db 파일이 생기는지까지 확인해보려고 한다.

자, 이제 main 으로 가서 run 을 해보자.

그러면 관련된 클래스들이 AutoConfiguration 에 의해서 메모리에 쫘악 올라갈 것이고 db 도 생성(create)이 될 것이다.

Member Entity 도 table 로 만들어질 것이다.

자세히 보면, hibernate 가 create table member 라고 한다.

그리고 나서 name, password, role, username 이라는 열이 있다는 걸 표현하고 있다.

그리고 id 가 PK 라는 것까지, 그리고 id 는 generated by default as identity 라고 되어있다.

 

그 다음에 h2 db 는 testdb.mv.db 라는 이름의 파일로 만들어진다고 했다.

파일 형식으로 db 가 만들어졌고, 저 db 안에 Member 라는 테이블이 만들어졌는지 접근을 하려면,

저 경로로 접근한다고 했다. 지금 run 을 한 상태이기 때문에,

서버가 구동 중이다.

spring boot는 내부에서 h2 서버에 접근할 수 있도록 홈페이지 url 로 접근할 수 있는 방법을 제공해주는 것.

저 주소를 요청하면 h2 db 에 접근할 수 있는 콘솔이 열린다.

열린 콘솔을 확인해보면, db 이름, jdbc url 에 test 라고 되어 있는데, testdb 로 들어가려면 testdb 로 바꿔주면 된다.

연결 시험을 해보면 시험 성공

연결을 해보면, Member 라는 table 이 만들어진 걸 확인할 수 있다.

ID, NAME, PASSWORD, ROLE, USERNAME

Member 라는 Entity 가 table 로 자동으로 만들어진 것이다.

어떻게?

create 라고 하면은, 서버가 실행될때마다 (run 될때마다) 다시 지우고 다시 만들고 하기 때문에,

한 번 만들어지고 난 다음에 새로 만들기 싫으면 update 로 바꿔놓아야 한다.

 

이제 다음 게시글에서, controller, service, repository 가 어떻게 연결이 되는건지 기록하려고 한다.