본문 바로가기

JPA18

JPA를 활용한 연관관계 데이터 저장: getReferenceById()를 쓰는 이유 왜 findById() 대신 getReferenceById()를 쓰는가 Spring boot와 JPA를 통해 프로젝트를 진행하는 중, Banner 엔티티와 Comment 엔티티, Member 엔티티가 있고 Comment 엔티티가 Banner, Member 엔티티와 다대일 관계를 맺고 있다고 하자.  Comment를 저장하기 위해서는 Banner, Member 엔티티를 가져와야 한다. @Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class BannerComment {    @Id    @Column(name="banner_comment_id")    @GeneratedValue(strategy = GenerationType... 2024. 7. 29.
JPA 영속성 컨텍스트는 어떻게 사용되는가 들어가기 예전에 JPA를 Spring Data JPA를 통해 다루면서 repository.save()를 할 시 반환 값으로 Primary Key 값이 포함된 객체를 반환하는 것에 의문이 생겼던 적이 있다. auto_increment 전략을 사용하기에 DB에 데이터가 들어간 이후에 Primary Key가 정해지기 때문이다. DB에 접근하기 전 영속성 컨텍스트에 데이터가 있으면 DB를 조회하지 않고 영속성 컨텍스트에서 데이터를 조회한다. 그리고 데이터를 저장 시 영속성 컨텍스트에 '쓰기 지연'이라는 기능 덕분에 INSERT 문을 모아두었다가 트랜잭션이 끝났을 때 한꺼번에 DB로 전송하도록 되어 있다. 그렇다면 repository.save()를 할 경우 inesrt 문은 트랜잭션이 끝났을 때 실행될 텐데 어떻.. 2024. 1. 14.
QueryDsl를 사용해보자.(With Spring boot 3.x.x, JPA) 들어가기 이 글은 Spring boot(3.0 이상), JPA에 QueryDSL을 사용하면서 새로 적용해 봤던 내용들을 정리한 것이다. 목차는 아래와 같다.1. QueryDSL은 무엇이며 왜 사용하는가?2. Spring boot에서 QueryDSL을 사용하기 위한 설정(Java 17, Spring boot 3.x.x를 기준)3. Spring Data JPA와 같이 사용하는 법4. DTO 객체로 값을 받는 법  본론1. QueryDSL은 무엇이며 왜 사용하는가? JPA를 사용할 때, 편의성을 위해 Spring Data JPA를 종종 사용하였다. 하지만 복잡한 쿼리를 작성해야 할 때면 @Query 어노테이션을 통해 JPQL을 직접 작성하곤 하였다. 로직이 복잡할수록 쿼리 문자열은 길어지며 가독성은 떨어진다... 2023. 11. 29.
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.