반응형
JPA에서는 연관된 엔티티를 가져오는 방법으로 지연 로딩과 즉시 로딩이 있다. 지연 로딩 지연 로딩은 연관된 엔티티를 사용할 때까지 로딩을 지연하는 방식이다. 지연 로딩을 사용함으로써 연관 엔티티의 데이터를 사용할 필요가 없는 경우, 쿼리 수행과 시간을 절약할 수 있다. @xxToxx(fetch = fetchType.LAZY) 언제 지연로딩을 사용할까? 연관 엔티티를 많이 사용하지 않는 경우 부모 객체를 조회할 때 자식 객체를 따로 조회하지 않고, 자식 객체가 필요한 경우만 로드하여 사용할 때 유용하다. 실제로 필요한 경우에만 연관 엔티티를 사용하는 경우 연관 엔티티가 필요한 경우에만 로딩하여 불필요한 쿼리가 수행되지 않아, 쿼리 수행 시간을 줄일 수 있다. 대용량 데이터 처리 연관된 엔티티를 무조건 로..
JPQL (Java Persistence Query Language)이란 ? JPQL은 엔티티 객체를 대상으로 하는 쿼리 언어이다. JPQL의 문법을 보면 다음과 같다. (나이가 18살 이상인 유저를 조회) select u from User as u where u.age > 18 JPQL은 SQL과 유사한 구문을 사용하는 것을 볼 수 있다. 하지만 살짝 다른 특징을 살펴보면 이렇다. JPQL 문법 특징 엔티티 클래스 이름, 엔티티 필드의 대소문자가 일치해야한다. ( 즉, 유저의 나이를 조회하는데 나이 필드가 age면 Age가 아닌 age로 작성 ) JPQL 키워드는 대소문자 구분하지 않는다. (SELECT, select, From, from) 엔티티 객체를 대상으로 하는 쿼리이므로 엔티티 이름을 사용한다..
임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고 공통 타입을 다양한 엔티티에서 재사용할 수 있다. 이해하기 쉽게 예시를 통해 알아보자. 임베디드 타입을 사용하는 예시 User 엔티티에 다음과 같은 정보가 있다고 가정해보자. @Entity public class User { @Id @GeneratedValue private Long id; private String username; private String city; private String street; private String zipcode; ... } 여기서 city, street, zipcode는 주소에 해당된다...
어느 책에서나 어느 강의에서나 Entity에서는 Setter를 사용하는 것을 지양한다고 한다. 그렇다면 왜 setter를 지양할까 ? setter를 지양하는 이유 사용한 의도를 쉽게 파악하기 어렵다. Member member = new Member(); member.setUsername("김갑동"); member.setAge(50); 위 코드를 보면 member에 값을 설정하는 것은 알겠는데 이게 값을 생성하는 것인지, 값을 변경하는 것인이 의도를 파악하기 힘들다. 그리고 엔티티의 필드가 더 많을 수록 한눈에 파악하는 것이 힘들어진다. 일관성을 파괴한다. public Member updateMember(Long id) { Member member = findById(id); member.setUserna..