data jpa 에서의 save 메서드의 내부 로직은 이렇다public S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (entityInformation.isNew(entity)) { entityManager.persist(entity); return entity; } else { return entityManager.merge(entity); } }주어진 엔티티가 일단 새로운 엔티티인지 아닌지를 판단한다.이는 entityInformation.isNew(entity) 를 통해 이루어진다.entityInformation 은 엔티티에 대한 메타데이터를 제공하는 클래스이며isNew 는 엔티티가 새로운 것인지 아닌지를 판단하는 로..
@Test void transactionalEntityEqualsTest() { Member member = new Member("테스트", null); memberService.join(member); Member findMember = memberService.findMember(member.getId()); System.out.println("findMember = " + findMember); System.out.println("findMember == member = " + (findMember == member)); System.out.println("findMember.equals(member) = " + findMember.equals(member)); }@Service @RequiredA..
엔티티의 동등성 비교법비즈니스 키를 사용해 equals() 메서드를 오버라이딩해야함프록시와 동등성 비교 문제단순 원본 엔티티끼리의 비교에서는 IDE 나 외부 라이브러리가 제공한 equals 로 충분하지만..프록시 객체와의 비교에서는 문제가 발생함@Entity public class Member { @Id private String id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null..
N+1?연관된 엔티티를 로드할 때 발생한다.한 개의 쿼리로 N 개의 엔티티를 로드 후각 엔티티와 연관된 다른 엔티티들을 로드하기 위해추가적으로 N 번의 쿼리를 수행하게 됨.최종적으로 N + 1 의 호출이 발생하는 것이다.예제로 알아보자@Entity public class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); } @Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue private Long id; @ManyToOne p..
package com.example.springboot3.test.example.qdsl; import com.mysema.commons.lang.Assert; import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.dsl.PathBuilder; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import..
엔티티의 데이터를 데이터베이스에 저장할 때 변환하는 역할을 수행한다.Java 의 boolean 타입을 데이터베이스에 문자열 ‘Y’ 혹은 ‘N’ 으로 저장할때.. 사용한다고 함.분석DB 테이블 생성CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, USERNAME VARCHAR(255), VIP VARCHAR(1) NOT NULL, PRIMARY KEY (ID) )회원 엔티티@Entity public class Member { @Id private String id; private String username; @Convert(converter=BooleanToYNConverter.class) private boolean vip; // Getter, Setter }@Con..