[웹서비스-02] Spring Data JPA, H2 설정
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로 혼자 구현하는 웹 서비스 (저자 : 이동욱, 출판 : 프리렉)