본문 바로가기
🌐 Language/java

[JPA] JPA(Java Persistence API)

by 깸뽀 2022. 10. 7.
728x90

출처) 어라운드허브 스튜디오 - youtube

💡 ORM

- ORM(Object-Relational Mapping)은 객체와 관계형 DB를 매핑한다는 뜻 (Java 진영에 국한된 기술은 아님)
  • ORM 프레임워크를 사용하면 객체를 마치 자바 컬렉션에 저장하듯 저장할 수 있고, 이에 대해 ORM 프레임워크가 적절한 SQL을 생성해서 DB에 객체를 저장해준다. 즉, 객체가 테이블이 되도록 매핑시켜주는 것을 말한다.
  • ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있다.

예를들어, 

MySQL에서는 SELECT * FROM user; 라는 query를 실행해야 하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때, user.findAll() 라는 메서드 호출로 데이터 조회가 가능하다.

💡 JPA

- JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준으로 어플리케이션과 DB 사이에서 동작
- 직접 JDBC API를 사용하지 않고, JPA를 사용하면 내부에서 JDBC API를 사용하여 SQL을 호출하고 DB를 간접적으로 조작함

 

📌 JPA는 Java Persistence API이다

자바프로그램을 할 때 영구적으로 데이터를 저장하기 위해 필요한 인터페이스
  • 영속성(persistence)은 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다.
  • RAM(휘발성)은 컴퓨터가 꺼지면 데이터가 사라지므로 하드디크스(비휘발성[파일시스템])에 저장해서 영구적으로 저장한다.
  • 자바에서 DBMS를 관리하고 기록한다.

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

<문제점>

1. 객체로 되어있는 Java의 코드를 바로 DB에 적용할 수 없다.

2. DB를 직접적으로 UPDATE를 진행하게 되면 수정 중 오류가 발생하였을 때 데이터베이스의 정보가 원하는 방향으로 모두 수정이 이루어지지 않거나, DB의 정보들이 손상될 수 있다.

 

💻 예시코드 )

@Transactional
public Long update(Long id, CommentUpdateDto commentUpdateDto, User user) {
    Comment comment = commentRepository.findById(id).orElse(null);
    if (comment == null)
          return ErrorCodes.NOT_EXIST;
    else if (!comment.getUser().getId().equals(user.getId()))
         return ErrorCodes.NOT_SAME_USER;
    comment.update(commentUpdateDto.getComment());
      return id;
 }

 

 

 

1. commentRepository에서 우리가 보낸 id와 일치하는 comment 데이터를 가져온다.

2. 해당 comment가 null값이 아닌지, 그리고 해당 comment의 작성자가 현재 요청을 보낸 user와 일치하는지 확인한다.

3. comment를 수정한다. 

 

 

1. 저희는 commentRepository에서 원하는 comment를 찾아온다.

    해당  comment를 찾았으면  Persistence Context에 1차 캐시에 해당  comment를 가져오고 이를 java program에 넘겨준다. 당연하게도 이 시점에서는 1차 캐시에 존재하는 comment object와 DB에 존재하는 comment object가 같다.

2. 반환받은 comment object의 데이터를 원하는 데이터와 비교한다. 오류가 없으면 실제 값을 수정한다.

 

📌 JPA는 반복적인 CRUD 작업을 생략하게 해준다

  • 기본적으로 java가 DB에 connection을 요청한다.
  • DB가 확인하고 권한이 있다면 세션을 오픈하고 java connection을 가진다.
  • JAVA는 DB에 쿼리를 전송할 수 잇다.
  • DB는 쿼리를 받고 Data를 만들어낸다. 하지만 이 Data는 Java에 사용하는 방식이 아니기 때문에  Java Object로 변환해준다.
  • 끝으로 세션을 끊고, connection을 끊는다

==> 이 과정을 JPA가 함수 하나로 해결해준다.

 

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

https://velog.io/@jh83370/JPA%EB%9E%80-2

클래스 Player에서 TeamId만 보고 정확히 아이디만 알고 팀에 대한 정보를 직접적으로 알지 못한다.

Java에서는 기본 자료형이 아닌 Object를 저장 할 수 있 수 있다.

이렇게 클래스를 작성하면 데이터베이스 테이블의 Player와 다른 것이 문제가 된다고 생각이 들 수 있다.

하지만 ORM을 하게되면 모델 생성 시 자바프로그램이 주도권을 갖고있기 때문에 위와 같이 구현이 가능하다. 즉, 데이터베이스와 OPP의 불일치 성을 해결해 준다는 것이다. TEAM객체와 같은 데이터를 insert / select할 때 JPA가 자동으로 넣어준다.

 

=> DB는 객체 저장이 불가능하지만 JAVA프로그램은 객체 저장이 가능하다. JAVA에서 프로그래밍 할 때는 객체를 저장하고 이 객체를 DB에 넣을 때는 JPA가 자동으로 외래키를 넣어준다.

 

📌 OOP의 관점에서 모델링을 할 수 있게 해준다(상속, 콤포지션, 연관관계)

데이터베이스를 먼저 만들고 그 데이터베이스로 만들어진 테이블을 통해서 클래스를 모델링하는 것이 아니다. 먼저 만들고자하는 클래스를 만들고 그 클래스를 토대로 자동 생성해서 데이터베이스 테이블을 만들어 주는 기법이다. OPP의 관점에서 테이블이 생성된다.

 

📌 방언 처리가 용이하여 migration하기 좋음, 유지보수에도 좋다

 스프링 ➡ JPA ➡ DB
  • JPA는 수많은 방언들 (dialect = oracle, mysql, mssql ........) 을 지원해 준다.
  • JPA 추상화 객체를 두고 원하는 DB를 연결하면 바뀐다 (SQL이 자유로움)

 

📌 JPA는 인터페이스로서 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 인터페이스를 구현하기 위해서는 구현체가 필요한데 대표적으로 Hibernate, Eclipse, Link등이 있다.

 

📌 Hibernate(하이버네이트)

하이버네이트는 JPA 구현체의 한 종류이다. JPA 인터페이스를 구현하며 내부적으로는 JDBC API를 사용한다.

매서드 내부에는 JDBC API와의 동작이 연결되어 있으며 개발자가 SQL에 대한 작업보다는 비즈니스 로직에 더 집중할 수 있도록 도와주는 역할을 한다.

 

JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결할 수 있는 점과 영속성 컨텍스트제공이 큰 특징이다.

 

 

 

 

참조

728x90

댓글