김영한님의 자바ORM 표준 JPA 프로그래밍책으로 공부를 한다. 책으로 공부하는 것도 좋은듯하다. 스프링데이터 예제 프로젝트로 배우는 전자정부 표준데이터베이스 프레임워크~! 

jpa는 CRUD를 생성해주므로 생산적이다. 객체 설계중심으로 db와 연동가능하다. jpa는 상속,연관관계,객첵그래프탐색, 패러다임의 불일치 문제를 해결해준다. 객체지향을 통한 성능최적화를 할 수 있으나 잘 못 사용하면 n+1문제가 나타난다. JPA는 통계쿼리 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화 되어 있다.

김영한님 강의도 있지만... 책으로 하는게 편하다.

https://www.youtube.com/watch?v=ZgtvcyH58ys

 

jpql은 엔터티 객체를 대상으로 쿼리한다.(entity 클래스와 필드) jpql 은 table을 모르고 영속성 콘텍스트를 쓴다. 영속성 콘텍스트는 엔터티를 영구저장하는 환경이다. 영속성콘텍스트가 엔터티를 관리하면 1차캐시, 동일성보장,변경감지, 지연로딩, 트랜잭션을 지원하는 쓰기지연 등의 장점이 있다.   

객체는 FK가 아니라 참조주소로 연관관계를 맺고 이는 연관관계 매핑의 핵심이다. 왜래키가 있는곳이 보통 연관관계의 주인이다.

즉시로딩과 지연로딩은 이 양방향엔터티에서 연관된 엔터티를 즉시 조회하는 것이 eager(즉시로딩)이고 사용할 때 로딩 하는 것이 지연로딩(lazy) 이다.

 

LIST

'Developer > Spring & Backend' 카테고리의 다른 글

스프링부트 버전 1.x 대 연구  (0) 2024.12.04
스프링을 적용한다는건...  (0) 2024.12.02
JPA 간단정리 2  (0) 2024.09.16
JPA 간단 정리 1  (0) 2024.09.12
백엔드 TDD 비디오가게편  (0) 2024.09.03

이런식의 복합키와 상속구조는... 지양한다.

@MapsId는 자식 엔티티의 기본 키를 부모 엔티티의 기본 키와 동일하게 매핑할 때 사용하는데...

식별 관계는 부모테이블의 기본 키를 자식테이블로 전파하면서 자식테이블의 기본키 컬럼이 점점 늘어난다

 

 특정상황에 조인 없이 하위 테이블만으로 검색 가능한 것이 식별

뭐 classId를 쓰든 EmbeddedId를 쓰든 EmbeddedId가 좀더 객체지향적이라고는 하나, 어쨌건

 

그냥 비식별 관계로... ID를 생성하면서 자식엔터티에서 ManyToOne으로 다애일 관계를 맺는 형태로 Join하면...

간단하긴 하다...

// 연관관계 매핑 : 다중성(다대일, 일대다, 일대일, 다대다) - 단방향,양방향 - 연관관계의 주인(외래키를 가진 테이블, 많은 쪽, mapped by 가 없는쪽)

연관관계에서 매핑이 잘못되면 어쨌건 꼬일 것이다.

기억할 것은 양방향 매핑에서 외래키를 가진 테이블 , 많은 쪽 즉 다인쪽, 코드상으로 mapped by가 없는 쪽이 

연관관계의 주인이다.

 

@MapperSuperClass 는 추상형태로 모아놓을수 있다.

 

https://github.com/MyoungSoo7/jpatest

 

 

 

LIST

'Developer > Spring & Backend' 카테고리의 다른 글

스프링을 적용한다는건...  (0) 2024.12.02
JPA 간단정리3  (2) 2024.09.16
JPA 간단 정리 1  (0) 2024.09.12
백엔드 TDD 비디오가게편  (0) 2024.09.03
백엔드와 테스트 주도 개발 자판기편  (2) 2024.09.02

데이터중심의 마이바티스와 달리 JPA는 객체 중심의 hibernate 이다.

https://www.youtube.com/watch?v=brE0tYOV9jQ&t=98s

이 ORM을 쓸줄 모르면~!

쓰지 말라고 백기선 님께서 말씀하신다.

 

TDD책에서 등장하신 분이네요~!

연관관계 매핑을 제대로 할 지 모르면 쓰면 안된다고 하네요~!

 

어쨌건, JPA 김영한님 책 보면서 공부한거 정리해 봅니다.

 

 

쭈욱 보니까 JPA가 재밌는 건 data 중심에서 객체지향 중심으로 table을 설계한다는 것~!

 상속매핑은 부모클래스에 @inhteritance를 사용한다. 조인전략
부모클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다.
@DiscriminatorValue("B")  // 구분 컬럼에 입력할 값을 지정한다.
@PrimaryKeyJoinColumn(name = "BOOK_ID") // ID재정의

상속은 inhertiance annotation으로 하는데 DiscriminatorValue에 type을 지정해서 구분 할 수 있다.

부모 class는 DTYPE으로 하고 상속 받은 클래스들은 A,B... C,D 이렇게 구분하는 것이다.

 

 

table 생성시에 sequence 설정은 이런식으로 할 수 있고, 사실상 PK가 비식별 대체키라 여기다가 sequence rule도 적용하는군요~!

시퀀스 전략을 테이블에 만든 경우 PK컬럼에 generator로 시퀀스를 지정해줘야 한다.

 

 

여기서 테이블 만들고 변수설정하는 것도 다 간단할텐데~!

관계매핑이 까다로울 수 있다.

왜냐하면 방향성이 있고 양방향은 연관관계의 주인을 정해야 하기 때문이다.

보통 sql은 왜래키 FK를 썼는데, JPA는 객체지향 답게 참조(주소)로 연관관계를 맺는다.

 

 data model을 객체지향적으로 가공하면서, 사용자가 주문하는 모델을 만들어 봤다~!

다대다 관계 상품과 카테고리~!

상품과 카테고리는 다대다 관계인데~!

거기서 더 재밌는건 상품의 카테고리를 이렇게 상속으로 만들어서 구현했다.

 

주문도 다대일과 일대다의 관계를 잘표현했다. OrderItem과 User 에서 나타난다.

 

 

LIST

'Developer > Spring & Backend' 카테고리의 다른 글

JPA 간단정리3  (2) 2024.09.16
JPA 간단정리 2  (0) 2024.09.16
백엔드 TDD 비디오가게편  (0) 2024.09.03
백엔드와 테스트 주도 개발 자판기편  (2) 2024.09.02
2024년 9월을 맞이하며 항해 DEV LAB 후기  (30) 2024.09.01

(1) [10분 테코톡] 🙆‍♂️올레의 JPA와 JDBC - YouTube

 

java에서 jpa api와 jdbc api 로 DB접근 가능

jpa 는 sql 직접 안적어도 되고 sql구조 적용도 안해도된다.

LIST

'Developer > Spring & Backend' 카테고리의 다른 글

PostgreSQL vs MySQL  (0) 2023.06.23
우아한테크코스 - Forward Proxy , Reverse Proxy , Load Balancer  (0) 2023.06.22
Java 코딩테스트  (2) 2023.05.12
Java 코딩테스트  (0) 2023.05.09
Java 코딩테스트  (0) 2023.04.27

@Repository 로 실상 JPA로 DB와 연결된다. 

Query method 의 특징은 하기와 같다.

추가로 알아두면 좋은 어노테이션들

@Entity 객체로 DB를 생성한다.

 

 

DataSource로 물리적인 DB 정보를 담는 인터페이스로 다양한 구현체를 사용한다.

TransactionManager 로 트랜잭션 관리기능을 담당하는 인터페이스이다.

 

세팅 구성은 DataSource(DB설정) -> EntityManagerFactory( JPA엔터티 관리) -> PlatformTransactionManager(트랜잭션관리)

 

트랜잭션에 관해서는 

중복에 관한 Propagation

고립에 관한 isolation 레벨이 있다.

 

@Transaction:Propagation은 중첩된 트랜잭션의 동작 규칙이다.

@Required를 많이 쓴다. 예외 필요시에 @Mandatory 처리한다.

 

트랜잭션 내부의 격리수준(레벨)설정도 하기와 같이 가능하다.

보통 DEFAULT 로 되어 있으나 SERIALIZABLE이 필요한 경우도 있다.

LIST

JPA는 Java Persistence API로 자바 ORM기술에 대한 표준명세이다.

JPA는 표준명세이고 , 이를 실제 구현한 프레임워크 중 사실상 표준이 하이버네이트(Hibernate)이다.

스프링부트에서는 기본적으로 하이버네이트를 사용중이다.

 

 JPA는 Entity 저장, 조회를 약속된 표준으로 처리해준다.

Entity(디비테이블) 설정시

아래와 같은 어노테이션을 두어

Entity 관계설정도 가능하다.

 

Spring Data JPA

 

ID 외의 필드에 대한 추가 기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신!

Product Dto의 Page가 선언된 findAllByUserId 인터페이스가 완성되었다.

Users Dto의 3가지 인터페이스가 있다.

Folder Dto에서 List와 boolean 이 선언되 인터페이스 설정 된 것을 볼수 있다.(나머지 과정은 JPA가 대신해준다.)

 

Spring Data JPA는 페이징 및 정렬을 편리하게 사용하게 해준다.

 

Product Dto 하기와 같이 @ManyToMany 즉 다대다 어노테이션을 걸면

다양한 제품에 다양한 폴더 관계가 형성된다.

 

 

Folders Dto에 하기와 같이 @ManyToOne 즉 다대일 어노테이션을 걸면

다양한 폴더에 하나의 유저의 관계가 형성된다.

하기와 같이 Product Service에

페이징과 정렬관련 로직을 넣었다.

폴더를 클릭시에도 정렬이 되어야 하기에

폴더 클릭시에도 페이징과 정렬이 되게 처리한다.

 

 

@Transactional 어노테이션은 트랜잭션처리 과정을 ACID원칙하에

원자성,고립성,일관성,지속성을 확실하게 가지게 한다.

 

폴더 추가시에 제품과 폴더의 상관관계에 변화시 일관성을 유지하기 위해서다.

LIST

'Developer > Spring & Backend' 카테고리의 다른 글

node 설치 및 버전 그리고 패키지npm/yarn  (0) 2022.07.19
오픈 API 호출과 ajax 호출  (0) 2022.07.19
Junit 테스트 - TDD  (0) 2022.07.19
스프링 JWT  (0) 2022.07.19
카카오 로그인 OAuth 기능 구현  (0) 2022.07.19

JPA 특징

  1. 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체지향 개발이 가능하다.
  2. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.
  3. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원
  4. JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.

JPA를 왜 사용해야 할까

  1. sql 중심적인 개발에서 객체 중심적인 개발이 가능하다.
    sql 코드의 반복, 객체지향과 관계지향 데이터베이스의 페러다임 불일치
    Object -> [SQL 변환] -> RDB에 저장
    [개발자 == SQL 매퍼] 라고 할만큼 SQL 작업을 너무 많이 하고 있다.
  2. 생산성이 증가
    간단한 메소드로 CRUD가 가능하다
  3. 유지보수가 쉽다
    기존: 필드 변경 시 모든 SQL을 수정해야 한다.
    JPA: 필드만 추가하면 된다. SQL은 JPA가 처리하기 때문에 손댈 것이 없다.
  4. Object와 RDB 간의 패러다임 불일치 해결

 

JPA 하이버네이트

하이버네이트는 JPA 구현체의 한 종류이다.

JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 구현체(하이버네이트)는 이 인터페이스를 구현한 것이다.

하이버네이트 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.

LIST

+ Recent posts