![[JPA] @Builder.Default](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCobk0%2FbtsM6iG3kXO%2FSxKFjCenvMLgkUsT81OXq0%2Fimg.png)
@Builder.Default는 Lombok의 @Builder와 함께 사용할 때, 기본값이 무시되지 않도록 유지시켜주는 어노테이션이다.일반적으로 @Builder를 사용하면, 필드에 직접 초기화한 값이 무시된다.@Builderpublic class Product { private String name; private int price = 1000;}위와 같이 price = 1000을 설정했더라도, Product.builder().build()를 실행하면 price는 0이 된다.즉, 기본값 1000이 무시되는 것. 해결 방법@Builderpublic class Product { private String name; @Builder.Default private int price = ..
![[JPA] 엔티티 클래스에서 @Builder 위치](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDW2Rs%2FbtsM7gHZ67o%2FDIfjTjnmMtzbGUJL7rUeK0%2Fimg.png)
@Builder를 생성자 위에 두는 방식@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Entitypublic class Product extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String productNumber; private String name; private int price; @Builder // 생성자 위에 빌더 public Product(String productNumber, String name, int price) { this.produc..
![[JPA] 엔티티 공통 필드 상속(@MappedSuperclass)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7aUcA%2FbtsM6Zmep1n%2F9U0FJGLbH4OAjVISMFOlp0%2Fimg.png)
@MappedSuperclass엔티티마다 생성 날짜와 수정 날짜가 존재한다고 가정하면, 모든 엔티티에 해당 코드를 넣는 것은 비효율적이다.따라서 아래의 코드를 통해서 공통 필드를 상속받게 할 수 있다.@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntity { @CreatedDate private LocalDateTime createdDateTime; @LastModifiedDate private LocalDateTime modifiedDateTime;}공통 필드(생성일시, 수정일시)를 모든 엔티티에서 자동으로 사용하고 싶을 때이 BaseEntity를 상속받..
개발 환경SpringBoot 3.3.5Java 17PostgreSQL 14 문제 상황ERROR: column "XXX" is of type XXX but expression is of type character varying Hint: You will need to rewrite or cast the expression. @Enumerated(EnumType.STRING)@Column(nullable = false, name = "level")private UserLevel level; 엔티티에 ENUM 타입이 있는데 이를 enum이 아닌 문자열로 인식해서 발생하는 문제임을 알았다.XXX(예시) 라는 컬럼이 있는데, PostgreSQL에서는 ENUM으로 만들었지만, JPA에서 이를 문자열로 인식한 상..
![[Spring Data JPA] Projections 과 Native Query](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnC6Ai%2FbtsI1ucVwfu%2FMRrTVSGPovElNItvOotgf0%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.ProjectionsProjections는 Spring Data JPA에서 특정 엔티티의 일부 필드만을 선택적으로 조회하기 위해 사용하는 기능이다. Projections를 통해 전체 엔티티를 조회하지 않고 필요한 필드만을 선택적으로 가져올 수 있으며, 이를 통해 성능을 최적화하고 데이터 전송량을 줄일 수 있다. 인터페이스 기반 프로젝션 (Interface-based Projection)프로젝션을 위해 인터페이스를 정의하고, 필요한 필드만 메서드로 선언한다.JPA는 이 인터페이스를 구현하는 프록시 객체를 생성하여, 쿼리 결과를 이 인터페이스의 구현체로 반환한다.public interface UsernameOnly ..
![[Spring Data JPA] 새로운 엔티티인지 구별하는 방법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNyPA5%2FbtsI2pIGJCn%2F85oVzmKz2n7CpemTyIp4D1%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.이 글은 JPA의 변경 감지와 병합에 대한 이해가 필요합니다.2024.08.05 - [Java Category/JPA] - [JPA] 병합(Merge)과 변경 감지(Dirty Checking) [JPA] 병합(Merge)과 변경 감지(Dirty Checking)이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.JPA(Java Persistence API)에서 변경 감지(Dirty Checking)와 병합(Merge)은 엔티티 상태 관리를 위한 중요한 개념이rebugs.tistory.com save() 메서드의 구조org.springframework.data.jpa.rep..
![[Spring Data JPA] 확장 기능](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmfHDB%2FbtsI0LTP0Md%2FJGgh5olwXUktnN0lJrtpdk%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.사용자 정의 리포지토리사용자 정의 인터페이스public interface MemberRepositoryCustom { List findMemberCustom();} 사용자 정의 인터페이스 구현 클래스@RequiredArgsConstructorpublic class MemberRepositoryCustomImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List findMemberCustom() { return em.createQuery("select m from Memb..
![[Spring Data JPA] 쿼리 메서드 기능](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaedyj%2FbtsI1mSLGez%2FqKJwMQzwpB4uHEV53ThtC0%2Fimg.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.쿼리 메소드 기능 3가지메소드 이름으로 쿼리 생성메소드 이름으로 JPA NamedQuery 호출@Query 어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의 메서드 이름으로 쿼리 생성인터페이스에 메서드만 정의하면 알아서 DB로 쿼리가 날라간다.public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age);}위 메서드 이름에서 알 수 있듯이, 이름과 나이를 기준으로 회원을 정리하는 기능이다.당연히 이 방식은 인공지능이 개입하는 것은 아니고 이름의..