본문 바로가기
Study/자바 ORM 표준 JPA 프로그래밍

1장. JPA 소개

반응형

본 포스트는 사내 스터디로 진행되는 자바 ORM 표준 JPA 프로그래밍 관련 정리입니다

 

인프런 강의도 있습니다! 짱짱

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com


1장. JPA  소개

1-1. SQL을 직접 다룰 때 발생하는 문제점

  • 잦은 변환 작업 및 공수
    • 데이터베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장, 조회할 수 없다
    • 즉 개발자가 직접 변환 작업을 작업해줘야한다 ( SQL 결과와 객체의 매핑 )
    • 심지어 테이블마다 이런 반복적인 일을 계속 해줘야 한다 ( 조회시 매핑, 변경시 수정 )
    • 만약 자바 컬렉션을 이용해 데이터를 관리했다면 많은 코드를 수정할 필요가 없다
  • 참조한 객체 의존성
    • 한 객체에 연관된(참조) 다른 객체를 사용할 수 있는지 없는지는 전적으로 SQL에 달려 있다
    • 결국 연관된 다른 객체를 사용하려면 DAO(Data Access Object)를 열어서 쿼리를 직접 보고 조회 대상에 포함되어있는지 확인해야 한다

 

1-2. JPA를 통한 패러다임의 불일치 해결

  • 관계형 데이터 베이스는 데이터 중심으로 구조화 되어 있고, 집합적인 사고를 요구 ( 추상화, 상속, 다형성의 개념도 없다 )
  • 상속
    • 객체는 상속이라는 기능을 가지고 있지만, 테이블은 상속이라는 기능이 없다
    • ex) 기존 JDBC API를 이용해 객체의 상속을 구현한다면 전부 분해해서 쿼리를 날려야한다
      // ITEM을 상속받는 ALBUM
      INSERT INTO ITEM ...
      INSERT INTO ALBUM ...
      
      // ITEM을 상속받는 MOVIE
      INSERT INTO ITEM ...
      INSERT INTO MOVIE ...​
    • ex) Java는 아무 고민없이 해당 부모 타입의 컬렉션을 만들어 이용하면 된다!
      List<Item> items = new ArrayList<>();
      
      items.add(new Album());
      items.add(new Movie());​
       
    • JPA는 어플리케이션 단에서는 Java의 패러다임처럼 이용하지만 실제 SQL을 데이터베이스 패러다임에 맞춰 날려준다

 

  • 연관 관계
    • 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 그래프 탐색을 진행
    • 테이블(데이터베이스)는 외래 키를 사용해서 다른 테이블과 연관관계를 가지고, 조인(JOIN)을 사용해서 연관된 테이블을 조회
    • 객체는 참조가 있는 방향으로만 조회가 가능하지만 테이블은 외래 키를 설정하면 양방향 탐색이 가능하다
    • JPA를 통한 연관관계 패러다임 불일치 해결
      member.setTeam(team) // Member와 Team의 연관관계 생성(Member -> Team)
      jpa.persist(member) // Member, Team 동시에 저장
      • JPA는 team의 참조를 외래 키로 변환해서 적절한 INSERT 쿼리를 날린다

 

  • 객체 그래프 탐색
    • 연관 관계에서 좀 더 심화된 내용인 것 같다
    • 객체 관계에서는 연관 관계가 연결된 다른 객체를 조회할 때 참조를 사용해서 바로 찾으면 되는데 이것을 객체 그래프 탐색이라고 한다
      Team team = member.getTeam();
    • SQL을 직접 다루게 되면 SQL에 정의된 내용에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다 
    • 즉 SQL을 항상 확인하면서 그래프 탐색을 진행해야하고 이는 큰 제약이다
    • JPA는 연관된 객체를 사용하는 시점에서 적절하게 SELECT 쿼리를 실행(지연 로딩)하여 마음 껏 객체 그래프를 탐색할 수 있다

 

  • 객체 간 비교
    • JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다 ( 동일성 비교 보장 )
      Long memberId = 100;
      Member member1 = jpa.find(Member.class, memberId);
      Member member2 = jpa.find(Member.class, memberId);
      
      member1 == member2 // true
    • 동일성
      == 비교, 객체 인스턴스의 주소값을 비교

    • 동등성
      equals() 메소드를 사용해서 객체 내부의 값을 비교

 

1-3. JPA란 무엇인가?

  • JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다

  • 위의 구조를 보면 결국 자바 어플리케이션에서 사용자는 JPA( 정확히는 ORM 프레임워크 )만 이용하게 되고, JPA가 알아서 JDBC API를 이용해 DB에 SQL을 질의한다
  • 사용자는 객체 지향 패러다임과 데이터베이스 지향 패러다임의 차이를 고민하지 않아도 된다 
  • ORM ( Object-Relational Mapping )
    이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻
  • ORM 프레임워크
    객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다

 

1-4. 왜 JPA를 사용해야하는가?

  • 생산성
    • 자바 컬렉션에 객체를 저장하듯이 JPA에 저장할 객체를 전달하면 된다
      jpa.persist(member); // 저장
      Member member = jpa.find(memberId); // 조회​
    • 이로써 지루하고 반복적인 코드와 CRUD용 SQL을 개발자가 직접 작성하지 않아도 된다
    • 더 나아가 JPA는 작성된 Entity에 따라 DDL문을 자동으로 생성하여, 테이블을 생성시킬 수도 있다

 

  • 유지보수
    • SQL을 직접 다루게 되면 Entity에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL 수정을 물론, 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 했다
    • 반면 JPA는 이런 SQL과의 매핑을 자동으로 처리해주니 수정해야할 코드의 양이 줄어든다
    • 개발자가 좀 더 집중해야할 비지니스 로직에 시간을 많이 쓸 수 있다

 

  • 패러다임의 불일치 해결
    • 앞서 다루었던 내용처럼 JPA를 사용하면 객체 지향 패러다임과 데이터베이스 중심 패러다임의 간극을 해결할 수 있다

 

  • 성능
    • JPA는 어플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다
    • 자세한 내용은 뒷장에서..
    • 참고로 하이버네이트는 SQL 힌트를 넣을 수 있는 기능도 제공한다

 

  • 데이터 접근 추상화와 벤더 독립성
    • RDBMS도 종류(MySQL, Oracle... )마다 사용법이 다르다. ( 조금씩 쿼리가 다르다 )
    • JPA는 어플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 특정 데이터베이스 기술에 종속되지 않도록 한다
    • 나중에 나오지만 JPA는 결국 표준 ORM 기술이기 때문에 방언(Dialect)만 설정하는 걸로 데이터베이스를 바꿀 수 있다

 

기타

Q. JDBC vs SQL Mapper vs ORM

  • JDBC
    자바에서 데이터베이스 접속할 수 있도록 하는 자바 API
    각 사용하는 DB의 드라이버를 로드하여 커넥션을 맺고, 데이터를 저장, 수정, 조회, 삭제등의 질의를 수행한다

  • SQL Mapper
    Mybatis, 스프링 JdbcTemplate을 SQL 매퍼라고 한다
    SQL과 매핑할 객체를 지정하여 지루하게 반복되는 JDBC API 사용과 응답 결과를 객체로 매핑하는 일을 대신 해줍니다
    하지만 결국 SQL은 사용자가 직접 작성해야하니, SQL 의존적인 개발 방식

  • ORM
    위에서 소개한 내용들이다 
    객체와 RDBMS을 매핑하여 데이터베이스 패러다임과의 간극을 극복하고 객체지향적으로 사용하기 위한 기술이다
    하지만 모든 것을 다해준다고 RDBMS를 몰른다고 생각하면 안된다.. 오히려 더 잘 알아야한다
728x90
반응형

'Study > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

6장. 다양한 연관관계 매핑  (0) 2021.09.13
5장. 연관관계 매핑 기초  (0) 2021.09.04
4장. 엔티티 매핑  (0) 2021.08.31
3장. 영속성 관리  (0) 2021.08.22