프로그래밍/JPA 18

[JPA] 영속성 이해하기

JPA의 영속성이란? 객체의 상태를 지속적으로 유지하는 기능을 의미 영속성은 객체를 관계형 DB와 연결하여 객체의 상태 변경을 DB에 자동으로 반영하고, DB의 변경을 객체에 자동으로 반영하는 기능을 제공 JPA의 영속성을 이해하기 위한 주요 개념 1. 엔티티(Entity) JPA에서 관리되는 객체로, DB 테이블과 매핑되는 클래스 영속성 컨텍스트에서 관리하는 대상 2. 엔티티 매니저(Entity Manager) JPA에서 엔티티를 관리하는 주체로 DB와의 통신을 담당 영속성 컨텍스트를 생성하고, 엔티티의 생명주기를 관리 3. 영속성 컨텍스트(Persistence Context) 엔티티의 상태를 관리하는 논리적인 영역 엔티티의 변경을 추적하고, 변경 내용을 DB에 동기화 예시 - User 엔티티 @Ent..

프로그래밍/JPA 2023.07.12

[JPA] jpql limit 사용하기

jpql limit 사용하기 jpql에는 limit절을 사용할 수 없음 이를 대체하기 위한 방안들을 소개해보고자 함 nativeQuery 사용하기 nativeQuery=true 추가하여 네이티브 쿼리 사용하기 @Query(value = "SELECT * FROM employee ORDER BY salary DESC LIMIT 1", nativeQuery = true) Employee findFirstEmployee(); first 키워드 사용 첫 번째 결과를 가져오는 방법 @Query("SELECT e FROM Employee e ORDER BY e.salary DESC") List findFirstEmployee(); top 키워드 사용 Order by 한 목록의 상위 3개의 결과 가져오는 방법 Lis..

프로그래밍/JPA 2023.05.17

[JPA] Dirty Checking not working

Dirty Checking 이란? JPA에서 엔티티 객체의 상태 변경을 추적하고, 자동으로 해당 변경사항을 데이터베이스에 반영하는 기능 Dirty Checking은 JPA가 엔티티의 영속성 컨텍스트(Persistence Context)를 관리하는 방식에서 중요한 역할을 함 영속성 컨텍스트는 엔티티의 변경사항을 추적하고, 엔티티 객체와 데이터베이스의 일관성을 유지하기 위해 필요함 save 없이 엔티티의 변경을 감지하여 변경사항을 데이터베이스에 자동으로 반영함 Dirty Checking not working? service에서 엔티티 변경을 하고 있었다면 메소드 상단에 @Transactional 을 잘 적었는지 확인하기 @Transactional 어노테이션은 JPA에서 트랜잭션을 시작하고 커밋 또는 롤백하는..

프로그래밍/JPA 2023.05.08

[JPA Error] Reason: Validation failed for query for method public abstract 오류 해결 방법

Reason: Validation failed for query for method public abstract 오류 jpql 쿼리 작성 중 만난 에러 @Query(value = "select new com.test.dto.OrderDto(u.name) " + "from Order o " + "join User u on u.userSeq = o.userSeq " + "where 1=1 " + "and (:userSeq = null or :userSeq = '' or o.userSeq = %:request.userSeq%") List getOrderList(Long userSeq); 원인 안정적이지 않은 쿼리여서 발생 살펴보니 like 검색시 % 넣어준걸 복사해서 사용하다 보니 = 검색인데 %이 남아있어서..

프로그래밍/JPA 2023.04.27

[JPA] JPQL 날짜 조회 시 원치않는 타임존이 붙는다면?

JPQL 날짜 조회 시 타임존 제거하기 request 를 받을 때 String 타입으로 받는다면 간단하게 해결 가능함 @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate contractDate; 위와 같이 데이터를 받고 있었다면 private String contractDate; 이렇게 받아서 jpql에서 조회하면 타임존이 붙지 않음 다만 jpql 쿼리문에서는 date함수를 사용해 String 타입을 Date 타입으로 변환시켜야 함 예시 코드 👇 @Query(value = "select * from order where contractDate >= DATE(:contractDate)") List getOrderList(String contractDate); 테..

프로그래밍/JPA 2023.04.19

[JPA] JPA setter 사용하지 않는 이유

JPA에서 setter를 사용하지 않는 이유 간단 정리 객체 무결성(불변성) 보장 불가 Setter 메소드를 생성하면 객체의 상태를 변경할 수 있음 그러나 JPA 엔티티는 일반적으로 불변성을 유지해야 함 이는 객체의 일관성과 무결성을 보장하고 JPA의 영속성 컨텍스트에서 오작동하는 것을 방지함 보안 문제 Setter 메소드를 사용하여 객체의 필드 값을 변경하면 보안 문제가 발생할 수 있음 예를 들어, 비밀번호와 같은 중요한 필드 값을 직접 변경할 수 있는 경우, 보안 위험에 노출될 수 있음

프로그래밍/JPA 2023.04.14

[JPA] Repository find 와 entityManager로 조회하는 것의 차이점

Repository find 와 entityManager로 조회하는 것의 차이점 기본적으로 Repository를 사용하면 JpaRepository를 상속받은 인터페이스를 사용하기에 EntityManager가 자동으로 주입됨 그렇다면 entityManager로 조회하는 것과 repository로 조회하는 것의 차이가 없는 것 아닐까? 기본적으로는 맞음 memberId로 Member Entity 객체 조회하기 하지만 나의 경우와 같이 memberId로 Member 객체를 조회하는 경우는 조금 다를 수 있음 orderRepository.findByMemberMemberId(1L) 을 실행하면 Spring Data JPA에서 제공하는 메소드를 이용한 조회 방식 Order 엔티티와 Member 엔티티가 연관되어 ..

프로그래밍/JPA 2023.04.11

[JPA] JPA Entity Id를 String 으로 설정하기

JPA Entity Id를 String 으로 설정하기 사실 entity id 를 String 타입으로 설정할 수 있는가? 에 대해 너무 당연하게 생각할 수도 있으나 조회시에 repository 설정때문에 못찾는 경우를 봤기에 이렇게 작성하게 되었음 Entity에 Id를 String 타입으로 설정하기 String 타입 외에 어떤 타입이든 설정 가능(물론 복합키도 가능함) 그러나 findById를 통해 조회 시에 Long 타입으로 찾아야 한다고 뜬다면? Repository 설정을 찾아보자 아마 JpaRepository 를 상속받는 부분을 보면 이유를 찾을 수 있을 것임 위의 코드에서 보면 MemberRepository는 JpaRepository 인터페이스를 상속받음 이때, Member는 엔티티 클래스이고, ..

프로그래밍/JPA 2023.04.10

[JPA] 복합키 설정 방법(@EmbeddedId, @IdClass)

복합키 설정 방법은 크게 두가지가 있음 1. @EmbeddedId 어노테이션 사용 2. @IdClass 어노테이션 사용 @EmbeddedId 어노테이션 사용 복합키를 가진 엔티티 클래스에서는 복합키를 위한 별도의 클래스를 만들어야 함 이 클래스에 복합키를 구성하는 필드들을 선언하고, @Embeddable 어노테이션을 붙여줌 그리고 이 클래스를 엔티티 클래스에서 @EmbeddedId 어노테이션을 사용하여 참조 예시 public class OrderProduct { @EmbeddedId private OrderProductId id; @Embeddable public class OrderProductId implements Serializable { @Column(name = "order_id") priva..

프로그래밍/JPA 2023.03.28