Java/JPA (21) 썸네일형 리스트형 JPA실전1 정리 스프링 부트 스타터(https://start.spring.io/)) 스프링부트로 설정이 다 자동화되었다. persistence.xml없다. 쿼리파라미터 남기는 라이브러리. build.gradle에 등록.(개발단계에서만 사용하는 것을 권장함. 개발단계에서는 편하게 사용해도 된다. 운영시스템에 적용하려면 성능테스트 꼭 필요.(성능저하 이슈) implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' 예제 설계에서 Member 엔티티에 사실 OrderList는 필요 없다. Order에서 Member 정보 참조해서 하면 됨. * 참고: 회원이 주문을 하기 때문에, 회원이 주문리스트를 가지는 것은 얼핏 보면 잘 설계한 것 같지만, 객체 세 .. JPQL - Named 쿼리, 벌크연산 Named 쿼리 - 정적쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL. 어노테이션이나 xml에 정의한다. Spring Data JPA에서는 인터페이스 메소드 위에다가 바로 @Query 어노테이션으로 사용가능 -> 실무에서는 스프링데이터jpa써야겠죠? Named 쿼리 장점: 애플리케이션 로딩 시점에 초기화 한 후 재사용, 애플리케이션 로딩시점에 쿼리 검증함..(쿼리 이상하면 QuerySyntaxException오류 발생) 캐시하고 있어서 코스트 절약 @Entity @NamedQuery( name = "Member.findByUsername", // 클래스명.###이 관례임 query = "select m from Member m where m.username = :username" ) public.. JPQL - fetch join(패치조인) - 적극활용 권장 이거 모르면 실 무 못 함. 데이터 여러개 조회할 때 좋음 JPQL에서 성능 최적화를 위해 제공함.페치 조인은 객체 그래프를 SQL한번에 조회한다.(즉시로딩)명시적으로 즉시로딩 하는거라고 볼 수 있음, 프록시 아니고 진짜데이터 들고옴. 주로 조회성 기능할때 사용 String jpql = "select m from Member m join fetch m.team"; List members = em.createQuery(jpql,Member.class) .getResultList(); for (Member member : members) { System.out.println("username = " + member.getUs.. JPQL-프로젝션,조인,조건식 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. JPQL은 SQL과 문법이 유사함. 엔티티 객체를 대상으로 쿼리. JPQL문법 select_문 :: == select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절[where_절] delete_문 :: = delete_절[where_절] 엔티티와 속성은 대소문자 구분o(Member, age) JPQL키워드는 대소문자 구분x(select) 엔티티 이름 사용, 테이블 이름이 아님. 별칭은 필수(Member m) TypeQuery, Query TypeQuery : 반환 타입이 명확할 때 사용 Query : 반환 타입이 명확하지.. 값 타입 컬렉션 대신 실무에서 쓰는 방법 만약 List 같은 값 타입 컬렉션이 필요한 경우 값 타입 컬렉션을 Entity로 승급시킨다.@Entity@Getter@Table(name = "ADDRESS")public class AddressEntity { @Id @GeneratedValue private Long id; private Address address; public AddressEntity(String city, String street, String zipcode) { this.address = new Address(city, street, zipcode); } public AddressEntity() {}} address는 값타입으로 만들었다. (position, x.y좌표 정도 할때만 .. 영속성 전이 : CASCADE 영속성 전이는 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공해준다 (ex.부모 엔티티 저장시에 자식 엔티티도 함께 저장) @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); cascade 속성을 사용할 수 있는 경우: 하나의 부모가 자식들을 관리할때, ex)parent 말고 member가 child를 알게되면 쓰면 안된다.... 단일 엔티티에 완전히 종속적일때(소유자가 하나일때), life cycle 동일할때(등록,삭제) ex 게시판-첨부파일 경로(다른 엔티티랑 관련 있으면 쓰면 안됨. 소유자가 하나일때만 사용) 고아객체제거 : 부모 엔티티와 연관관계가 끊.. 프록시, 즉시로딩 주의 JPA에서는 ==비교 대신 instance of 사용하기~(프록시객체랑 그냥 객체 == 비교하면 false나옴) (instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용하는 연산자) /* TRUE Member m1 = em.find(Member.class, member1.getId()); Member m2 = em.find(Member.class, member2.getId()); System.out.println("m1 == m2" + (m1.getClass() == m2.getClass())); */ Member m1 = em.find(Member.class, member1.getId()); Member m2 = em.getReference(Member.clas.. @MappedSuperclass id,name 등 공통 매핑 정보가 필요할 때 사용, 엔티티가 아님에 주의!단순히 엔티티가 공통으로 사용하는 매핑정보를 모으는 역할@MappedSuperclasspublic abstract class BaseEntity { private String createBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; 속성만 상속받을 때 쓰는 MappedSuperclass부모 클래스를 상속 받은 자식 클래스에 매핑 정보만 제공한다. 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장함.필드 예시는 운영 시 기본으로 깔려야하는 녀석들. 나중에 Sp.. 이전 1 2 3 다음