코드로 배우는 스프링부트 웹플젝_구코단(1)

네코·2022년 7월 19일
0

JpaRepository

insert, update 모두 jpa repository에선 save()로 처리
내부적으로 jpa는 엔티티 객체들을 메모리상에 보관하려고 하기 때문에 특정 엔티티 객체의 존재를 확인하고자 select해서 있다면 update, 없다면 insert 실행된다.

  • findById()는 호출 시점에 쿼리 나가지만 getOne()은 해당 객체가 필요한 시점에 쿼리가 나간다.
    또한 getOne()은 @Transactional 필수

페이징 처리, 정렬

  • JPA 내부적으로 Dialect를 이용해서 처리한다.
  • findAll()의 파라미터로 전달되는 Pageable 타입의 객체에 의해 실행 쿼리를 결정.
  • 실제 구현체는 PageRequest.of()의 형태로 생성

쿼리메서드,@Query

  • 쿼리 메서드: 메서드 이름 자체가 쿼리의 구문으로 처리되는 기능
  • @Query: sql과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
  • QueryDsl 등의 동적 쿼리 지원

날짜/시간 자동 처리

앤티티 객체의 등록, 최종 수정 시간을 담당하는 BaseEntity클래스를 추상 클래스로 작성

  • @MappedSuperClass : 해당 애노테이션이 붙으면 테이블로 생성되지 않음
  • jpa 내부에서 엔티티 객체가 생성/변경되는 것을 감지하는 역할은 AuditingEntityListner로 이루어진다.

Querydsl

여러 상황에 맞게(검색조건,조인,서브쿼리 등) 동적으로 쿼리를 생성할 수 있게한다.
=> 이를 위해 엔티티 클래스를 사용하는 것이 아닌 Q도메인을 이용해야한다.
Q도메인 작성에 Querydsl 라이브러리를 이용해 엔티티 클래스를 Q도메인 클래스로 변환하는 방식

  • entity class는 가능하면 setter 구현 x
    jpa를 관리하는 쪽이 복잡해질 우려가 있기 때문이다.

--추가예정--
queryDsl관련
향로님 queryDsl

서비스 계층, DTO

DTO: 레이어간 데이터 전달이 목적, 읽고 쓰기 허용 일회성을 성격이 강함
장점

  • 엔티티 객체의 범위를 한정해 안정성 확보
  • 화면, 데이터 분리의 취지에도 부합
    단점
  • 엔티티와 유사한 코드를 중복 작성
  • 변환 과정이 필요

dtoToEntity
EntityToDto
와 같이 변환하는 메서드를 어느 layer에 구현해야하는가 ?
책에서는 '앞서 작성된 코드를 변경하지 않기 위해서 service layer의 interface에 default 키워드로 구현'했다
객체 스스로가 책임을 갖는 것이 맞다고 생각했기 때문에 나는 각각의 클래스에 작성했다.
조회 서비스에서만 requestDTO,responseDTO가사용되기 때문에 책에선 해당 위치에 구현한 것 같다.
dto layer 위치_영한님 답변

0개의 댓글