일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Flush
- Amortized Analysis
- 영속성 컨텍스트
- Spring
- MappedSuperclass
- 고아객체
- 분할상환분석
- 정렬
- Spring Data JPA
- JPA
- 지연로딩
- n+1문제
- Algorithm
- 순수jpa
- DiscriminatorColumn
- commit
- 페치조인
- 엔티티 매핑
- 영속성전이
- 관계형 데이터베이스
- 값타입
- relational DB
- DiscriminatorValue
- 플러시
- 즉시로딩
- DB
- fetch join
- ROLLBACK
- relational database
- Embeddable
- Today
- Total
목록Programming/JPA (11)
Jun's note
JPQL은 1차캐시를 확인하지 않고 바로 DB에 쿼리문을 날린다. JPA의 큰 장점에는 1차캐시와 변경감지 기능이 있었다. 우리가 값을 조회할때 먼저 DB를 확인하지 않고 1차캐시부터 확인한다. 1차캐시에 찾던 값이 존재하면 1차캐시만 확인하고, 1차캐시에 없을 경우에 DB를 조회한다. 만약 직접 JPQL로 update문을 수행하면 어떤일이 일어날까? 1. JPQL 수행 2. 트랜잭션이 커밋되면, 쿼리문이 DB에 반영된다. (DB에는 변경된 값이 업데이트됨) 이 때, 값을 조회하면 (1차캐시에 있는) 3. 1차캐시를 확인하여 값을 넘겨준다. 4. 넘겨받은 값은 수정안된 값이었다. -> 문제발생 문제점: JPQL로 직접 update했기때문에 1차캐시랑 DB에 저장된 값이 서로 다른 상황 만약 1차캐시에 없..
페치 조인(fetch join)이란 JPQL에서 성능 최적화를 위해 제공하는 기능이어서 SQL의 조인 종류와는 다르다. 먼저 페치 조인에 대해 알아보기전에, JPQL과 SQL에 대해 간단히 정리해본다. - JPQL: 엔티티를 대상으로 검색하는 객체지향쿼리 (어차피 JPQL식으로 코드 짜서 나중에 SQL로 자동 변환됨) 장점 -> 특정 데이터베이스 SQL에 의존 X - SQL: 테이블을 대상으로 - QueryDSL사용시 주의사항: 수동 flush해주기 (왜? 영속성 디비에 저장된것을 커밋을 통해 실제 디비에 옮겨주는데, 커밋이 뒤에 나오니깐 결과가 0이어서 제대로 결과값이 나오지 않음-> 그러니 em.flush() 수동으로 해주기) - 동적쿼리!!! , 자바 코드로 쿼리를 짜기때문에 SQL로 오류난 것을 ..
JPA를 사용할 때 변수값을 3가지 타입으로 정의할 수 있다. 1. 기본값 타입 2. 임베디드 타입 (복합 값 타입) (예, 좌표 x,y를 하나의 값으로 함께 사용) 3. 컬렉션 값 타입 (기본값 타입과 임베디드 복합해서 사용?) 1. 기본값 타입 기본타입 vs 객체타입 int, double - 변수를 공유하지 않음 (값 변경 x) (메모리에 각각의 주소에 할당됨) (값을 전달,복사하는 것) Integer, Long(클래스) - 변수를 공유 o (왜? 레퍼런스를 참조하기 때문, 주소를 연결시켜주기 때문에 다른 변수여도 저장소는 같은곳) (참조를 전달) 2. 임베디드 타입 연관되어있는 값끼리 묶어 하나의 클래스로 해결 (엔티티 X) 쉽게 말하면, 1. "회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주..
먼저 영속성 전이에 대해 정리할것이다. 영속성 전이는 프록시나 지연로딩과 관련 없는 내용이다. (연관관계랑 관련 x) 이 점을 주의해야한다! 1. 영속성 전이(CASCADE) 부모 엔티티를 저장할때 자식 엔티티도 저장되도록 (부모를 기준으로 개발) 목적 : 개발의 편리함 때문 부모와 자식은 상속관계는 x 예를 들어, Member엔티티안에 Team도 있다면, Member객체를 저장할때 Team도 자동 저장되도록 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공 (주의!!!) 사용 방법: cascade 사용 @OneToMany(mappedBy="parent", cascade=CascadeType.ALL) 주의사항 부모랑 자식의 라이프스타일이 비슷할 경우에 사용(둘다 수정한다던지, 둘다 삭제..
프록시와 지연로딩이 서로 연관있기때문에 프록시, 지연로딩, 즉시로딩에 대해 정리해보겠다. 먼저 프록시가 나오게된 상황을 생각해보자. (상황) 예를 들어, Member와 Team이 서로 연관되어있다. Member를 조회할때 Team을 항상 조회해야할까? 이 둘을 같이 조회해야되면 같이 조회하면되지만, 그렇지 않을때도 있다. 필요하지도 않는데 항상 같이 조회하면 성능이 저하될 수도 있다. 이럴땐 어떻게 해야하나? (답은) 필요할때만 해당 엔티티를 조회하면 된다.(즉시로딩) (이 상황에 대해 더 쉽게 생각해보면, 게시물을 조회할때 댓글창을 클릭하지도 않았는데 댓글도 같이 조회되어야하는가? 성능문제와 관련있기 때문에 이 문제에 있어 생각해봐야한다) 즉시로딩에서 실제 엔티티안에는 프록시라는 가짜 엔티티가 있다! ..
1. 상속관계매핑 객체는 상속 관계 O, 관계형 데이터베이스는 상속 관계 X 이를 슈퍼타입 서브타입 관계라는 모델링 기법으로 해결 3가지 방법 1) 조인 전략 : 각각 테이블로 변환 (일반적인 방법, 각 테이블 연결) 2) 단일 테이블 전략 : 통합 테이블로 변환 (부모클래스 하나에 합치기) 3) 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환 (자식 클래스에 부모 속성이 들어있음) 2. 관련 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name=“DTYPE”) @DiscriminatorVal..
1. 다대일 가장 많이 사용하는 연관관계 다대일의 반대는 일대다 다쪽이 외래키(columnjoin) 2. 일대다 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인 항상 다(N) 쪽에 외래 키가 있다. 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하 는 특이한 구조 단점 엔티티가 관리하는 외래 키가 다른 테이블에 있다. 연관관계 관리를 위해 추가로 UPDATE SQL 실행 일대다 단방향(양방향) 매핑보다는 다대일 양방향 매핑을 사용하자 3. 일대일 일대일 관계는 그 반대도 일대일 외래키를 두 테이블 중 하나로 고를 수 있다. 다대일(@ManyToOne) 단방향 매핑과 유사 다대일 양방향 매핑 처럼 외래 키가 있는 곳이 연관관계의 주인 (반대편은 mappedBy 적용) 외래키 설정..
1. 엔티티 매핑 소개 객체와 테이블 매핑: @Entity, @Table 필드와 컬럼 매핑: @Column (엔티티 속성) 기본 키 매핑: @Id (식별자) 연관관계 매핑: @ManyToOne,@JoinColumn 위 어노테이션을 적어야 JPA가 관리할 수 있다. 잊지말고 적기!! 위에서 말한 4가지 엔티티 매핑에 대해 정리해본다. 2. 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 @Table 3. 필드와 컬럼 매핑 @Column @Enumerated EnumType.STRING 사용하기!!! (EnumType.ORDINAL를 사용하면, 정의된 숫자로 저장되기 때문에 나중에 데이터끼리 혼란을 줄 수 있음, 그리고 ORDINAL이 기본값이기 때문에 무조건..