Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

hyo_jung

[JPA] JPA 프로그래밍 기본기 다지기 1강 - JPA 소개 본문

개발/Backend

[JPA] JPA 프로그래밍 기본기 다지기 1강 - JPA 소개

hyo_jung 2022. 1. 15. 18:12

JPA 소개

어플리케이션을 객체 지향 언어로 개발함 (Java, Scala....등)

데이터베이스 - 대부분 관계형 DB (Oracle, MySQL...)

지금 시대는 객체를 관계형 DB에 관리

관계형 DB는 SQL을 짜야 한다.

 

1. SQL 중심적인 개발의 문제점

 

  • 무한 반복, 지루한 코드
  • 객체 CRUD - 필드 추가 (모든 쿼리 다 수정해야 함)
  • 엔티티 신뢰 문제 - memberDAO에서 memeber객체 가져오고 member.getTeam(); -> memberDAO안을 봐야 함
  • 진정한 의미의 계층 분할이 어렵다.
  • SQL에 의존적인 개발을 피하기 어렵다.

 

2. 패러다임의 불일치 : 객체 vs 관계형 데이터베이스

 

  • 관계형 데이터베이스 - 데이터를 어떻게 잘 정규화해서 저장할까에만 집중
  • 객체 - 어떻게 잘 추상화해서 관리를 잘할까에 집중
  • 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공 
  • 객체를 관계형 데이터베이스에 저장 - 객체를 SQL로 바꿔야 함 (개발자가 하나하나)
  • 개발자가 SQL 매퍼일을 많이 하게 됨

 

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

1. 상속

 

  • 객체 상속 관계 / Table 슈퍼타입 서브타입 관계 (판매하는 item : album, movie, book)
  • 앨범 저장 - 객체 분해 -> DB에 저장할 때 insert into item -> insert into album
  • 앨범 조회 - 아이템과 앨범 조인해서 가져옴 -> movie, book 가져올 땐 쿼리를 새로 짜야 함, 각각의 객체 생성 -> DB에 저장할 객체에는 상속 관계를 안씀, super itemDTO를 만듦

 

  • 자바 컬렉션에 저장
List<Item> list = new ArrayList<>();
list.add(album);

 

  • 자바 컬렉션에서 조회 - 부모 타입으로 조회 후 다형성 활용
Album album = list.get(albumId);
Item item = list.get(albumId);

 

2. 연관관계

 

  • 객체는 참조를 사용: member.getTeam()
  • 테이블은 외래 키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID
  • 객체 - Member.getTeam()에서 Team으로 갈 수 있음, Team조회하고 Member로 갈 수 없음. (방향성O)
  • 테이블 - Member조회하고 Team으로 갈 수 있음, Team조회하고 Member로 갈 수 있음. (방향성X)

 

3. 데이터 타입

 

  • 객체를 테이블에 맞추어 모델링 - 객체지향적이지 않음
  • insert into MEMBER(MEMBER_ID, TEAM_ID, USERNAME) values ... 로 쉽게 쿼리 짤 수 있음
class Member {
    String id;
    Long teamId;
    String username;
}

class Team {
    Long id;
    String name;
}

 

  • 객체다운 모델링
  • member.getTeam().getId();로 insert
class Member {
    String id;
    Team team;
    String username;
    
    Team getTeam() {
        return team;
    }
}

class Team {
    Long id;
    String name;
}

 

  • 객체 모델링 조회 - 코드가 길어지게 됨.
SELECT M.*, T.*;
    FROM MEMBER M
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
public Member find(String memberId) {
    //SQL 실행 ...
    Member member = new Member(); //데이터베이스에서 조회한 회원 관련 정보를 모두 입력
    Team team = new Team(); //데이터베이스에서 조회한 팀 관련 정보를 모두 입력
    
    //회원과 팀 관계 설정
    member.setTeam(team);
    return member;
}

 

  • 객체 모델링, 자바 컬렉션에 관리
list.add(member);

Member member = list.get(memberId);
Team team = member.getTeam();

 

  • 객체 그래프 탐색 - 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
  • 그런데 이렇게 못함. 처음 실행하는 SQL에 따라 탐색 범위 결정 - 쿼리에서 데이터 세팅을 안해놓으면 null이 들어감
  • 쿼리에서 데이터 세팅 해놓았는지 확인하려면 DAO계층을 확인해야 함
  • 내가 DAO짜놓지 않음 - member.getTeam() 해야하는 지 아닌지 모름

 

  • 상황에 따라 동일한 회원 조회 메서드를 여러벌 생성하면 됨 - 너무 많은 경우의 수
memberDAO.getMember();  //member만 조회
memberDAO.getMemberWithTeam();  //member와 team조회
memberDAO.getMemberWithOrderWithDelivery();  //member, order, delivery

 

4. 데이터 식별 방법

String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);

member == member2;  //다르다. 다른 인스턴스이기 때문

class MemberDAO {
    public Member getMember(String memberId) {
        String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
        ...
        //JDBC API, SQL 실행
        return new Member(...);
    }
}

 

  • 자바 컬렉션에서 조회
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);

member1 == member2; //같다.

 

  • 객체답게 모델링 할수록 매핑 작업만 늘어난다.
  • 객체를 자바 컬렉션에 저장하듯 DB에 저장할 수는 없을까?

 

JPA - Java Persistence API

JPA? 

  • 자바 진영의 ORM 기술 표준

ORM

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

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

  • 패러다임 불일치 해결

JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
    • 저장 : jpa.persist(member)
    • 조회 : Member member = jpa.find(memberId)
    • 수정 : member.setName("변경할 이름")
    • 삭제 : jpa.remove(member)
  • 유지보수
    • 기존 : 필드 변경시 모든 SQL 수정해야 함
    • JPA : 필드만 추가하면 됨, SQL은 JPA가 처리
  • 패러다임의 불일치 해결
    • 상속
    • 연관관계 저장 - member 가져오고 바로 team 가져올 수 있음.
    • 객체 그래프 탐색 - 자유로운 객체 그래프 탐색
    • 신뢰할 수 있는 엔티티 계층
    • 비교하기 - 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장함 (마치 자바 컬렉션)
  • 성능
    • 1차 캐시와 동일성 보장 - 같은 트랜잭션에서 조회한 엔티티는 같음
      • -> 두 번 조회하면 두번째는 1차 캐시에서 가져옴. SQL 1번만 실행 (성능향상)
    • 트랜잭션을 지원하는 쓰기 지연 - INSERT
      • 트랜잭션 커밋할 때까지 INSERT SQL들을 모음
      • JDBC BATCH SQL 기능을 사용해서 한 번에 SQL 전송
    • 지연 로딩
      • 지연 로딩 : 객체가 실제 사용될 때 로딩
      • 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회 (즉시 로딩으로도 바꿀 수 있음)
  • 데이터 접근 추상화와 벤더 독립성
  • 표준

 

ORM은 객체와 RDB 두 기둥 위에 있는 기술

 


출처 : [토크ON세미나] JPA 프로그래밍 기본기 다지기 1강 - JPA 소개 https://www.youtube.com/watch?v=WfrSN9Z7MiA

'개발 > Backend' 카테고리의 다른 글

[JPA] Spring Data JPA  (0) 2022.01.22
[Work Book] UMC 서버 8주차  (0) 2021.11.28
[Work Book] UMC 서버 7주차  (0) 2021.11.28
[Work Book] UMC 서버 6주차  (0) 2021.11.28
[Work Book] UMC 서버 5주차  (0) 2021.11.07