728x90

JPA 48

(로그 관련) p6spy 설정 방법

1. p6spy란? p6spy란 쿼리 파라미터를 로그에 남겨주고 추가적인 기능을 제공하는 외부 라이브러리입니다. 사실 이 외부 라이브러리 없이도 application.yml에 다음과 같은 설정을 통해 쿼리 파라미터의 값들을 찍을 수 있습니다. # application.yml logging: level: org.hibernate.SQL: debug org.hibernate.type: trace # for native query org.springframework.jdbc.core.JdbcTemplate: DEBUG org.springframework.jdbc.core.StatementCreatorUtils: TRACE 이렇게 값을 찍게 될 경우 아래 그림과 같이 ?가 찍히고 그 아래 실제 들어간 파라미터 ..

JPA 2023.06.22

Entity Manager Factory와 persist, flush, commit

Entity Manager Factory와 persist, flush, commit 연관 관계 학교에서 한 명의 학생이 하나의 반에 속해있는 상황을 가정해보자. class Student { int studentId; String name; Class clazz; } class Class { int classId; String className; Teacher teacher; } OOP 에서는 학생에 대한 객체가 반에 대한 객체를 포함한다. 정확히는 참조를 가지고 있다. 반면, RDB 에서는 참조를 가지는 것이 아니라 반에 대한 참조를 FK 로 대체하고, 반에 대한 데이터를 분리하여 따로 저장해야한다. 즉, 데이터 저장 시에 데이터를 분리하여 2개의 쿼리를 사용해야 하며, 다시 읽을 때는 조인을 통한 재조..

JPA 2023.03.06

영속성 전이(CASCADE)에 관해

영속성 전이 : CASCADE 특정 엔티티를 영속 상태로 만들때 연관된 엔티티도 함께 영속 상태로 만들고 싶을때 사용합니다. eg. 부모 엔티티 저장시 자식 엔티티도 저장하게끔. 언제 쓰느냐? 하나의 부모가 자식들을 관리할 때 ( 단일 엔티티에 종속적인 경우) 라이프사이클이 같을때, 단일 소유자 쓰면 안되는 케이스? 자식의 연관 관계가 2개 이상일때 예를 들어 다음과 같은 경우에는 쓰면 안된다. 그림처럼 C 라는 엔티티가 A, B 에 의해서 관리된다고 하자. 이런 경우에서는 영속성 전이를 사용해서는 안된다. 참고 CASCADE 의 옵션은 ALL, PERSIST, REMOVE, MERGE, REFRESH, DETACH 가 있지만 주로 사용되는건 ALL, PERSIST, REMOVE 정도이고 실무에서 사용되..

JPA 2022.10.06

SpringBoot JPA Multiple Databases 설정

1. 다중 DB 설정 시, 알아야 할 것 다중 DB설정은 Auto Configuration 되지 않기 때문에 설정파일(application.yml or application.properties) 값을 읽어와서 연동 할 DB 수 만큼 Datasource를 수동 설정해야함 주요 설정 내용 리소스 경로 설정 Repository basePackages 경로 설정 Entity 경로 설정 DB 정보 설정(Datasource) driver 이름 URL Id/Password Hibernate 설정 ddl-auto dialect 설정된 다중 DB는 Repository package 명으로 구분 초기 설정이 복잡한 편이나, 천천히 살펴보면 크게 어렵지 않음 2. 소스코드 이 글에서는 1개의 Entity로 2개의 Datab..

JPA 2022.10.02

Java8 Optional 의 ifPresent 활용

자바 8에 추가된 Optional이 제공하는 ifPresent를 사용해서 null을 확인하는 if 문을 줄일 수 있다. Member member = memberRepository.findById(id); if (member != null) { if (member.isAdmin()) { member.addAdminPermissions(); } else { member.addDefaultPermissions(); } } 이런 코드가 있다고 가정해보자. memberRepository가 제공하는 findById를 Member 타입을 리턴하는데 이 값을 null일 수도 있기 때문에 if (member != null)과 같은 코드가 존재한다. 이 코드에 이제 Optional을 적용한 다음코드를 살펴보자. Membe..

JPA 2022.09.01

@Transactional(rollbackFor = Exception.class) 에 대해

1. 서론 초반 @Transactional 어노테이션에 대해 자세히 알아보지 않고, 막연히 롤백때 사용한다고 하여 SQL C,U,D 를 할 때마다 메소드 위에 붙여서 사용하곤 하였다. 하지만, 내 코드를 보신 선임께서 단지 @Transactional 만 붙이면 롤백이 안되고, @Transactional(rollbackFor = Exception.class) 을 붙여야 된다고 알려주셨다. 여기에서 뭐 때문인지에 대해 호기심에 트랜잭션에 대해 찾아보다가 내가 생각했던 것 보다 더 많은 기능들이 존재한다는 것을 알고 정리해보려 한다. 2. 트랜잭션이 뭐지? 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미한다. begin, commit 을 자동으로 수행해준다. 예외 발생 시 rol..

JPA 2022.08.26

(Spring Data JPA)리스트에서 첫번째 값만 가져오기

최근 개발하면서 가장 상위에 있는 한개의 로우의 id 값을 id순으로 역순으로 정렬한뒤 가져오는 쿼리를 짜서 작업을 하려고 다음과 같이 쿼리문을 작성해서 JPQL을 사용하려고 했는데, 오류가 발생했다. -- mariaDB 기준 select id from table order by id desc limit 1; 찾아보니 JPQL은 limit 명령어를 지원하지 않는다고 해서, 구글을 좀 뒤져보니 쉽게 해결방법을 찾을 수 있었다. Spring JPA에서도 결과를 제한하는 기능을 제공하고 있었고, 나의 경우는 다음 문서를 참고했다. (Spring JPA Doc) Spring Data JPA - Reference Documentation Example 108. Using @Transactional at query..

JPA 2022.08.24

페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법

@GetMapping("/api/v3.1/orders") public List ordersV3.1() { // ORDER 2개 // N + 1 -> 1 + 회원 N + 배송 N List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus or..

JPA 2022.07.14

JPA 낙관적 락(부제 - OPTIMISTIC)

OPTIMISTIC @Version만 적용했을 때는 엔티티를 수정해야 버전을 체크하지만 이 옵션을 추가하면 엔티티를 조회만 해도 버전을 체크한다. 한 번 조회한 엔티티는 트랜잭션을 종료할 때까지 다른 트랜잭션에서 변경되지 않음을 보장한다. 용도 : 조회 시점부터 트랜잭션이 끝날 때까지 조회한 엔티티가 변경되지 않음을 보장한다. 동작 : 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다(SELECT 쿼리 사용). 만약 같지 않으면 예외가 발생한다. 이점 : OPTIMISTIC 옵션은 DIRTY READ와 NON-REPEATABLE READ를 방지한다. DIRTY READ : 커밋되지 않은 데이터를 읽을 수 있다. 예를 등러 트랜잭션1이 데이터를 수정하고 있는데 커밋하지 않아도..

JPA 2022.06.22
728x90