JPA란 무엇인가

박종현·2022년 5월 14일
0

SpringBoot 개념

목록 보기
3/3
post-thumbnail
  • JPA란 Java Persistance API 이다

    • Persistance : Persistence(영속성) : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미, 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현
    • 자바에 있는 데이터를 영구히 기록할수 있는 환경(스토리지 내 DBMS)에 영구히 저장할수 있도록 하는 환경을 제공하는 API라고 할 수 있음

      API (Application Programming Interface) : 프로그램 사이 데이터 통신 규칙(상하관계가 존재) ↔ Protocol

  • JPA는 ORM 기술이다.

    • ORM(Object Relation Mapping) : 자바 오브젝트를 데이터베이스에 연결하는 방법론이라고 할 수있다.
      Team 테이블
      idint
      namevarchar
      yearvarchar
      Class Team{
      	private Long id;
      	private String name;
      	private String year;
      }
      • 데이터베이스에 있는 세상을 자바 세상에 모델링 한다.
      • 자바의 클래스(엔티티)를 생성하고 데이터베이스 테이블 및 데이터를 생성하는 기법을 ORM이라고 한다. → 이때 필요한것이 JPA 인터페이스
  • JPA 반복적인 CRUD 작업을 생략하게 해준다.

    1. 자바가 연결요청을한다.
    2. 데이터베이스가 세션을 오픈하고 연결이 수립된다.
    3. 조회쿼리를 전송한다.
    4. 데이터를 자바로 돌려준다
    5. 자바 오브젝트로 변경한다.

    위와같은 반복로직을 JPA 함수를통해 처리할 수 있다.

  • JPA 영속성 컨텍스트를 가지고 있다

    • 영속성 : 어떤 데이터를 영구적으로 저장하게 해주는것(데이터베이스)
    • 컨텍스트 : 대상에 대한 모든 정보 → 영속성 컨텍스트는 자바가 데이터베이스에 데이터를 저장하고, 가져오거나 삭제하는 일련의 모든 과정과 정보라고 할 수 있음
      • 자바 → 영속성 컨텍스트 → 데이터베이스
      • 데이터베이스 → 영속성 컨텍스트 → 자바
      • 자바의 객체와 자바의 영속성 컨텍스트에 있는 정보(데이터)와 데이터베이스의 정보가 동기화 됨

        자바의 객체정보의 name을 수정 → 영속성 컨텍스트에 반영 →DB상의 name과 불일치 → update 쿼리를 실행하여 DB 상의 name 업데이트 → 객체-영속성컨텍스트-DB 모든 정보 동기화 완료

  • JPA 는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다(DB는 객체 저장 불가능)

    • ORM(JPA)로 자바가 주도권을 쥐게 된다.
    • DB는 객체저장이 불가능하지만, 자바는 객체저장이 가능하기 때문
    • 즉, 자바에서 객체저장을 하고 JPA가 그 객체의 FK를 넣어 DB에 저장해준다.
      public class Team {
          
          private int id;
          private String name;
          private String year;
      }
      
      public class Player {
          
          private int id;
          private int name;
      //    private int teamId; // FK로 teamId 를 가져올 경우 두번의 select쿼리, 혹은 조인으로 팀 데이터를 가져와야함
      		private Team team; // JPA를 통해 자바가 주도권을 가지고 객체방식으로 저장 가능
      }
  • JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다(컴포지션,상속, 연관관계)
    • 만약 Engine(엔진)과 Car(자동차)가 있다고 하면, 자동차는 엔진이 필요하다.
    • 하지만! 상속은 ❌, 상속은 부모-자식 관계인데 Engine과 Car은 그 관계가 성립하지 않는다.
    • 따라서 콤포지션(결합)을 한다.
      Class Car {
      		int id;
        	String name;
        	String color;
        	Engine engine; // 콤포지션
      }
      
      Class Engine {
      		int id;
      		int power
      }
    • JPA는 1. 클래스를 만들고 2. 자동생성하여 데이터베이스 테이블을 만든다.
    • 따라서, 위의 코드가 실행되면 Car테이블과 Engine테이블까지 자동생성되어 만들어진다. → OOP관점 (Object-Oriented Programming)
      CarEngine
      idnamecolorengine_Ididpower
      1R8black212000
      2Eclasswhite124000
      Class BaseEntity {
      		LocalDateTime createdAt;
      		LocalDateTime updatedAt;
      }
      
      Class Car extends BaseEntity {
      		int id;
        	String name;
        	String color;
        	Engine engine; 
      }
      
      Class Engine extends BaseEntity{
      		int id;
      		int power
      }
  • 방언 처리가 용이하여 Migration하기 좋음, 유지보수에도 좋음
    • 방언 종류 : MySQL, MariaDB, Oracle, PostgreSQL ...
    • JPA는 추상화 객체를 두고 DB로 연결
    • JPA는 추상화 객체만 바라보고 있기 때문에 방언 바뀌어도 상관 없이 DB 연결하여 사용 가능

0개의 댓글