Super Kawaii Cute Cat Kaoani [자바 ORM 표준 JPA 프로그래밍 - 기본편]1. JPA 소개

[자바 ORM 표준 JPA 프로그래밍 - 기본편]1. JPA 소개

2024. 1. 23. 11:39
728x90
SMALL

❗ 지금은 객체를 관계형 DB에 관리하는 시대 ➡ SQL 사용

📌 SQL이란?

  • Structured Query Language
  • 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어(에스큐엘, 시퀄이라고 읽음)

📌 SQL 중심 개발의 문제점

  • 자바 객체SQLSQL자바 객체로 바꾸는 것이 무한 반복
  • 객체에 필드 하나를 추가하게 되면 쿼리문을 다 수정해야함

❗SQL에 의존적인 개발을 피하기 어려움

 

객체를 관계형 데이터베이스에 저장

 

 

📌 패러다임의 불일치

⚡ 객체와 관계형 데이터베이스의 차이

  1. 상속
  2. 연관관계
  3. 데이터 타입
  4. 데이터 식별 방법

 

⚡ 상속

  • 객체는 명확하게 상속관계가 존재

Album 저장

  1. Album 객체를 AlbumItem으로 분해
  2. INSERT INTO ITEM 작성
  3. INSERT INTO ALBUM 작성

Album 조회

  1. 각각의 테이블에 따른 조인 SQL 작성(Item, Album 테이블)
  2. 각각의 객체 생성
  3. Item-Movie, Item-Book도 같은 작업 해줘야 함

✔ 객체는 상속관계가 있지만, 관계형 데이터베이스는 상속 관계가 없음

 

⚡ 연관관게

✔ 객체는 참조를 사용

  • member.getTeam()

✔ 테이블은 외래키 사용

  • JOIN ON M.TEAM_ID = T.TEAM_ID

 

객체를 테이블에 맞추어 모델링

class Member {
    String id; //MEMBER_ID 컬럼 사용
    Long teamId; //TEAM_ID FK 컬럼 사용 //**
    String username;//USERNAME 컬럼 사용
}

class Team {
    Long id; //TEAM_ID PK 사용
    String name; //NAME 컬럼 사용
}

외래키를 사용하여 테이블 간의 관계를 맺음

 

 

객체다운 모델링

➡ 데이터베이스에 insert하기 까다로워짐

class Member {
    String id; //MEMBER_ID 컬럼 사용
    Team team; //참조로 연관관계를 맺는다. //**
    String username;//USERNAME 컬럼 사용

    Team getTeam() { 
        return team;
    }
}

class Team {
    Long id; //TEAM_ID PK 사용
    String name; //NAME 컬럼 사용
}

 

 

)

 

 

 

⚡ 객체 그래프 탐색

  • 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 함

참조해서 탐색

처음 실행하는 SQL에 따라 탐색 범위 결정

SELECT M.*,  T.*
    FROM MEMBER M
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

member.getTeam(); : OK
member.getOrder(); : null

  • 탐색범위의 문제가 생김

✔ 엔티티의 신뢰 문제가 생김

class MemberService {
    ...
    public void process() {
        Member member = memberDAO.find(memberId);
        member.getTeam(); //???
        member.getOrder().getDelivery(); // ???
    }
}

 

✔ 모든 객체를 미리 로딩할 수는 없음
➡  상황에 따라 동일한 회원 조회 메서드를 여러벌 생성

memberDAO.getMember(); //Member만 조회 

memberDAO.getMemberWithTeam();//Member와 Team 조회

//Member,Order,Delivery
memberDAO.getMemberWithOrderWithDelivery();

 

⚡ 비교하기

  • 내용은 같지만 인스턴스가 다름
  • 자바 컬렉션에서 조회하게 되면 같다고 나옴

 

 

⚡ 정리

  • 객체 모델과 관계형 데이터베이스가 지향하는 패러다임이 달라 불일치 문제가 생김
  • JPA를 사용하여 불일치 문제를 해결하고 객체 모델링을 통한 애플리케이션을 개발함

 

반응형

 

 

📌 JPA 소개

🔶 JPA : Java Persistent API

  • 자바 진영의 ORM 기준 표준

 

⚡ ORM

  • Object-relational mapping(객체 관계 매핑)
  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재

 

 

⚡ JPA는 애플리케이션과 JDBC 사이에서 동작

JPA 동작 - 저장

JPA 동작 - 조회

 

⚡ JPA 소개

EJB - 엔티티 빈(자바 표준) -> 하이버네이트(오픈 소스) -> JPA(쟈뱌 표준)

JPA는 표준 명세

  • JPA는 인터페이스의 모음
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
  • 하이버네이트, EclipseLink, DataNucleus

 

생산성 - JPA와 CRUD

  • 저장 : jpa.persist(member)
  • 조회 : Member member = jpa.find(memberId)
  • 수정 : member.setName("변경할 이름")
  • 삭제 : jpa.remove(member)

 

트랜잭션을 지원하는 쓰기 지연 - INSERT

  • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
  • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin();//트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC)l
//여기까지 INSERT SQL을 데이터베이스에 보내지 않음
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보냄
transaction.commit();//트랜잭션 커밋

 

트랜잭션을 지원하는 쓰기 지연 - UPDATE

  • UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
  • 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
transaction.begin();//트랜잭션 시작

changeMmeber(memberA);
changeMember(memberB);
비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않음
//커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보냄
transaction.commit();//트랜잭션 커밋

 

 

 

 

 

 

 

 

<자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한>을 수강하고 작성한 글입니다

 

 

 

 

 

 

 

 


NEXT

 

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 2. JPA 시작하기

📌 프로젝트 생성 ✔ 새프로젝트 생성 -> Maven 선택 groupId : jpa-basic artifactId : ex1-hello-jpa version : 1.0.0 ✔ pom.xml에 의존성 추가 org.hibernate hibernate-core 5.3.20.Final com.h2database h2 2.2.224 h2 version : 2.2.224 hibe

nyeroni.tistory.com

 

728x90
LIST

BELATED ARTICLES

more