개발바닥곰발바닥
반응형
article thumbnail
JPA 및 Hibernate의 1차 캐시
JAVA/Spring 2023. 1. 10. 00:25

JPA 및 Hibernate의 1차 캐시 JPA(Hibernate)에서 엔티티 매니저를 사용해서 persist, merge, remove를 했을 때 엔티티의 상태는 변경(New, Managed, Removed,..)되지만, flush나 트랜잭션이 커밋될 때까지 데이터베이스에 동기화되지는 않는다. 트랜잭션이 커밋되었을 때 변경을 한 번에 데이터베이스에 반영하기 위해 JPA(Hibernate)의 영속성 컨텍스트 내부에는 엔티티를 저장하는 1차 캐시가 존재한다. 1차 캐시는 트랜잭션이 시작되고 종료될 때까지만 유효한 트랜잭션 단위의 캐시다. 애플리케이션 단위의 캐시를 사용하고 싶다면 2차 캐시를 활성화해야 한다. Hibernate의 1차 캐시 구현 내부적으로 Hibernate는 엔티티를 다음과 같은 Map에 ..

Spring Data JPA 원하는 필드만 Select하기(Projection)
JAVA/Spring 2022. 10. 29. 19:31

Spring Data JPA 원하는 필드만 Select 하기(Projection) JPA를 사용해서 Repository에서 Select 할 때, 보통 Entity를 통째로 조회하게 되는데, 일부 값만 필요한 경우 불필요한 데이터까지 모두 조회하게 된다. 오늘 진행하고 있는 프로젝트 기능 중에서 회원의 점수별로 정렬하여 조회하는 쿼리가 필요했는데, Member의 모든 필드를 가져올 필요가 없다고 생각하여 Projection을 사용해 보았다. Projection을 사용해서 원하는 필드만 가져올 수 있는데 기본적인 방법은 인터페이스를 이용하여 Projection 하는 방법이지만, DTO Class를 많이 사용하기 때문에 Class Projection도 사용이 가능하다. 오늘은 두 방법에 대해 알아보도록 하자...

Spring No property 'desc' found for type 'LocalDateTime’ 오류
JAVA/Spring 2022. 10. 8. 14:05

Spring Data JPA를 사용하는중, 생성 일자로 정렬을 하기 위해 아래와 같이 Repository에 선언을 했는데, No property 'desc' found for type 'LocalDateTime’라는 에러가 발생했다. Page findAllOrderByCreateDateDesc(Pageable pageable); LocalDateTime 타입에 desc 속성을 찾을 수 없다고 오류가 발생하는데, 해결 방법은 매우 간단하게 findAll 뒤에 'By'를 붙여주면 깔끔하게 동작한다. Page findAllByOrderByCreateDateDesc(Pageable pageable);

JPA Column Enum으로 관리하기
JAVA/Spring 2022. 5. 11. 00:14

JPA Column Enum으로 관리하기 회원 정보인 Member Entity에서 권한을 관리하는 state라는 필드가 있는데 기존에는 state를 String으로 사용했었다. 그런데 String으로 사용하면 생길 수 있는 문제점이 있는데, 현재 진행중인 프로젝트의 권한은 USER, ADMIN, ANONYMOUS(승인되지 않은 유저) 이렇게 세 개로 관리하는데 권한 변경하는 API에서 Request에 권한을 받을 때 잘 못된 값이 들어 올 수 있다는 위험이 존재한다. 이런 문제를 사전에 차단하기 위해 권한에 대한 Enum을 만들어 잘못된 입력 값이 들어오면 막아주도록 설계를 변경했다. ROLE Enum public enum Role { ROLE_USER("ROLE_USER"), ROLE_ANONYMOUS..

[Spring] JPA를 사용한 카테고리 (하위메뉴) 구현
JAVA/Spring 2022. 4. 10. 03:43

JPA를 사용한 카테고리 (하위메뉴) 구현 오픈마켓 프로젝트에서 상품들을 카테고리 별로 분류하기 위해 카테고리 기능을 구현하게 됐다. 카테고리는 depth가 있기 때문에, 하위 메뉴까지 가져올 수 있도록 구현해야 한다. 테이블 계층형 구조를 위해 category 테이블에 자신의 PK를 부모로 삼는 parent 외래키를 넣어줬다. Entity 도메인 @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") priva..

article thumbnail
[Spring] JPA Column default 값 적용 안되는 문제
JAVA/Spring 2022. 4. 4. 03:23

회원가입 API를 만들던 중, Member 테이블의 state 필드에 디폴트 값이 N으로 설정되어 있음에도 state 값을 넣어주지 않자 오류가 발생하는 문제가 생겼다. 전에 mybatis를 사용할 때는 디폴트 값을 설정해놓으면 값을 넣지 않아도 자동으로 디폴트 값이 들어갔었는데 JPA를 사용하면서 갑자기 이런 문제가 발생하는게 당황스러웠는데, 찾아보니 Entity에 어노테이션 하나만 추가하면 해결되는 문제였다. DynamicInsert DynamicInsert 어노테이션을 사용하면, Insert 쿼리를 수행할 때 값이 null인 필드를 제외하고 Insert를 수행한다. DynamicInsert 어노테이션을 넣은 다음에는 정상적으로 잘 작동했다. 이것과 비슷한 어노테이션으로 DynamicUpdate가 있..

반응형