자바 ORM 표준 JPA 프로그래밍 - 기본편(1)

bin1225·2021년 9월 28일
0

JPA

목록 보기
1/12
post-thumbnail

SQL 중심 개발의 문제점

  • SQL : 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
    많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.

    애플리케이션에서는 주로 객체 지향 언어(JAVA)
    데이터베이스에서는 관계형 DB를 사용하는데,

    이 두 가지는 구조와 동작 방식이 다르다. 즉 패러다임의 불일치가 일어난다.

    따라서 객체를 SQL로 변환하여 DB에 저장하는데, 이 과정을 개발자가 수행하게 된다.
    이 때 문제점은 객체마다 CRUD에 맞게 SQL로 변환하려면 지루한 반복을 계속해야 하며, 변경, 확장시에도 수많은 코드를 변경해야하는 불편함이 있다.
    즉 SQL에 의존적인 개발을 해야만 하는 상황이 발생한다.

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

  • 1. 상속

    출처: 인프런 김영한 자바ORM 표준 JPA-기본편 수업자료

    	(출처: 인프런 김영한 자바ORM 표준 JPA-기본편 수업자료)

DB에는 객체지향 언어의 상속관계와 같은 구조는 존재하지 않는다.
때문에 객체를 저장하고 조회하는 과정에서 다양하고 복잡한 문제가 발생한다.

  • 2. 연관관계

    객체는 참조키를 사용 : Member.getTeam();
    테이블은 왜래 키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_I

이 때문에 우리가 객체지향 언어에서 당연하게 여기는 것들이 DB에서는 성립되지 않는다.

DB에서 Member을 가져왔을 때 객체지향 언어에서는 참조값인 Team 도 Member.getTeam을 통해 가져올 수 있어야 하지만,
실제로는 따로 Team 도 가져오지 않으면 Team에 대한 정보는 조회할 수 없다. 또 가져왔을 때도 Team과 Member에 대한 관계를 다시 설정해줘야 한다.

같은 맥락에서 객체는 자유롭게 객체 그래프를 탐색할 수 있어야하는데 이게 불가능해진다.

예를 들면 Member로 OrderItem을 찾을 때
Member.getOrder().getOrderItem() 이렇게 탐색할 수 있다.


이런 객체지향과 RDB의 차이로 발생하는 불편함들을 해결하기 위해 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있는 방법을 고안해 왔고 그 결과가 JPA이다.

JPA

  • JPA : Java Persistence API
  • ORM : Object-relational mapping(객체 관계 매핑)
    - 객체는 객체대로, RDB는 RDB대로 설계하고 ORM 프레임워크가 중간에서 매핑
    - 대중적인 언어에는 대부분 ORM기술이 존재한다.

JPA는 인터페이스의 모음
-> 구현체 : 하이버네이트, EclipseLink, DataNucleus

왜 JPA를 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발

  • 생산성
    기존 SQL과 비교했을 때 CRUD 면에서 말도 안되는 편리함을 제공한다.
    • 저장: jpa.persist(member)
    • 조회: Member member = jpa.find(memberId)
    • 수정: member.setName(“변경할 이름”)
    • 삭제: jpa.remove(member)

특히 UPDATE에서 그냥 변경만 해도 알아서 데이터베이스를 최신화해준다.
-> 유지보수 용이

  • 객체와 JPA의 패러다임 불일치 해결
    차이점에서 정리한 상속, 연관관계, 그래프 탐색 문제를 모두 해결
    기존에 JPA와 객체의 비교결과 차이 오류
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member1 = memberDAO.getMember(memberId);
//기존 코드, sql로 member를 가져오는 코드라고 가정
member1 !=member2 // 둘은 다르다

String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다.
  • JPA의 성능 최적화 기능
  1. 1차 캐시와 동일성(identity) 보장
  2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    - 트랜잭션을 커밋할 때까지 INSERT SQL을 모았다가 한 번에 전송함으로써 효율성을 극대화 한다.
  3. 지연 로딩(Lazy Loading)
  • 지연 로딩과 즉시 로딩
    • 지연 로딩: 객체가 실제 사용될 때 로딩
    • 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
    둘 다 각각의 장단점이 있다.

0개의 댓글

관련 채용 정보