본문 바로가기

웹 프로그래밍/JPA

JPA 활용(1) 팁 정리


build.gradle 에

implementation 'org.springframework.boot:spring-boot-devtools'

추가시 리컴파일만 다시해주면 서버다시 띄울필요없이 새로고침 가능


처음 프로젝트를 만들때

 

Execution failed for task ':test'.

ctrl+alt+s를 눌러 settings에 들어가서

테스트구동을  Gradle -> intellij로 바꿔줘야 함


 

@Transactional 이 테스트에 있으면 롤백됨

롤백 안되게 하려면 @RollBack(false)

 


쿼리의 (?, ?)을 보고싶을때

일단 yml 파일을 수정 추적 가능

org.hibernate.type : trace

 

아예 (?, ?)를 속성으로 대체하고 싶을때(파라미터 바인딩): 개발중에 눈에 안보이면 답답함

gradle에 외부 라이브러리 추가

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

 

insert into member (username, id) values (?, ?)
insert into member (username, id) values ('memberA', 1)

 

이런식으로 나옴

참고) 개발용임 운영할때는 고려


JPA가 관리하는 엔티티에 대해서 

@Transactional이 붙으면

수정에 대해서 더티 체킹(변경 감지)을 하기 때문에 쿼리를 자동으로 날려줌


엔티티에 비지니스 로직을 몰아 넣고(객체 지향의 특성 활용) 서비스 게층은 단순히 요청하는 식으로 개발하는 방식을 도메인 모델패턴 이라함

 

반대로 서비스 계층에서 비지니스를 대부분 처리하는것을 트랜잭션 스크립트 패턴이라 함


변경 감지(dirty checking)와 병합(merge)의 차이

변경 감지: 영속성 컨텍스트의 업데이트 내용은 따로 update하지 않아도 트랜잭션 커밋시점에 자동으로 수정 쿼리 날라감

 

준영속 엔티티를 수정하는 2가지 방법

-1.변경 감지 기능 사용(@Transactional + 준영속 상태 엔티티를 파라미터로 받는 메서드) : 권장

-2.병합(merge) 사용 : 안쓰는것이 좋음

    -첫번째 방법을 한줄로 해주나 선택적으로 업데이트는 불가하고 모든필드를 채워줘야함 만약 없는 필드는 null로 채워짐 


엔티티 수정 꿀팁

 

-컨트롤러에서 어설프게 인티티 생성하지 말것

-트랜잭션이 있는 서비스 계층에 식별자(id)와 변경할 데이터 명확하게 전달(파라미터나 DTO)

-트랜잭션이 있는 서비스 계층(메서드)에서 영속 상태의 엔티티를 조회하고, 엔티티의 데이터를 직접변경

-트랜잭션 커밋 시점에 변경 감지 실행(dirty checking -> flush -> DB에 쿼리 날라감)

 


비지니스 로직은 서비스 계층에서 주로 처리하자

컨트롤러는 거들뿐


@ModelAttribute('orderSearch') -> Model에 자동으로 간다


 

'웹 프로그래밍 > JPA' 카테고리의 다른 글

스프링 데이터 JPA  (0) 2023.03.18
JPA 활용(2) 팁 정리  (0) 2023.03.16
객체 지향 쿼리 언어_중급  (0) 2023.03.08
객체 지향 쿼리 언어_기본  (0) 2023.03.07
기본값 타입, 임베디드 타입  (0) 2023.03.06