공부/스프링부트와 AWS로 혼자 구현하는 웹 서비스

[웹서비스-02] Spring Data JPA, H2 설정

줭♪(´▽`) 2021. 9. 3. 00:13

1. 데이터베이스와 JAVA

1) ORM(Object Relational Mapping)

- 객체를 데이터베이스와 매핑하는 것

( MyBatis, iBatis는 ORM이 아닌 SQL Mapper임에 주의 -> 쿼리를 매핑하기 때문 )

 

2) JPA(Java Persistence API)

- Java ORM에 대한 표준명세, Java에서 제공하는 API

- 서로 지향하는 바가 다른 2개 영역(객체지향 프로그래밍 언어 & 관계형 데이터베이스)의 중간에서 패러다임 일치를 시켜주기 위한 기술

- 개발자 : 객체지향적 프로그래밍

  JPA : 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행

 

3) Spring Data JPA

- JPA는 인터페이스이므로 구현체가 필요 (Hibernate, Eclipse Link 등)

- Spring에서 JPA를 다룰 때는 Spring Data JPA 모듈을 이용 (구현체와 저장소 교체의 용이성을 위해)

    JPA <- Hibernate <- Spring Data JPA

 

 

2. 프로젝트에 Spring Data JPA 적용

1) build.gradle에 의존성 등록

    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('com.h2database:h2')

 

- spring-boot-starter-data-jpa : 스프링 부트용 Spring Data JPA 추상화 라이브러리 (자동으로 버전 관리)

- H2 : 인메모리 관계형 DB, 메모리에서 실행되기 때문에 테스트에 주로 사용

 

2) domain/posts/Posts.java

- @Entity : 테이블과 링크될 클래스임을 명시

- @Id : 해당 테이블의 PK 필드

- @GeneratedValue : PK 생성 규칙

- @Column : 테이블의 컬럼, 굳이 선언하지 않아도 해당 클래스의 필드는 모두 컬럼이 됨

- @NoArgsConstructor : 기본 생성자 자동 추가

- @Builder : 해당 클래스의 빌더 패턴 클래스를 생성

 

※ Entity 클래스에는 절대 Setter 메소드를 만들지 않음

※ 대신 Builder를 사용하여 필드와 값을 명확하게 넣을 수 있음

 

3) domain/posts/PostsRepository.interface

- Dao처럼 DB Layer에 접근하는 JPA의 Repository

- 인터페이스 생성 후 JpaRepository<Entity 클래스, PK타입>을 상속하면 CRUD 메서드 자동 생성

- @Repository 추가 필요 없음

- 하지만 Entity 클래스와 기본 Entity Repository는 함께 위치해야 함

 

4) (test) domain/posts/PostsRepositoryTest.java

- @After : Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정

- postRespository.save : 테이블에 insert/update 쿼리 실행

- postsRepository.findAll : 테이블의 모든 데이터를 조회해오는 메소드

-@SpringBootTest : H2 데이터베이스를 자동으로 실행

 

 

5) resources/application.properties

 

// 실제 쿼리 show
spring.jpa.show_sql = true

// 출력 쿼리 로그에 H2의 문법 대신 MySQL의 문법 적용
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

 

 

 

JPA와 H2에 대한 기본 설정까지 완료하였다.

다음 글에서는 실제 게시판 구현 예정!

 

 

 

참고 - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (저자 : 이동욱, 출판 : 프리렉)