스프링 부트에서 JPA로 데이터베이스를 다뤄보자(1) - JPA 실습_테스트코드

Wintering·2022년 6월 9일
0
post-custom-banner

프로젝트에 Spring Data Jpa 적용하기

1. build.gradle에 의존성 추가하기 ( JPA, H2 )

2. domain 패키지 생성

  • 도메인을 담을 패키지

    • 도메인이란, 게시글, 댓글, 회원, 정산 , 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역
    • 기존의 Mybatis와 같은 쿼리 매퍼를 사용한다면 dao패키지를 떠올리겠지만, dao 패키지와는 조금 결이 다름. xml에 쿼리를 담고, 클래스는 오로지 쿼리의 결과만 담던 일들이 모두 도메인 클래스라고 부르는 곳에서 해결됨

  • @Entity

    • 테이블과 링크될 클래스임을 나타냄
    • 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이브 이름을 매칭함.
    • ex) SalesManager.java > sales_manager table
  • @Id

    • 해당 테이블의 pk필드를 나타낸다.
  • @GeneratedValue

    • PK의 생성 규칙을 나타낸다.
    • 스프링부트 2.0에서는 GenerationType.IDENITITY 옵션을 추가해야만 auto_increment가 가능하다.
  • @Column

    • 테이블의 칼럼을 나타내며 굳이 선언하지 않아도, 해당 클래스의 필드는 모두 컬럼이 된다.
    • 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용
    • 문자열 기본 VARCHAR(255) - 사이즈를 늘리고 싶거나, 타입을 TEXT로 바꾸고 싶거나 할 때 사용
  • @NoArgsConstructor

    • 기본생성자 자동추가
    • public Posts()와 같은 효과
  • @Builder

    • 해당 클래스의 빌더 패턴 클래스를 생성
    • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
  • @Getter

    • 클래스 내 모든 필드의 Getter 메소드를 자동 생성

      Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다.
      해당 인스턴스의 값들이 언제 어디서 변해야하는지 setter메소드로는 명확히 구분할 수 없기 때문에 해당 필드의 값 변경이 필요하다면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만한다.

      ex. 주문 취소 메소드

      //잘못된 사용 예
      public class Order{
      	public void setStatus(boolean status){
          	this.status = status
          }
      }
      
      public void 주문서비스의_취소이벤트(){
      	order.setStatus(false);
      }
      /*-------------------------------------------*/
      //올바른 사용 예
      pubilc class Order{
      	public void cancelOrder(){
          	this.status = false;
          }
      }
      
      public void 주문서비스의_취소이벤트(){
      	oredr.cancleOrder();
      }
    • Setter가 없으면 어떻게 DB에 값을 삽입할 수 있을까?
      생성자를 통해 최종값을 채운 후 DB에 삽입
      값 변경이 필요한 경우, 해당 이벤트에 맞는 public 메소드를 호출하여 변경


3. domain패키지 안에 클래스로 DB에 접근을 가능하게 해줄 Repository를 생성

(MyBatis의 Dao)

  • DB Layer접근자로 단순히 인터페이스를 생성 후, JpaRepository<Entity클래스, PK타입>을 상속하면 기본적인 CRUD가 자동으로 생성됨.
  • @Repository 어노테이션 필요 x
    (단, Entity클래스와 Entity Repository는 함께 위치해야함)

Spring Data JPA 테스트 코드 작성하기

  • @After
    • Junit 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
    • 보통은 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해서 사용
    • 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있다.
  • @postRepository.save
    • 테이블 posts에 insert/save 쿼리를 실행.
    • id값이 있다면 update가 없다면, insert 쿼리가 실행
  • @postRepository.findAll
    • 테이블 posts에 있는 모든 데이터를 조회해오는 메소드

JPA에서 실제로 실행된 쿼리를 보고싶다면?

  • application.properties , application.yml등의 파일에 한 줄의 코드를 설정하면 볼 수 있음
    spring.jpa.show_sql=true
    추가하고 테스트코드를 돌리면 아래와 같이 쿼리를 확인 가능.

    create table 쿼리에 id bigint generated by default as identity 옵션. < H2 쿼리 문법
    출력되는 쿼리를 MySQL로 바꿔야 더 보기좋음
//application.properties에 추가
spring.jpa.properties.hibernate.dialect=org.hibernate.
dialect.MYSQL5InnoDBDialect

cf 참고
spring 2.1.10 버전 이후로는 더 복잡한 설정이 추가되어야 쿼리문을 MySQL로 바꿀 수 잇음

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.datasource.hikari.jdbc-url=jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL
post-custom-banner

0개의 댓글