[JPA] 영속성 이해하기
2023. 7. 12. 20:34
프로그래밍/JPA
JPA의 영속성이란? 객체의 상태를 지속적으로 유지하는 기능을 의미 영속성은 객체를 관계형 DB와 연결하여 객체의 상태 변경을 DB에 자동으로 반영하고, DB의 변경을 객체에 자동으로 반영하는 기능을 제공 JPA의 영속성을 이해하기 위한 주요 개념 1. 엔티티(Entity) JPA에서 관리되는 객체로, DB 테이블과 매핑되는 클래스 영속성 컨텍스트에서 관리하는 대상 2. 엔티티 매니저(Entity Manager) JPA에서 엔티티를 관리하는 주체로 DB와의 통신을 담당 영속성 컨텍스트를 생성하고, 엔티티의 생명주기를 관리 3. 영속성 컨텍스트(Persistence Context) 엔티티의 상태를 관리하는 논리적인 영역 엔티티의 변경을 추적하고, 변경 내용을 DB에 동기화 예시 - User 엔티티 @Ent..
[JPA] jpql limit 사용하기
2023. 5. 17. 20:55
프로그래밍/JPA
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] Dirty Checking not working
2023. 5. 8. 20:56
프로그래밍/JPA
Dirty Checking 이란? JPA에서 엔티티 객체의 상태 변경을 추적하고, 자동으로 해당 변경사항을 데이터베이스에 반영하는 기능 Dirty Checking은 JPA가 엔티티의 영속성 컨텍스트(Persistence Context)를 관리하는 방식에서 중요한 역할을 함 영속성 컨텍스트는 엔티티의 변경사항을 추적하고, 엔티티 객체와 데이터베이스의 일관성을 유지하기 위해 필요함 save 없이 엔티티의 변경을 감지하여 변경사항을 데이터베이스에 자동으로 반영함 Dirty Checking not working? service에서 엔티티 변경을 하고 있었다면 메소드 상단에 @Transactional 을 잘 적었는지 확인하기 @Transactional 어노테이션은 JPA에서 트랜잭션을 시작하고 커밋 또는 롤백하는..
[JPA Error] Reason: Validation failed for query for method public abstract 오류 해결 방법
2023. 4. 27. 20:45
프로그래밍/JPA
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] JPQL alias error 해결 방법
2023. 4. 20. 20:13
프로그래밍/JPA
alias error 뜨는 경우 join 건 부분 확인할 것 join 건 쿼리의 select 절 alias 추가해주기 예시 코드 @Query(value ="select * from Order o " + "left join (select orderSeq as orderSeq, name as name from OrderProduct " + ") op on op.orderSeq = o.orderSeq") List getOrderList(OrderCondition condition);
[JPA] JPQL 날짜 조회 시 원치않는 타임존이 붙는다면?
2023. 4. 19. 20:57
프로그래밍/JPA
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] JPA setter 사용하지 않는 이유
2023. 4. 14. 20:45
프로그래밍/JPA
JPA에서 setter를 사용하지 않는 이유 간단 정리 객체 무결성(불변성) 보장 불가 Setter 메소드를 생성하면 객체의 상태를 변경할 수 있음 그러나 JPA 엔티티는 일반적으로 불변성을 유지해야 함 이는 객체의 일관성과 무결성을 보장하고 JPA의 영속성 컨텍스트에서 오작동하는 것을 방지함 보안 문제 Setter 메소드를 사용하여 객체의 필드 값을 변경하면 보안 문제가 발생할 수 있음 예를 들어, 비밀번호와 같은 중요한 필드 값을 직접 변경할 수 있는 경우, 보안 위험에 노출될 수 있음
[JPA] Repository find 와 entityManager로 조회하는 것의 차이점
2023. 4. 11. 20:06
프로그래밍/JPA
Repository find 와 entityManager로 조회하는 것의 차이점 기본적으로 Repository를 사용하면 JpaRepository를 상속받은 인터페이스를 사용하기에 EntityManager가 자동으로 주입됨 그렇다면 entityManager로 조회하는 것과 repository로 조회하는 것의 차이가 없는 것 아닐까? 기본적으로는 맞음 memberId로 Member Entity 객체 조회하기 하지만 나의 경우와 같이 memberId로 Member 객체를 조회하는 경우는 조금 다를 수 있음 orderRepository.findByMemberMemberId(1L) 을 실행하면 Spring Data JPA에서 제공하는 메소드를 이용한 조회 방식 Order 엔티티와 Member 엔티티가 연관되어 ..