Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

karrot-0016: JPA 공부 #33

Open
hello-yoochul opened this issue May 13, 2023 · 2 comments
Open

karrot-0016: JPA 공부 #33

hello-yoochul opened this issue May 13, 2023 · 2 comments
Labels

Comments

@hello-yoochul
Copy link
Contributor

https://www.baeldung.com/category/persistence/tag/jpa

  • 위에서 각자 3개씩 선택해서 공부 후 다음주 발표하기.
@tae0y
Copy link
Contributor

tae0y commented May 21, 2023

JPA

  • 레퍼런스 Spring Data JPA - Reference Documentation
  • 튜토리얼 Baeldung | Tag: Spring Data JPA
  • 어떤 주제부터 공부해야할까?
    spring에서 mybatis로 sql-server에 접근해 데이터를 처리해왔어. 이번에 jpa를 사용해 postgresql에 접근해 데이터를 처리하려고 . 어떤 글을 먼저 읽으면 좋을지,   개를 골라서  이유를 기술해줘. 이해하기 쉽게 차근차근 설명해줘. 
  • 😄 �Chat-GPT 선생님의 답변
    • Introduction to Spring Data JPA : Spring Data JPA의 기본 개념과 원리를 이해하는 것이 중요합니다. Spring Data JPA의 구조와 철학을 이해하는 데 도움이 될 것입니다. 이 주제를 다루는 기사에서는 종종 리포지토리 패턴과 Spring Data JPA에서 구현되는 방법에 대해 논의합니다.
    • Spring Data JPA and PostgreSQL Configuration : SQL Server에서 PostgreSQL로 이동하려면 애플리케이션 구성을 변경해야 할 수 있습니다. 따라서 PostgreSQL을 데이터베이스로 사용하도록 Spring Data JPA 애플리케이션을 구성하는 방법을 이해하는 것이 중요합니다.
    • Spring Data JPA Query Methods : Spring Data JPA의 주요 이점 중 하나는 리포지토리 인터페이스에서 단순히 메서드를 선언하여 쿼리를 정의하는 기능입니다. 이것이 어떻게 작동하는지 이해하는 것은 Spring Data JPA를 효과적으로 사용하는 데 중요합니다.
    • Spring Data JPA Relationships : 애플리케이션이 엔터티 간의 관계(일대일, 일대다, 다대일, 다대다)가 있는 복잡한 모델을 포함하는 경우 Spring Data를 사용하여 이러한 관계를 매핑하는 방법을 이해합니다. JPA는 매우 중요합니다.
    • Spring Data JPA Pagination and Sorting : 이는 많은 애플리케이션에서 공통적인 요구 사항입니다. Spring Data JPA를 사용하여 이러한 기능을 구현하는 방법을 알면 애플리케이션 코드를 크게 단순화할 수 있습니다.
    • Spring Data JPA Specification : 복잡한 쿼리의 경우 Spring Data JPA는 쿼리를 동적으로 구축할 수 있는 사양 API를 제공합니다.

ORM 기본기

  • 영속성 컨텍스트의 이점
    • 1차 캐시
    • 동일성(identity) 보장
    • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
    • 변경 감지(Dirty Checking)
    • 지연 로딩(Lazy Loading)
  • 영속성 컨텍스트란
    • 엔티티의 생명주기
      • 비영속 : 엔티티를 생성하고 영속성 컨텍스트에 집어넣지 않음
      • 영속 : persist 메서드로 영속성 컨텍스트로 넣음
      • 준영속 : 영속성 컨텍스트에 저장했다가 분리됨
      • 삭제 : 엔티티가 삭제됨
    • 영속성 컨텍스트의 내부
      • 1차 캐시 : 엔티티의 id가 key, 값으로 엔티티가 들어가는 저장소. 엔티티 조회시 1차 캐시에 들어있으면 DB로 접근하지 않음
      • 쓰기 지연 SQL 저장소 : persist로 엔티티를 영속성 컨텍스트에 등록하면, INSERT 쿼리가 이곳에 저장됩니다. 트랜잭션을 커밋할때 DB로 전달/수행합니다.
        • 엔티티 등록
          • persist : 엔티티가 1차 캐시에 저장되고, SQL저장소에 쿼리가 저장됨
            • 최초 상태를 복사해서 '스냅샷'이라고 불리는 복사본을 만들어둠
          • flush : 커밋전 SQL저장소의 쿼리가 DB로 전달/반영됨
          • commit : 변경사항이 DB에서 커밋됨 (이때 엔티티는 영속성 컨텍스트에 그대로 유지)
        • 엔티티 수정
          • transaction commit / flush
          • entity snapshot 비교, 변경된 엔티티를 찾음
          • 변경된 엔티티가 있으면 수정 쿼리를 생성
          • 쓰기지연 SQL 저장소에 보관
          • DB로 전송/커밋

엔티티 정의

JPA 엔티티 정의 | 발둥 (baeldung.com)

  • Entity : 데이터베이스에 저장된 테이블이라는 뜻, 모든 인스턴스는 해당 테이블의 행
  • Id : 기본키 [JPA] 기본 키 생성 전략(IDENTITY, SEQUENCE, TABLE) (velog.io)
    • 직접할당
      • 자바 기본형, Wrapper형, String, Date, BigDecimal, BigInteger를 사용가능
      • persist로 Entity 저장하기 전 어플리케이션단에서 직접 기본 키를 할당해줌
    • 자동생성
      • IDENTITY : 시퀀스를 제공하지 않고, autoincrement 기능 제공하는 경우(mysql, postgresql, sql server, db2), 데이터를 인서트한후 기본키값을 조회할 수 있음. 엔티티가 영속상태 되려면 식별자가 필요한데, DB에 저장해야만 식별자를 구할 수 있는 방식.
      • SEQUENCE : 시퀀스를 사용해 기본키를 할당(oracle, postgresql, db2, h2 db)
        • 최적화를 위해서 시퀀스가 늘어나는 크기를 조정하기도 한다. 이를테면 50으로 설정해두면, 시퀀스에 여러곳에서 접근해 값을 증가시키더라도 서로 중복될 확률이 낮다.
      • TABLE : 키 생성 전용 테이블을 생성하고, name value로 사용할 칼럼을 생성하여 db sequence를 흉내낸다.
      • Identity vs Sequence : identity는 엔티티를 db에 먼저 저장한 후에 식별자를 조회해 엔티티의 식별자로 할당하며, sequence는 영속성 저장전 시퀀스를 먼저 조회새 엔티티에 식별자로 할당해 저장한다. 이후 트랜잭션 커밋하여 flush 발생하면 엔티티를 db에 저장한다.
      • AUTO : 선택한 DB방언에 따라 자동으로 선택한다. DB를 변경해도 코드수정을 하지 않아도 되며, 키 생성 전략이 정해지지 않은 개발 초기단계, 프로토타입 개발시 편리하다.
  • Table : 엔티티와 테이블 이름이 일치하지 않을 경우, 어노테이션으로 명시
  • Column : 필드와 열 이름이 일치하지 않는경우, 그외 열의 제약조건을 명시
  • Transient : 테이블에 유지되지 않는 필드
  • Temporal : 자바의 Date는 기본적으로 timestamp로 변환되는데, 이를 특정 타입으로 명시해줄 수 있다.
    • TemporalType.DATE : 날짜
    • TemporalType.TIME : 시간
    • TemporalType.TIMESTAMP : 날짜와 시간
  • Enumerated : Enum의 이름 또는 서수(디폴트) 중 무엇으로 할지 지정

Eager / Lazy JPA Fetch Join

Eager과 Lazy + JPA Fetch Join (velog.io)

  • @_ToOne 에서는 EAGER가 기본값
  • @_ToMany는 LAZY가 기본값
  • 💡 N+1 문제 / N+1 문제 - Incheol's TECH BLOG (gitbook.io)
    • 집사 - 고양이 객체에서, 집사를 조회하면 연관관계가 매핑된 고양이 객체도 읽어온다. 집사를 조회할때 쿼리를 한번, 고양이를 조회할때 쿼리가 또 한번 수행된다. SQL호출횟수를 줄여 성능을 최적화하고 싶은 경우 피하고 싶은 상황이다.
    • 제안 : 지연로딩으로 설정해두고, 성능 최적화가 필요한 곳은 JPQL 페치 조인을 사용
    • OneToMany에서 즉시로딩 findAll로 조회하거나, 지연로딩에서 loop 조회하면 발생
    • 연관관계가 설정된 엔티티를 조회할때, 조회된 데이터 개수만큼 연관관계의 조회쿼리가 추가로 발생하여 데이터를 읽어오는 현상.
      • fetch type이 eager면 즉시 발생하고
      • lazy면 엔티티를 순회하며 해당 필드를 조회하는 시점에 발생한다
    • fetch join : inner join
      • JPQL에서 join fetch 구문을 사용하면 연관관계 있는 객체도 영속성 컨텍스트로 불러온다
      • 그런데 (구현체에 따라 다르지만) fetch join 대상에 별칭을 줄 수 없고
      • 둘 이상의 컬렉션을 fetch하면 카테시안 곱이 만들어지며 (이를 방지하기 위해 Set 컬렉션에 담으면 중복이 방지된다, 또는 JPQL에서 distinct를 사용해도 된다)
      • 컬렉션을 fetch join하면 페이징 API를 사용할 수 없다
    • EntityGraph : outer join
    • subselect : 연관된 데이터 조회시 서브 쿼리로 한번에 조회 (총 2번으로 끗)
    • batchsize : 연관된 데이터를 조회할때 지정된 크기만큼 SQL의 IN절을 사용해 조회
  • 💡 순환참조
    • 양방향으로 연관관계가 설정된 엔티티를 조회할때 서로를 참조하는 현상. Member - Post 관계에서 Member 엔티티를 반환받아 JSON으로 변환하려고 하면 순환참조가 발생.
    • DTO 객체를 만들어 필요한 데이터만 옮겨담아 반환하면 순환참조를 방지할 수 있다.
    • 양방향 매핑이 꼭 필요한지 생각해보고 불필요하면 단방향으로만 매핑을 해준다.

Spring Data JPA - Relationship Mapping

[Spring Data] JPA - Relationship Mapping (velog.io)

  • 연관 관계의 주인인 엔티티에서 관계 종류를 표현, 칼럼 이름을 지정
  • 연관 관계의 방향
    • 단방향과 양방향으로 분류
    • 참조가 꼭 필요한 경우들을 고려하며 설정
  • 연관 관계의 주인
    • 두 entity가 양방향 관계일 경우, 연관 관계의 주인이 필요
    • 연관 관계의 주인은 외래키를 저장, 수정, 삭제하는 등의 관리 권한을 가짐
    • 주인인 아닌 entity는 조회만 가능하며, mappedBy 속성을 사용하여 표현
    • 일반적으로 외래키가 있는 entity를 주인으로 설정
  • 영속성 전이
    • PERSIST : 부모 entity가 영속화되면 자식 entity도 영속화
    • MERGE : 부모 entity가 병합되면 자식 entity도 병합
    • REMOVE : 부모 entity가 삭제되면 자식 entity도 삭제
    • REFRESH : 부모 entity가 새로고침되면 자식 entity도 새로고침
    • DETACH : 부모 entity가 detach되면 자식 entity도 detach
    • ALL : 부모 entity가 영속성 상태 변화를 자식 entity에 모두 전이

@tae0y
Copy link
Contributor

tae0y commented Jun 4, 2023

Post-GIS

  • 필요한 부분만 학습하고, 천천히 개선하자
  • JPA에서 좌표/폴리곤 객체를 다루는 방법
  • 행정동 좌표/폴리곤 정보는 아래 깃헙에서 볼 수 있다 (개인 저장소임)
    • vuski/admdongkor
    • 파이썬 스크립트를 하나 짜서, json 읽어서 ddl 쿼리로 변환해서 집어넣으면 되겠다.

해야할일

  • geojson을 postgresql에 집어넣기
  • polygon 객체에서 contains 잘 작동하는지 Junit 테스트코드 작성하기
  • 제대로 테스트해보려면.. 저번에 건의한 testcontainer로 docker를 띄워 테스트해보기
    예시) 사당동의 읍면동 객체를 불러오고, 사당역의 좌표가 사당동에 포함되는지 판별

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants