Spring JPA - SpringDataJPA

김재현·2022년 8월 8일
0

Programmers

목록 보기
16/28
post-custom-banner

4일차

  • 스프링데이터 JPA
    • 스프링데이터 JPA에 대해 소개.
    • Native Query (QueryDSL)

SPRING DATA JPA

  • 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트.
  • 데이터 소스 및 엩티 매니저 트랜잭션 매니저 설정을 자동으로 해준다.
spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/order;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password:

  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate.format_sql: true
  • 데이터 저장계층에 대한 인터페이스를 지원해서, CRUD 작업을 편하게 할 수 있다.
import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderRepository extends JpaRepository<Order, String> {
}

CRUD

  • 인터페이스 Repository를 만들면 기본적으로 제공되는 메서드들이 있음.
    findById() findAll() existsById() 등.
  • 메서드 이름으로 호출을 하게 되면 셀렉트쿼리에서
    • findById()where order_id가 생성,
    • findAll()select from orders(전체조회)
    • existsById()count()로 있는지 없는지 판단해줌.
@Test
void JPA_query() {
    Order order = orderRepository.findById(uuid).get(); // SELECT * FROM orders WHERE id = ?
    List<Order> all = orderRepository.findAll(); // SELECT * FROM orders
    orderRepository.existsById(uuid);
}

// 실행결과
Hibernate: select order0_.id as id1_3_0_, order0_.member_id as member_i5_3_0_, order0_.memo as memo2_3_0_, order0_.order_datetime as order_da3_3_0_, order0_.order_status as order_st4_3_0_ from orders order0_ where order0_.id=?
Hibernate: select order0_.id as id1_3_, order0_.member_id as member_i5_3_, order0_.memo as memo2_3_, order0_.order_datetime as order_da3_3_, order0_.order_status as order_st4_3_ from orders order0_
Hibernate: select count(*) as col_0_0_ from orders order0_ where order0_.id=?
  • 인터페이스에 JpaRepository 구현체를 붙임으로써 쿼리를 직접 작성하지 않고, 이미 구현된 것을 가져다 사용할 수 있다.
    오직 객체, 엔티티에만 집중할 수 있다.

메소드 쿼리

공식문서

  • Keyword를 이용해서 쿼리를 만들 수 있다.

커스텀 쿼리

  • @Query를 붙이면 네이티브 쿼리도 사용할 수 있다.
    작업을 편리하게해주고, 복잡한 쿼리도 쉽게 쓸 수 있다. JPQL

QueryDSL

QueryDSL

  • 빌드 패턴을 이용해서 객체의 체이닝 방식으로 쿼리를 짤 수 있게된다.
    네이티브 쿼리를 짤 때 많이 사용하는 툴이다.

SPRING DATA JPA를 이용하면 쿼리를 짜는데 쓰이는 시간을 확 줄이고 어플리케이션 코드, 객체의 매핑과 엔티티의 활용 등 객체 개발과 설계에 많은 시간을 쓸 수 있다. 쿼리 지향 개발이 아닌 객체 지향 개발이 가능하게 해준다.

REST API

목표

  • REST API 웹 어플리케이션 개발
    • 엔티티 (주문관리vs게시판)
    • API 개발 (JUnit, Lombok, OSIV)
    • API 문서화 (레스트닥스, 스웨거)

주문관리 API 개발

  • 주문 생성 (POST)
  • spring-restdocs-mockmvc dependency추가
    문서화를 하기 위해 restdocs를 사용하기 위한 부분.
  • @Transactional 메서드가 실행될 때 트랜잭션을 실행해주고, 끝날 때 트랜잭션을 커밋해주는 일련의 과정을 대신 수행해 줌.
  • convertOrder dto를 entity로 바꿔줌. 일반 객체를 준영속 상태의 객체로 만들기 위해서 사용
  • Entity는 RDB와 통신을 하는 객체이기 때문에 트랜잭션을 관리하지 않는 범위까지 빠져나가게 되면 예상치 못한 부분에서 쿼리가 생길 수 있다. 때문에 엔티티가 관리되는 부분은 레이어로 묶어두고, 그 외의 부분에서는 Dto객체를 만들어서 통신하는 것이 좋다.
  • 원치 않은 곳에서의 엔티티의 조작을 방지할 수 있도록 하자.
  • DTO(Data Transfer Object)란 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)이다.

주문 API 조회

  • 주문 조회 (GET)
    • 리스트 (PAGING)
    • 단건 (ONE)
  • BDD(Behavior Driven Development) : 행동중심개발.
    Given, When, Then = 무엇이 주어졌을 때, 이것을 할 것이고, 그러면 결과가 ~게 나올 것이다.
  • pageable을 사용해서 페이지 쿼리를 쉽게 날릴 수 있다.

주문 API 컨트롤러

TDD와 BDD

TDD (Test Driven Development)

  • 테스트 주도 개발.
    테스트를 먼저 작성하고, 테스트가 정상적으로 돌아갈 때까지 하면서 코드를 작성한다. 원하는 작업이 제대로 돌아갈 때까지 테스트와 코드 작성을 무한대로 반복하며 개발하자.

종류

  • 단위(Unit) 테스트
  • 통합(Integation) 테스트
  • E2E(End to End) 테스트
  • 회귀(Regression) 테스트
  • 성능(Performance) 테스트

장점

  • 테스트가 가능한 코드를 만든다 > 테스트하기 쉽게 만들어진 코드를 만드려 노력한다.
    이렇게 개발하다보면, 각 모듈의 역할이 단순해지고 명확해진다. 모듈의 크기를 줄일 수 있게되고 모듈과 계층 간의 커플링을 적게 만들며, 결국 프로젝트의 유지보수와 확장이 쉬워진다.
  • 각 모듈의 역할이 단순해지고 명확해짐.
  • 프로젝트의 유지보수와 확장이 용이.
  • 수동 테스트에서 시간 단축.
  • 놓칠 수 있는 것들을 반복테스트하기 좋음.
  • 프로젝트 품질을 높이고, 효율적인 테스트 경험과 사용자 입장을 고려한 개발을 진행할 수 있게 해줌.
  • 실제 사용자의 실행 환경화 거의 동일한 환경에서 테스트를 진행하기 때문에, 실제 상황에서 발생할 수 있는 에러를 사전 발견할 수 있음.

BDD (Behavior Driven Development) === 잘 짠 TDD

  • 행동 주도 개발.
    사용자의 행동까지 생각하고 테스트하며 개발한다. 프론트엔드에서 조금 더 장점이 두드러지는 경향이 있다.
  • 이미 작성된 요구사항이나 기획서 등이 있고 그에 맞춰 테스트 케이스를 작성하게 된다면, 비용과 시간을 절약할 수 있음.

두개를 섞어 사용하는 것이 가장 좋은 테스트 방법

post-custom-banner

0개의 댓글