728x90
반응형
❗ 지금은 객체를 관계형 DB에 관리하는 시대 ➡ SQL 사용
📌 SQL이란?
- Structured Query Language
- 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어(에스큐엘, 시퀄이라고 읽음)
📌 SQL 중심 개발의 문제점
- 자바 객체를 SQL로 SQL을 자바 객체로 바꾸는 것이 무한 반복
- 객체에 필드 하나를 추가하게 되면 쿼리문을 다 수정해야함
❗SQL에 의존적인 개발을 피하기 어려움
객체를 관계형 데이터베이스에 저장

📌 패러다임의 불일치
⚡ 객체와 관계형 데이터베이스의 차이
- 상속
- 연관관계
- 데이터 타입
- 데이터 식별 방법
⚡ 상속
- 객체는 명확하게 상속관계가 존재함
Album 저장
- Album 객체를 Album과 Item으로 분해
- INSERT INTO ITEM 작성
- INSERT INTO ALBUM 작성
Album 조회
- 각각의 테이블에 따른 조인 SQL 작성(Item, Album 테이블)
- 각각의 객체 생성
- 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();
: OKmember.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
반응형
'인프런 Spring 강의 정리 > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편]6. 다양한 연관관계 매핑 (0) | 2024.01.23 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편]5. 연관관계 매핑 기초 (0) | 2024.01.23 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 4. 엔티티 매핑 (0) | 2024.01.23 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 3. 영속성 관리 - 내부 동작 방식 (0) | 2024.01.23 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 2. JPA 시작하기 (0) | 2024.01.23 |