페치조인은연관된 엔티티를 지연 로딩하지 않고 즉시 로딩할 수 있기에N+1 문제를 쉽게 해결할 수 있다는 점에서 유용하다..하지만, 이는 몇가지 한계가 있음페치 조인의 한계페이징 문제JPA 는 어플리케이션 레벨에서 페이징을 처리하게 됩니다.수많은 데이터를 가져와서 어플리케이션 레벨에서 페이징을 시도하면 어떻게 될까요많은 양은 데이터를 메모리에 올려놓게 되기에 성능에 문제가 발생할 수 있음관련 해결 방안은Hibernate Fetch Join시 메모리에서 페이징 처리 사전 차단하기Hibernate (Spring Data JPA) 를 사용하다보면 종종 HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 의 W..
개념@AttributeOverride임베디드 타입 내의 필드에 대한 매핑 정보를 오버라이드 할때 사용같은 임베디드 타입을 한 엔티티 내에서 여러 번 사용하고자 할 때 필요함같은 타입의 임베디드 필드가 테이블내에서 서로 다른 컬럼명을 가져야할 경우가 존재사례회원 엔티티 Member집 주소 homeAddress회사 주소 companyAddress집 주소 , 회사 주소는 모두 Address 타입입니다.데이터 베이스 테이블에 이를 매핑시 각 주소를 구분 O고유한 컬럼이 필요함@Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Embedded Address homeAddress; @Embedded @Attr..
RED - GREEN - Refactor로 순서를 요약할 수 있다.RED실패하는 테스트의 작성추가하고자 하는 새로운 기능 혹은 개선사항을 반영해야한다.아직 구현되지 않은 코드의 동작을 지정하는 테스트 케이스기능 명세를 테스트 코드로 먼저 작성하는 것을 말합니다.단순한 더하기 계산기를 만들어보자import static org.junit.Assert.*; import org.junit.Test; public class CalculatorTest { @Test public void testAddition() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); assertEquals(5, result); } }해당 테스트는..
일단 프로젝트를 진행하면서 크게 느낀 사항이 있다.소스를 먼저 짜놓고 테스트를 돌리는 경우사람의 마음이란게, 최대한 내 소스가 맞다고 생각하고 짜게된다.이건 테스트코드 뉴비의 경우 발생할 수 있는 문제라고 생각도 된다개발자는 내가 작성한 코드에 대해 무의식적인 편향성 을 가지게 된다.내 코드는 내 머릿속에서 올바르게 돌아갈 수 밖에 없다 라는 가정 하에 테스트를 작성하게 되는데,이는 테스트가 진정한 오류 검출의 목적보다 내 코드에 대해 테스트는 정확하게 다 통과하는데? 라는 사고로 코드를 정당화하는 도구로 변질시키게 된다.실제로 테스트 코드의 에서 장바구니 기능의 경우장바구니에서 테스크 코드안의 검증해야할 엣지케이스 가 있음직한 부분에서 실제 버그를 찾아내는 것보다 코드가 통과할 수 있도록 테스트를 조정..
@Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; }기본 자료형이나 그에 해당 하는 래퍼 클래스 (String 등) 을 기본값 타입 으로 정의해당 값들은 식별자를 가지지 않고, 엔티티의 생명주기에 종속엔티티 인스턴스가 삭제되는 경우 함께 삭제다른 엔티티와 공유되어서는 안됨. Uploaded by N2T
임베디드 타입JPA 에서 복합 값을 임베디드 타입을 통해 구현가능하다복합값?여러 값을 하나로 모아서 표현하는 값임베디드 타입엔티티에 속하는 값 타입으로, 복잡한 객체의 모델을 단순화할때 유용@Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Temporal(TemporalType.DATE) private Date startDate; @Temporal(TemporalType.DATE) private Date endDate; private String city; private String street; private String zipcode; //.... }위 코드의 경우 이름, 근무 시작일 종료일 ..