본문 바로가기

JPA16

JPA 영속성 컨텍스트는 어떻게 사용되는가 들어가기 예전에 JPA를 Spring Data JPA를 통해 다루면서 repository.save()를 할 시 반환 값으로 Primary Key 값이 포함된 객체를 반환하는 것에 의문이 생겼던 적이 있다. auto_increment 전략을 사용하기에 DB에 데이터가 들어간 이후에 Primary Key가 정해지기 때문이다. DB에 접근하기 전 영속성 컨텍스트에 데이터가 있으면 DB를 조회하지 않고 영속성 컨텍스트에서 데이터를 조회한다. 그리고 데이터를 저장 시 영속성 컨텍스트에 '쓰기 지연'이라는 기능 덕분에 INSERT 문을 모아두었다가 트랜잭션이 끝났을 때 한꺼번에 DB로 전송하도록 되어 있다. 그렇다면 repository.save()를 할 경우 inesrt 문은 트랜잭션이 끝났을 때 실행될 텐데 어떻.. 2024. 1. 14.
JPA 양방향 연관관계 일 때의 저장 및 연관관계 편의 메서드 연관관계를 일대다, 다대일로 데이터를 다루는 경우가 많다. 만약 한 엔티티에서만 일대다, 다대일을 설정하면 단방향 연관관계이고 두 엔티티 모두 다대일, 일대다 설정을 한다면 양방향 연관관계이다. 양방향 연관관계를 할 때 외래 키 설정이 제대로 안된 경우가 있을 수 있는데 아래의 간단한 예시 코드를 보며 살펴보자. @Entity class Member { ... @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; ... } @Entity class Team { ... @OneToMany(mappedBy = "team") private List members = new ArrayList(); ... } 위와 같이 Member 과 Team은 다대일 관계이며 .. 2021. 12. 14.
JPA column에 list를 넣는 방법(String 변환, @ElementCollection) 들어가기 Springboot와 JPA를 통해 프로젝트를 진행하던 중 간단한 값들의 리스트를 하나의 엔티티에 넣어두고 싶을 때가 있었다. 이는 '@OneToMany'를 통해서 새로운 테이블과 연관관계를 맺으면 쉽게 구현할 수 있지만... 새로운 테이블을 만들고 조인을 하는 등 복잡한 방법을 쓰고 싶지가 않았다. 오직 원하는 테이블만을 위한 리스트 필드를 가지고 싶은 것이다. 이럴 때 어떻게 사용할 수 있을까? 이 글에서는 간단하게 1. String으로의 변환 2. @ElementCollection 두가지 방법으로 소개하려고 한다. 본론 1. String 타입으로 변환 첫번째로 리스트를 Stirng 타입으로 변환하여 저장하는 것이다. 아래의 사진을 봐보자. 위는 특정 요청을 했을 때 응답 값을 JSON 형식.. 2021. 12. 11.
스프링부트 With JPA - mysql 연동 이 글에서는 간단하게 스프링 부트에서 mysql과 연동하는 방식을 봐보겠다. mysql은 https://dev.mysql.com/downloads/workbench/ MySQL :: Download MySQL Workbench Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Red Hat Enterprise Linux / Oracle Linux Fedora macOS Source Code Select OS Version: All Windows (x86, 64-bit) Recommended Download: Other Downloads: Windows (x86, 64-bit), M dev.mysql.com 에서.. 2021. 12. 6.
JPA - 읽기 전용으로 데이터를 조회하여 성능 향상(메모리, 속도) 들어가기 JPA를 사용하면서 영속성 컨텍스트를 통해 1차 캐시 및 쓰기 지연 등 여러 가지 이점을 얻을 수 있었다. 그런데 조회 기능만을 사용하는 상황에서는 단순히 읽기 전용 기능으로 데이터를 조회만 가능하게 하고 데이터의 수정을 불가능하게 할 수 있다고 한다. 이런 방식을 적용하면 두 가지 장점을 얻을 수 있다. 바로 메모리와 속도의 최적화이다. 메모리 사용량을 최적화하는 읽기 전용 기능과 속도를 최적화하는 읽기 전용 기능은 각각 다른 방식으로 구현된다. 이 글은 메모리와 속도를 최적화하기 위한 읽기 전용 기능에 대해 작성한 글이다. 영속성 컨텍스트에 대한 내용이 많이 나오는데, 이에 대한 것은 https://khdscor.tistory.com/110를 참고하길 바란다. 메모리 최적화 먼저 메모리 사용.. 2021. 9. 18.
JPA 2차 캐시 기본 개념 스프링 및 JPA 프로젝트를 진행하면서 데이터베이스에 접근해야 할 일은 많을 것이다. 하지만 일반적으로 데이터베이스에 접근할 때의 시간 비용은 애필리케이션 서버 내부 메모리에 접근하는 시간 비용보다 수만에서 수십만 배 이상 비싸다고 한다. 즉, 데이터베이스안에 있는 데이터를 캐싱하면 성능을 획기적으로 향상시킬 수 있다. 여기서 캐싱이란 운영체제를 공부하다보면 자주 보았을 단어일 것이다. 캐싱(Caching)은 캐시(Cache)라고 하는 더 빠른 메모리 영역으로 데이터를 가져와서 접근하는 방식을 말한다. 예를 들어 속도가 느린 하드디스크의 데이터를 메모리로 가지고 와서 메모리 상에서 작업을 수행하는 것을 '데이터를 메모리에 캐싱한다' 라고 한다. 그리고 메모리 상에 있는 데이터에 연산을 수행하기 위해 더 .. 2021. 9. 13.
JPA - 트랜잭션과 락 트랜잭션은 ACID라 하는 원자성, 일관성, 고립성, 지속성을 보장해야 한다. 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다. 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 고립성(격리성)(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않아야 한다. 지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템 에러가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구할 수 있어야 한다. 4가지 특징 중 고립성을 보장하기 위해 ANSI 표준은 트랜잭션 격리 수준을 4단계로 나눴다. 아래로 갈.. 2021. 9. 2.
JPA 두번 이상의 left join fetch가 필요할 때 해결 방법(MultipleBagFetchException 문제 해결) 프로젝트를 진행하면서 두개 이상의 OneToMany 리스트를 가진 객체에 대한 정보를 가져올 때 N+1 문제에 걸리지 않으면서 각각의 리스트들을 가져올 필요가 있었다. 만약 하나의 OneToMany 리스트만을 같이 다룬다면 left join fetch 를 적용하여 해결할 수 있다. 하지만 문제는 두 개의 리스트라는 점이다. left join fetch는 두 번 이상 사용할 수 없다.(OneToOne는 가능하다) 이는 잘못하면 카티젼 곱과 같은 형식으로 데이터가 전달될 위험이 있기 때문에 서버는 미리 MultipleBagFetchException 를 띄우며 에러처리를 한다. 그렇다면 이러한 상황에서 어떻게 해야할까? 이는 한번의 select – from where a=b절을 select – from whe.. 2021. 8. 23.
JPA 특정 엔티티 삭제시 연관된 엔티티도 함께 삭제하기 프로젝트에서 하나의 엔티티를 삭제했을 때 이 엔티티와 연관된 다른 엔티티는 어떻게 될까?? 정답은 그 엔티티의 외래 키로 연결된 엔티티에서는 부모 엔티티가 없기 때문에 데이터베이스에서 외래 키 무결성 예외가 발생한다. 예를 들어 User 엔티티와 Article 엔티티가 있다고 보자. User와 Article는 일대다의 관계를 가진다. User 하나에 여러 개의 Article가 있는 셈이다. 여기서 만약 User를 삭제한다면 삭제한 User에 연결된 Article에서는 에러가 발생하는 것이다. 다시 말해 연관관계가 끊어졌다고 할 수 있다. 이러한 상황에서 User와 연관관계가 끊어진 Article를 고아 객체라고 한다. 그렇기에 부모 엔티티를 삭제할 때는 연관된 자식 엔티티를 모두 삭제한 후에 부모 엔티티.. 2021. 8. 15.