이번 포스팅에서는 SpringBoot에서 실제로 JPA를 사용하기 위한 설정, 코드작성과 간단한 테스트를 실행해본다.

우선 build.gradle 하단에 dependencies에 위에 2줄을 추가한다.

의존성을 추가하였다면 Posts라는 도메인 클래스를 생성한다.

Posts 클래스의 내용은 위와 같다.
내용을 하나하나 살펴보자.
Posts클래스에는 Setter가 없다.
왜 Setter를 만들지 않고 Builder패턴을 사용하는 것일까?
첫 번째 Entity클래스에 Setter가 없는 이유는 해당 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 명확하게 구분할 수 없기 때문이다.
Setter를 사용하지 않는 대신 해당 필드의 값 변경이 필요한 경우 명확한 목적과 의도를 나타낼 수 있는 메소드를 추가해서 사용해야 한다.
올바른예시와 잘못된 예시를 들어보자.
public class Order {
public void setStatus(boolean status) {
this.status = status;
}
}
public void 주문서비스_취소이벤트() {
order.setStatus(false);
}
public class Order {
public void cancelOrder() {
this.status = false;
}
}
public void 주문서비스_취소이벤트() {
order.cancelOder();
}
이 부분을 읽으면서 개인적으로 책을 구매하기 잘했다는 생각을 했다.
잘못된 예시는 너무나도 흔히 사용하는 코드이기 때문이다.
사실 두 가지를 비교하기 전에는 잘못된 예시가 뭐가 문제지? 라는 생각이었다.
하지만 목적과 의도를 명확하게 나타내는 메소드를 만들어서 사용하는것이 얼마나 코드를 읽기 편하개 만들어주는지 알 수 있었다.
두 번째 Builder패턴을 사용하는 이유 역시 명확성을 위해서다.
Builder패턴을 사용하면 어떤 필드에 어떤 값을 넣는지 명확하게 알 수 있지만 생성자를 사용할 경우에는 어떤 필드에 어떤 값을 넣는지 명확하게 알 수 없다.
생성자를 이용하는 방법과 Builder패턴을 사용하는 경우를 비교하는 예제는 작성하지 않는다.

JpaRepository는 Entity클래스로 Database를 접근하게 해준다.
MyBatis를 사용할 때 만드는 Dao라고 얘기하는 DB Layer 접근자와 매핑되는 개념이다.

JPA는 Interface로 생성하며 JpaRepository<Entity 클래스, PK 타입>를 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.
@Repository를 별도로 추가하지 않아도 된다.
여기서 주의점은 Entity클래스와 JpaRepository는 같은 곳에 위치 해야한다는 것이다.
둘은 아주 밀접한 관계이며 Repository없이는 Entity클래스는 제 역할을 할 수 없기 때문이다.
그래서 이 둘은 Domain패키지에서 함께 관리한다.
여기까지 JPA를 사용하기 위해 의존성을 추가하고, Entity클래스와 JpaRepository를 생성하였다.
의존성 추가시에 함께 추가한 H2 데이터베이스를 이용하여 잘 동작하는지 테스트 해보자.

save와 findAll기능을 테스트 하는 코드다.
Junit 사용방법은 이전 포스팅을 참고하면 된다.
별다른 설정없이 @SpringBootTest를 사용하면 H2 데이터베이스를 자동으로 실행해 준다.
여기서는 처음 사용해보는 어노테이션과 Jpa의 메소드에 대해서만 간략히 설명한다.
SELECT * FROM POSTS와 동일하다.만약 실제로 수행되는 쿼리가 궁금하다면 application.properties에 간단한 설정을 추가하면 된다.
spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
첫 번째 설정은 실행된 쿼리문을 콘솔에 보여준다는 설정이다.
두 번째 설정은 쿼리문을 MySQL문법으로 보겠다는 설정이다.
두 번째 설정을 하지 않으면 H2 데이터베이스 문법이 적용되기 때문에 우리가 기대한 쿼리와 다른 결과가 나올 수 있으니 두 가지 설정 모두 적용하자.