이번 포스팅에서는 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 데이터베이스 문법이 적용되기 때문에 우리가 기대한 쿼리와 다른 결과가 나올 수 있으니 두 가지 설정 모두 적용하자.