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

[JPA] 자바 ORM 표준 JPA 프로그래밍_1장

by ChaSso 2023. 5. 20.

1장 JPA 소개

∘ 객체 지향의 장점을 포기하고 단순히 테이블에 맞추어 데이터 전달 역할만 하도록 개발하는지 의문

∘ 객체와 관례형 데이터베이스의 차이(패러다임의 차이. 둘은 다른 역할을 가지니까.)로 인해 객체 모델이 데이터 중심의 모델로 바뀌었음

∘ ORM(Object Relational Mapping) 프레임워크 : 객체와 관계형 데이터베이스 간의 차이를 중간에서 해결해줌

∘ JPA : 자바 진영의 ORM 기술 표준

  - CRUD SQL을 알아서 처리해줌

  - 객체 모델링과 관계형 데이터베이스 사이의 차이점 해결

  - 실행 시점에 자동으로 SQL을 만들어서 실행

  - 조회된 결과를 객체로 매핑하는 작업도 대부분 자동으로 처리해줌

  - 객체 중심으로 개발  생산성 향상, 유지보수 용이

  - 데이터베이스 변경이 쉬움

 

1.1 SQL을 직접 다룰 때 발생하는 문제점

∘ 데이터베이스에 데이터를 관리하기 위해 SQL 사용

∘ 자바 애플리케이션은 JDBC API를 사용해서 SQL을 데이터베이스에 전달

 

1.1.1 반복, 반복, 그리고 반복

∘ 객체를 데이터베이스에 CRUD하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야 됨

객체를 자바 컬렉션에 보관한다면 코드 한 줄로 가능

∘ 데이터베이스는 데이터 중심의 구조를 가지므로 객체 구조와는 다름  개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 해야 됨

 

1.1.2 SQL에 의존적인 개발

∘ 객체를 자바 컬렉션이 아닌 데이터베이스에 보관하면 단순히 필드를 추가할 때도 많은 코드를 수정해야 됨

∘ SQL에 모든 것을 의존하면 엔티티를 신뢰하고 사용할 수 없고 DAO를 열어서 확인해봐야 됨

 

1.1.3 JPA와 문제 해결

∘ JPA를 사용하면 객체를 데이터베이스에 저장하고 관리할 때 SQL이 아닌 JPA가 제공하는 API를 사용하면 됨

  - JPA가 개발자 대신에 SQL을 생성해서 데이터베이스에 전달함

∘ JPA가 제공하는 CRUD API

  - 저장 기능 : persist()

  - 조회 기능 : find()

  - 수정 기능 : UPDATE SQL

  - 연관된 객체 조회 : SELECT SQL

 

1.2 패러다임의 불일치

∘ 참조하는 객체가 있는 경우에 객체 저장에 어려움이 있음

∘ 관계형 데이터베이스에 객체를 저장하는 것이 해결 방법인데 데이터베이스에는 추상화, 상속, 다형성 같은 객체지향의 기능들이 없음

객체와 관계형 데이터베이스의 패러다임 불일치 : 객체와 관계형 데이터베이스는 지향하는 목적이 달라 기능과 표현 방법도 다름 객체 구조테이블 구조에 저장하는 데는 한계가 있음

JPA를 사용하지 않고는 패러다임 불일치 해결을 위해 너무 많은 자원 소비

 

1.2.1 상속

테이블에는 객체 지향에서의 상속 기능 없음

∘ JPA를 이용하면 자바 컬렉션에 객체를 저장하듯이 JPA에 객체 저장하면 됨

 

1.2.2 연관관계

객체는 참조를 이용해서 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회함

테이블은 외래 키를 사용해서 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회함

∘ 객체는 참조가 있는 방향으로만 조회 가능, 테이블은 외래 키 하나로 양방향 가능

 

객체를 테이블에 맞추어 모델링

∘ 객체를 테이블에 맞추어 모델링하면 연관된 객체를 찾으려면 연관된 객체의 참조를 보관해둬야 함

∘ 외래 키까지 관계형 데이터베이스가 사용하는 방식에 맞추면 객체 지향의 특징을 잃음

 

객체 지향 모델링

객체 모델은 외래 키카 필요 없고 참조만 있으면 됨 & 테이블은 참조가 필요 없고 외래 키만 있으면 됨

   개발자가 중간에서 변환 역할을 해야 함

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘ 

∘