일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- saga pattern
- Action Pattern
- MSA
- 체인 패턴
- 멀티스레드
- 키클락
- 배치
- Serial GC
- 생산자 소비자 패턴
- 스프링 배치
- 디자인패턴
- 타입스크립트
- Spring Boot Actuator
- JPA
- Resilinece4j
- 스레드
- Spring Cloud Netfilx Eureka
- TypeScript
- 사가 패턴
- Transaction Pattern
- thread
- 알고리즘
- spring cloud
- Parallel Old GC
- spring batch
- java 정렬
- 디자인 패턴
- The law of Demeter
- Java
- zipkin
- Today
- Total
목록Backend/JPA (10)
PSD( Private-Self-Development )
OSIV 란? DB 커넥션 유지를 언제까지 할 것인가를 설정하는 값이다. 트랜젝션 시작 시(보통은 Service 단) 영속성 콘텍스트와 DB 커넥션을 연결하고 이를 OSIV 설정 값에 따라 언제까지 할 것인가를 설정한다. 왜 연결을 유지해야 하는가? 지연 로딩을 위함(영속성 콘텍스트 유지)이다. 지연 로딩으로 인해 실 엔티티 데이터를 조회하기 위해 연결을 유지해 둬야 한다. 단점 DB 커넥션을 너무 오래 유지하면 실시간 트래픽이 중요한 서비스의 경우 커넥션이 모자랄 수 있다. 이는 곳 장애로 이어진다. 설정 값에 따른 동작 spring.jpa.open-in-view : true(기본값) Response 가 사용자에게 완전히 반환될 때까지 영속성 콘텍스트를 유지한다. 너무 오래 DB 커넥션을 유지한다는 단..
1. 엔티티를 API 응답으로 노출 시키지 말자. 1) 양방향 연관관계 설정 시 Json 화 하면서 무한루프에 빠진다 (@JsonIgnore 설정 필요) 2) 불필요하고 너무 많은 정보가 노출된다. 3) 연관 관계 지연로딩 설정 시 초기화 해주지 않으면 프록시가 대신 위치하기 때문에 파싱 문제 발생 2. 패치 조인( fetch join ) 을 활용하자. em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .getResultList(); 1) ToOne 관계는 패치 조인 조회 2) ToMany 관계는 지연 로딩을 이용 하자. (default_batch_fetch_..
JPA의 지원 쿼리 JPQL 테이블이 아닌 객체 지향 쿼리 SQL을 추상화하여 특적 DB SQL 의존도 x 동적 쿼리 사용 부적합 List memberList = em.createQuery( "select m From Member m Where m.name like '%hello%' ", Member.class ).getResultList(); JPA Criteria 동적 쿼리 지원 jpql 의 함수 버전 단, 가시성이 떨어지고 복잡해진다. => 유지보수성 저하 쿼리가 잘못 된 경우, 컴파일 오류가 나기 때문에 좋다. //Criteria 사용 준비 CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(Membe..
JPA 는 코드를 두 가지 타입으로 인식한다. 1. 엔티티 타입 @Entitiy 정의한 객체 데이터가 변해도 추적 가능 2. 값 타입 int, String 과 같이 자바 기본 타입 혹은 객체 테이터 변경 시 추적 불가 잘 사용 하면 객체 지향 적으로 좋다. 단, 여러 엔티티에서 공유하여 사용 할 경우, 문제 발생 복사 해서 사용하고, 불변 객체로 설계하자( 갯터만 생성하고 셋터는 생성하지 말자 ) 비교 시 equals() 함수 오버라이딩 하여 사용하자 기본 생성 equals() 를 쓰는 것이 좋다. ( get, set 함수 사용하도록 : 프록시를 위함 ) 값 타입 분류 1. 기본 값 타입 자바 기본 타입( int ) 래퍼 클래스( Integer ) String 2. 임베디드 값 타입( 복합 타입 ) @E..
프록시(Proxy)란? "대리"를 의미한다. JPA에서는 엔티티 조회 시, em.find() 가 아닌 em.getReference()로 지연 조회 시 조회 결과 값으로 이 가짜( 프록시 )를 조회해 온 후 이후 실 사용 시 조회 및 실 엔티티에 프록시 엔티티를 연결하는 역할로 사용된다. 프록시 특징 프록시는 첫 사용 시 한번만 초기화 된다. 초기화 시 프록시가 실 엔티티로 변경 되지는 않는다. 따라서 타입 체크 시 == 비교가 아닌 instance of 로 비교 해야한다. 영속성 컨텍스트에 해당 엔티티가 이미 있다면 getReference 시 실제 엔티티가 반환된다. 영속성 컨텍스트 에서 제거 된 경우, 프록시 초기화 시도 시 에러 발생 프록시 상태 확인 함수 프록시 초기화 여부 확인 emf.getPer..
JPA의 상속 관계 매핑 에는 두 가지 경우가 있다. DB의 테이블간 관계가 상속인 경우 엔티티 간의 공통 요소를 따로 빼서 상속해 줘야 하는 경우 각각의 방식에 따라 상속 대상 클래스를 생성 후 해당 클래스를 피상속 클래스들이 extends 받으면 상속이 성립된다. 1. DB의 테이블간 관계가 상속인 경우 이 경우, 상속하려는 엔티티에 아래 3가지 어노테이션을 부여한다. @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "Dtype") public abstract class Item{ } @Inheritance() strategy 속성 값에 따라서 상속 관계를 맵핑하는 방식이 달라진다. Inh..
JPA에서 Entitiy 란? JPA에서 관리하는 클래스이다. @Entitiy 어노테이션으로 지정할 수 있다. 단, - 기본 생성자 가 필수이다. - final 클래스, enum, interface, inner 클래스는 지정 불가능 - 저장할 필드에 final 사용 불가능 데이터베이스 스키마 자동 생성 jpa는 persistence.xml 설정 값에 따라 entitiy 설정한 객체에 대한 DDL을 자동으로 실행시켜 주기도 한다. 개발 단계에서 사용하기에 유용할 듯! 운영 단계에서는 절대 사용하지 말자... 매핑 어노테이션 @Entitiy JPA에서 해당 클래스를 관리하도록 설정하는 어노테이션 @Table() 속성 값을 설정하여 각 대상에 매핑 가능하다. @Id Primary Key 설정 @Generate..
영속성 콘텍스트? 엔티티를 영구 저장하는 환경 EntitiyManager.persist( entity ); 사실은 db에 저장하는 동작이 아닌 엔티티를 영속성 콘테스트에 영속하는 것 엔티티의 상태 비영속 ex) 객체 생성 후 데이터 세팅만 함 = 영속성 콘텍스트에 저장은 하지 않았다. 영속 ex) EntitiyManager.persist( entity ) = DB에 저장한 것이 아닌 영속성 콘텍스트에 저장한 것 트랜젝션. commit 시 에만 DB에 저장한다. 준영속 ex) EntitiyManager.detach( entity ) = 영속성 콘텍스트에서 해당 엔티티를 분리 삭제 EntitiyManager.remove( entity ) = 영속성 컨텍스트에 해당 엔티티 삭제 sql을 남긴다. GIT의 로컬..