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 정리
- H2 Database 설치 및 사용
- H2 Database는 관계형 DBMS로서 데이터를 테이블(Relation) 단위로 저장합니다.
- 관계형 데이터베이스의 특징상, 데이터를 정형화된 구조로 관리합니다.
- 테이블 생성 방식
- DBMS에 직접 테이블을 생성하는 대신, **JPA(Java Persistence API)**를 사용하여 객체 지향 프로그래밍과 데이터베이스의 관계형 모델을 연결합니다.
- JPA와 ORM Mapping
- JPA는 Entity 객체(예: Member.java)와 데이터베이스 테이블 간의 **ORM(Object Relational Mapping)**을 지원합니다.
- ORM은 **Java 객체(Object)**를 데이터베이스의 **테이블(Relational)**로 매핑하여 자동으로 테이블을 생성하고 관리하는 기능입니다.
- Spring Data JPA는 ORM의 구현체인 Hibernate를 사용하여, 객체와 테이블 간의 매핑을 처리합니다.
- Object와 Relational 매핑
- Java의 객체(예: Member 클래스)와 관계형 데이터베이스의 테이블(예: member 테이블)은 다음과 같이 매핑됩니다:
- 객체 필드 → 테이블 컬럼
- 객체 인스턴스 → 테이블 행(Row)
- 관계형 데이터베이스에서는 테이블을 Relational이라고도 합니다.
- Java의 객체(예: Member 클래스)와 관계형 데이터베이스의 테이블(예: member 테이블)은 다음과 같이 매핑됩니다:
- 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의 주요 역할
- 객체와 관계형 데이터베이스 매핑 (ORM)
- Java의 객체(클래스)를 관계형 데이터베이스의 테이블과 매핑합니다.
- 매핑된 객체를 통해 데이터베이스 작업(저장, 조회, 수정, 삭제)을 수행할 수 있습니다.
- SQL 대신 HQL 사용 가능
- Hibernate는 SQL 대신 **HQL(Hibernate Query Language)**을 사용해 객체 지향적인 방식으로 데이터를 조회하거나 조작할 수 있습니다.
- HQL은 데이터베이스에 독립적이므로, 특정 DBMS에 종속되지 않도록 설계되었습니다.
- JPA 구현체
- Hibernate는 JPA 표준을 구현하며, JPA를 사용할 때 기본적으로 Hibernate를 사용하는 경우가 많습니다.
- JPA 인터페이스와 함께 작동해 개발자가 더 적은 코드를 작성하면서도 강력한 데이터베이스 기능을 사용할 수 있게 합니다.
- 자동 테이블 생성 및 데이터 관리
- Hibernate는 애플리케이션 시작 시, JPA 어노테이션을 분석하여 자동으로 테이블을 생성하거나 데이터베이스 스키마를 관리합니다.
Hibernate의 주요 특징
- POJO (Plain Old Java Object) 기반
- 기존의 Java 클래스를 그대로 사용해 데이터베이스 테이블과 매핑할 수 있습니다.
- 데이터베이스 독립성
- Hibernate는 다양한 DBMS를 지원하며, 특정 데이터베이스에 종속되지 않는 코드를 작성할 수 있습니다.
- 자동 데이터베이스 작업
- 데이터를 저장, 수정, 삭제하는 SQL 코드를 직접 작성하지 않아도, Hibernate가 이를 자동으로 처리합니다.
- 캐싱 지원
- Hibernate는 1차 캐시(기본적으로 세션 단위)와 2차 캐시(애플리케이션 단위)를 지원해 성능을 최적화합니다.
- 관계 매핑
- 객체 간의 연관 관계(1:1, 1:N, N:M)를 데이터베이스의 테이블 관계와 매핑합니다.
Hibernate를 사용하는 이유
- 생산성 향상
- SQL을 직접 작성하는 부담을 줄여주고, 데이터베이스 작업을 객체 중심으로 처리할 수 있습니다.
- 유지보수 용이
- 테이블 이름이나 컬럼 이름이 변경되더라도 Java 클래스에서 어노테이션만 수정하면 되므로 코드 변경이 간단합니다.
- 데이터베이스 변경에 유연
- 애플리케이션이 특정 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의 장단점
장점:
- SQL을 직접 작성하지 않아도 되므로 생산성 향상.
- 데이터베이스 변경 시에도 코드 수정 최소화.
- 다양한 관계형 데이터베이스와 호환 가능.
- 객체 지향적인 데이터베이스 설계를 쉽게 지원.
단점:
- 초기 설정이 복잡할 수 있음.
- 대규모 프로젝트에서 성능 조정을 잘못하면 느려질 가능성.
- 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 Database와 Hibernate는 독립적인 기술입니다.
- 다만, 둘 다 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."
(일부 동물은 혹독한 기후를 견디기 위해 동면한다.)
- "Bears hibernate during the winter."
2. 컴퓨터 과학에서 Hibernate의 쓰임
컴퓨터 과학에서 Hibernate는 동면의 개념을 빌려온 것으로, 보통 시스템이나 상태를 보존하면서 일시적으로 중단하는 것을 의미합니다.
- 운영체제에서의 Hibernate
- 뜻: "컴퓨터의 절전 모드(하이버네이트 모드)"
- 컴퓨터가 실행 중인 상태를 하드 드라이브에 저장하고, 완전히 종료된 것처럼 전원을 끈 뒤 나중에 다시 부팅했을 때 작업 상태를 복원합니다.
- 예문:
- "The laptop went into hibernate mode to save energy."
(노트북이 전력을 절약하기 위해 하이버네이트 모드로 전환되었다.)
- "The laptop went into hibernate mode to save energy."
- 프로그래밍에서 Hibernate
- Hibernate 프레임워크의 이름은 "데이터를 영속적으로 저장(Persistence)"한다는 개념과 연결됩니다.
- 객체 지향 프로그래밍에서, Hibernate는 객체를 데이터베이스에 저장하고 필요할 때 다시 불러올 수 있는 '상태 보존'을 의미합니다.
- 즉, Hibernate는 "데이터베이스 상태를 보존하고 재사용한다"는 점에서 동면(hibernate)의 의미를 빌려온 것입니다.
Hibernate 프레임워크 이름의 유래와 비유적 의미
Hibernate라는 이름은 동면과 데이터 상태 보존의 유사성에서 유래된 것으로 보입니다:
- 동물의 동면: 에너지를 절약하고 필요할 때 다시 활동 상태로 복귀.
- Hibernate 프레임워크: 데이터 객체를 영구 저장소에 보관하고 필요할 때 다시 객체로 복원.
요약
- Hibernate의 기본 뜻: "동면하다" (겨울잠을 자다).
- 컴퓨터에서의 쓰임: 절전 모드 또는 데이터 상태를 저장하고 복원하는 개념.
- 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을 사용하면 코드의 가독성을 높이고 유지보수를 간소화할 수 있습니다.
주요 특징 및 기능
- 어노테이션 기반 코드 자동 생성
- Lombok은 다양한 어노테이션을 제공하여 반복적인 코드를 자동으로 생성합니다.
- 코드량을 줄이고, 클래스가 더 간결하고 읽기 쉽게 만들어줍니다.
- 컴파일 시 코드 생성
- Lombok은 컴파일 단계에서 코드에 접근하여 필요한 메서드를 자동으로 추가합니다.
- IDE(예: IntelliJ, Eclipse)와 통합되어 편리하게 사용할 수 있습니다.
Lombok의 주요 어노테이션
@Getter/Setter
- 클래스 필드에 대한 Getter와 Setter 메서드를 자동 생성.
@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) 클래스에 유용합니다.
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의 장단점
장점:
- 코드 간소화: 반복적인 Getter/Setter, 생성자 등의 코드 작성 불필요.
- 가독성 향상: 클래스의 핵심 로직에 집중 가능.
- 생산성 향상: 개발 속도 증가 및 유지보수 간소화.
단점:
- 학습 곡선: Lombok 어노테이션을 처음 사용하는 개발자에게는 낯설 수 있음.
- 의존성 증가: 코드가 Lombok에 종속될 수 있음.
- 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 가 어떻게 연결이 되는건지 기록하려고 한다.