JPA 8

[JPA] 변경 감지와 병합

준영속 엔티티 변경 감지와 병합을 이해하기 위해서는 준영속 엔티티를 이해해야 합니다. 준영속 엔티티란 영속 상태였다가 영속 상태를 벗어난 엔티티를 의미합니다. 그래서 JPA가 더이상 관리하지 않는 것을 의미합니다. JPA가 관리하는 엔티티인 영속 엔티티는 JPA가 엔티티의 변경분을 자동 감지하여 하나의 트랜잭션이 종료될 때 자동으로 변경분을 DB에 반영해줍니다. 하지만 준영속 상태는 그러한 관리를 받을 수 없기 때문에 이러한 준영속 상태를 영속 상태로 바꾸는 등의 처리가 필요합니다. 이런 상황을 가정해봅시다. 게시판에 존재하는 글을 수정하는 상황입니다. 해당 글은 DB에 이미 등록되어 있으며, 수정하고자 하는 게시글의 정보들이 함께 서버로 넘어옵니다. 이 때, 서버에서는 어떠한 로직으로 처리해야할까요??..

JPA 2024.01.15

[JPA] @Id의 마법(feat. @GenerateValue)

오늘은 JPA를 공부하면서, DB의 전략에 따라 @Id가 부리는 마법(?)에 대해서 조금 다뤄보려고 합니다. em.persist 저희는 지금까지 em.persist()를 통해서 비영속 상태의 엔티티를 영속 상태로 변환한다는 것을 알았습니다. 또한, 우리가 em.persist()를 하는 순간에는 DB에 바로 반영이 되지 않고 커밋되는 시점에서야 비로소 DB에 저장된다는 것을 익히 알고 있을 것입니다. 하지만 이 것은 틀렸습니다. 예를 들어서, 반례를 들어보죠. 저희가 아래와 같은 Member 엔티티를 구성했다고 해봅시다. @Entity @Getter public class Member { @Id @GeneratedValue private Long Id; private String name; } 여기에서 P..

JPA 2023.08.18

[JPA] 복합키 등록하기

프로젝트를 진행하던 중, 데이터베이스에서 두 개의 PK를 갖게되는 상황이 발생하였습니다. 그래서 오늘은 JPA에서 복합키로 DB를 설계하는 방법을 알아보겠습니다. 복합키란? 간단하게 말하면, PK(자연키)가 2개 이상 존재하는 것을 의미합니다. PK는 DB에서 유일성을 보장하는 속성을 의미하는데, 그러한 PK를 두 개로 지정함으로써, 유일성을 갖게 합니다. 예를 들면, 아래와 같은 DB가 있다고 해봅시다. 이 DB에서는 일정 시간마다 모든 식당의 현재 인원을 받아온다고 가정합니다. 여기서 만약 우리가 PK를 한개만 잡는다면, 유일성을 보장하지 못하므로 적절하지 않습니다. 물론 ID 속성을 넣어서, 유일성을 보장하게 할 수 있지만, 저희는 이 속성값만 사용해서 PK를 만들어야한다고 해봅시다. 그러면 저희가..

JPA 2023.08.18

@Transactional의 선언 위치

일전에 JPA에서 사용하는 어노테이션을 다루는 글에서 소개한 적이 있는 @Transactional 어노테이션에 대해서 다루다가 궁금한 점이 생겼었고, 그 의문점을 해결하여 기록합니다. 우선 그 전에, @Transactional이 무엇인지 알아보자. @Transactional은 기본적으로 선언된 메서드 내에서, 오류가 발생했을 경우 진행했던 변경 기록들을 DB에 커밋하지 않고 롤백하는 기능을 한다. 그래서 우리는 어떤 메서드를 동작시킬 때, DB에서 read를 제외한 CUD를 수행하고자 한다면, 필수적으로 이 어노테이션을 사용해야했다. Q. 왜 Repository에 선언하지 않고, Repository를 사용하는 메서드에서 @Transactional을 사용하나요? 보통 많은 서비스에서 하나의 트랜잭션(데이터..

JPA 2023.08.17

DTO, DAO란? (DAO와 Repository의 차이)

오늘은 JPA를 공부하다가 나온(사실 JPA와 관련 없는 내용이지만) DTO와 DAO에 대해서 알아보고, DAO와 Repository는 어떤 차이점이 있는지 알아보겠습니다. 1. DTO(Data Transfer Object) 그대로 직역하면, 데이터를 운송하는 객체입니다. 보통 웹과 서버에서 데이터를 주고받을 때 사용되는 객체라고 이해해도 무방합니다.(혹은 데이터를 전송할 때 사용하는 객체.) 특이하게 이 객체는 메서드가 존재하지 않습니다. 단순히 필드만을 가지고 있고, 이 필드에 정보가 담겨져서 운송되는 방식이라고 생각하면 좋습니다. DTO를 이용할 때는 아래와 같은 규칙을 이용하여 작성합니다. 필드는 모두 private으로 선언합니다. Getter와 Setter를 열어둡니다. 아직 더 심화해서 사용해..

JPA 2023.08.10

임베디드 타입(Embedded Type)이란?

오늘은 JPA 공부를 하던 중 만난 임베디드 타입에 대해서 정리해보겠습니다. 임베디드 타입에 대한 자세한 설명보다는 제가 이해한 것을 토대로 작성하였기에 일부 누락이 있고 오류가 있을 수 있습니다. 지적 및 조언 주시면 감사하겠습니다. 임베디드 타입이란? 단어 그대로 번역하면 내장된 타입이라고 합니다. JPA에서는 데이터 타입이 두 가지로 나뉩니다. 엔티티 타입과 값타입입니다. 조금 간단하게 설명해보면, 엔티티 타입은 데이터가 될 타입입니다. 주로 우리는 @Entity를 사용해서 선언합니다. 또한 값 타입은, int, Integer 같은 자바에서 기본으로 사용하는 기본 타입 또는 객체를 의미합니다. 임베디드 타입은 값 타입입니다. 이제 이런 딱딱한 설명은 그만하고 실제로 임베디드 타입이 뭔지 알아봅시다...

JPA 2023.08.08

JPA에서 Enum 타입 사용하기

오늘은 JPA 실습을 하던 중, Enum 타입을 사용한 것에 대해서 배운 내용을 토대로 정리해보겠습니다! 1. Enum이란? 간단하게 Enum에 대해서 짚고 넘어가겠습니다. Enum은 열거형이라고도 불리며, Enum 내에 선언된 값은 선언된 순서대로 순서를 갖습니다. 아래와 같이 사용할 수 있습니다. public enum OrderStatus { ORDER, CANCEL } 이렇게 되면, ORDER는 0에 매핑되고, CANCEL은 1에 매핑됩니다. 따라서 순서 또한 갖습니다. 추가적으로, 코드에서 봤다시피 Enum은 보통 대문자로 표기해줍니다. 관례니 따라줍시다. 2. JPA에서 Enum을 사용하는 이유 그렇다면 우리는 JPA에서 Enum을 왜 사용할까요?? 우리는 아래와 같은 표를 보면 바로 알 수 있..

JPA 2023.08.04

영속성 컨텍스트(Persist Context) - 간단하게 이해하기

해당 글은 정확한 개념보다는 지식이 전무후무한 독자들이 가볍게 읽을 수 있는 형태로 작성되었습니다. 보다 정확하고, 깊이있는 글을 원하시는 분은 다른 글을 참고하시면 좋을 것 같습니다. 자바 스프링부트 JPA를 막 시작했다. 개념보다는 실전을 먼저 들어가서, 모르는 개념을 찾아 우선적으로 익힌 다음에 개념 강의로 더 단단한 개념을 쌓으려고 시도했다. 시작하자마자 모르는 것 투성이... 다 체크하고 개념에 대해서 조금 익혔다. 이 글은 JPA에 대한 개념이 없이 영속성 컨텍스트 및 영속성에 대한 개념을 대략적으로나마 이해하고자 하는 독자에게 추천한다. 1. 엔티티 엔티티는 데이터베이스에서도 들어보았던 용어였습니다. 쉽게 얘기하자면, 데이터베이스에 한 테이블에서 하나의 행을 의미합니다. 즉, 하나의 데이터를..

JPA 2023.08.04