🌵 JPA(feat. ORM)

2023. 9. 16. 21:56· Spring/🌵 JPA
목차
  1. 💡 JPA란?
  2. 💡 우리는 왜 JPA를 사용해야 할까?
  3. 1. ORM으로 인한 SQL 중심적인 개발에서 객체 중심의 개발로 변경
  4. 2. 생상성이 좋아진다
  5. 3. 유지보수가 편해진다.
  6. 4. 패러다임의 불일치를 해결해준다.
  7. 5. JPA의 성능 최적화

💡 JPA란?

Java Persistence API의 줄임말이다. 또한 JPA는 자바 진영의 ORM 기술 표준이다.

https://latewalk.tistory.com/160

 

💾 ORM이란?

ORM(Object relational mapping) 이란? 객체와 관계형 데이터 베이스의 데이터를 자동으로 매핑해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용한

latewalk.tistory.com

 

 

💡 우리는 왜 JPA를 사용해야 할까?

1. ORM으로 인한 SQL 중심적인 개발에서 객체 중심의 개발로 변경

 

2. 생상성이 좋아진다

SQL로는 길게 작성해야 하는 로직이 매우 간단해진다.

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

보이는 것처럼 CRUD에 해당하는 모든 로직이 저렇게 작성되면 SQL문이 자동으로 작성되면서 우리가 쿼리문을 일일히 신경쓰지 않아도 깔끔하게 끝낼수 있다.

 

3. 유지보수가 편해진다.

만약 어떠한 요청이 들어왔다. Member 쪽에 연락처에 문제가 있는것 같아 이거 수정을 좀 해야 할 것 같아 그렇다면 우린 tel이 들어가있는 모든 쿼리문을 수정해야 한다. 하지만 JPA를 사용한다면 Member 클래스의 tel만 수정해주면 해결될 일이다. 이런것처럼 유지보수가 매우매우 편리해진다.

 

 

4. 패러다임의 불일치를 해결해준다.

  • JPA 의 상속

만약 우리가 데이터를 Album에 넣고 싶다면 Item에도 넣어야하는 과정이 생기고 INSERT문을 두번 작성해야하는 번거로움이 생긴다.

 

하지만 JPA을 사용하면 우리가 일일히 작성해주어야 하는 INSERT를 알아서 작성해준다는 것이다.

jpa.persist(album)

 

  • JPA 의 조회

우리가 Album에서 해당 item의 album과 같은 id를 가진 것을 찾고 싶다는 쿼리문 또한 간단하게 해결되는 것이다.

Album album = jpa.find(Album.class, albumId);

 

  • JPA 의 연관관계, 객체 그래프 탐색

 

5. JPA의 성능 최적화

1차 캐시와 동일성을 보장한다

1. 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. - 이는 약간의 조회 성능을 향상하는 결과를 준다

2. DB Isolation Level이 Read Commit 이어도 애플리케이션에서 Repeatable Read를 보장한다

3. 하지만 조건이 있다 같은 트랜잭션이여야만 한다.

String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); // SQL
Member m2 = jpa.find(Member.class, memberId); // 캐시

println(m1 == m2) // true;

여기서 캐시 기능을 구현하여 SQL문은 한 번만 적용한다.

 

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

1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모은다

2. JDBC BATCH SQL 기능을 사용하여 한번에 SQL을 전송한다.

transaction.begin();

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다

transaction.commit();
// 커밋을 하는 순간 데이터 베이스에 INSERT SQL을 모아서 보낸다.

 

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

1. update, delete로 인한 로우(row)락 시간을 최소화한다

2. 트랜잭션 커밋 시 update, delete SQL을 실행하고, 바로 커밋한다.

transaction.begin();

changeMember(memberA);
deleteMember(memberB);
// 비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.

transaction.commit();
// 커밋하는 순간 데이터베이스에 update, delete SQL을 보낸다.

 

 

지연 로딩과 즉시 로딩

  • 지연 로딩 : 객체가 실제 사용될 때 로딩
지연 로딩

Member member = memberDAO.find(memberId); // 이때는 SELECT * FROM MEMBER 만 수행
Team team = member.getTeam();
String teamName = team.getName(); // 이때 SELECT * FROM TEAM 이 수행된다.
  • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
즉시 로딩

Member member = memberDAO.find(memberId);  // 여기서 해당 테이블의 객체까지 모두 JOIN문을 통해 로딩된다.
Team team = member.getTeam();
String teamName = team.getName();

 

나중에 상황에 따라 사용하는데 대부분의 개발자들은 지연 로딩을 사용하다가 상황을 보고 전부 불러와도 된다는 판단이 생기면 즉시 로딩으로 전환하는 과정을 거치게 된다.

 

'Spring > 🌵 JPA' 카테고리의 다른 글

🌵 플러시(flush)  (0) 2023.09.19
🌵 JPA의 영속성(feat.준영속상태)  (0) 2023.09.18
🌵 JPA의 구동 방식과 코드  (0) 2023.09.18
  1. 💡 JPA란?
  2. 💡 우리는 왜 JPA를 사용해야 할까?
  3. 1. ORM으로 인한 SQL 중심적인 개발에서 객체 중심의 개발로 변경
  4. 2. 생상성이 좋아진다
  5. 3. 유지보수가 편해진다.
  6. 4. 패러다임의 불일치를 해결해준다.
  7. 5. JPA의 성능 최적화
'Spring/🌵 JPA' 카테고리의 다른 글
  • 🌵 플러시(flush)
  • 🌵 JPA의 영속성(feat.준영속상태)
  • 🌵 JPA의 구동 방식과 코드
늦은산책
늦은산책
늦은산책
중얼중얼블로그
늦은산책
전체
오늘
어제
  • 분류 전체보기
    • 오류 모음집
    • CS
      • 💾 자료구조
      • 👫🏼 정렬
      • 🖥 네트워크
      • 💻 운영체제
      • 💾 DB
      • 🌌 알고리즘
      • 📝 언어
    • 테스트
    • Git 초보에게 필요한 Git bash사용법
    • 프로젝트
      • 팀 프로젝트
      • 개인 프로젝트
      • 항해99 개인 프로젝트
      • 스위프 프로젝트(Lit Map)
    • Java
      • 객체 지향
    • Spring
      • 🌲 Spring
      • 👨‍💻 SpringSecurity
      • 🌵 JPA
    • MSA
      • MSA 강좌 - 이도원 강사님
    • Docker(도커)
    • 코딩테스트
      • 🧮 프로그래머스
      • 🎲 백준
    • 항해99
      • 🕛 1주차
      • 🕐 2주차
      • 🕑 3주차
      • 🕒 4주차
    • AWS
    • CI와CD

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 카우치코딩_팀프로젝트
  • 개발자취준
  • 개발자이력서
  • 개발자포토폴리오
  • 카우치코딩_포트폴리오_멘토링
  • 취업리부트코스
  • 취리코
  • 카우치코딩
  • 코딩테스트
  • couchcoding
  • 개발자취업
  • 항해99
  • 개발자포트폴리오

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
늦은산책
🌵 JPA(feat. ORM)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.