티스토리 뷰

Framework/Spring

[JPA] JPA

DUCKBAE's 2022. 8. 8. 13:59

JPA 를 알기 전에 ORM 부터 알아보자.

 

ORM (Object Relational Mapping)

데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다.

(객체지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.)

즉, 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것이다.

  • 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다.
    예를 들어 ORM 프레임워크를 사용하면 객체를 데이터베이스에 저장할 대 INSERT SQL을 직접 작성하는 것이 아니라 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다.
    그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해서 데이터베이스에 객체를 저장해준다.
  • 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달해주는 것뿐만 아니라 다양한 패러다임의 불일치 문제들도 해결한다.

 

 

등장 배경

SQL 의존적 개발에서 비롯된다.

ORM 기술이 없었던 환경에는 객체 정보를 활용해서 쿼리의 파라미터에 매핑 되는 구조이므로 객체와 쿼리 생성 과정은 아주 강하게 연결되어 있다고 할 수 있다.

이런 관계 특징 상 수정된 요구사항 처리 과정에서 객체의 변경이 곧 쿼리 생성 과정에도 영향을 끼칠 수 밖에 없고, 개발자 입장에서 객체의 수정 + 쿼리 생성 로직을 모두 고려하여 수정 사항을 처리해야 했다.

아래와 같이 Member 객체가 있다고 해보자.

public class Member {
    private int age;
    private String name;
}

create, read 기능을 아래와 같이 작성하였다.

-- insert
INSERT INTO member(age, name) VALUES(26, '김세영');

-- select
SELECT age, name FROM member WHERE name = ?

위와 같이 구현을 완료하였더니 요구사항이 바뀌었다고 한다.

name을 first name 과 last name으로 분리해 달라는 요청이다.

그럼 다시 객체를 변경해보자.

public class Member {
    private int age;
    private String firstName;
    private String lastName;
}

여기서 객체만 변경하면 될까? 아니다.

아래와 같이 SQL 문도 같이 변경해 주어야 한다.

-- insert
INSERT INTO member(age, firstName, lastName) VALUES(26, '김', '세영');

-- select
SELECT age, firsName, lastName FROM member WHERE lastName = ?

이렇게 SQL에 의존적인 개발을 하게 되면 요구사항에 따른 작업을 반복해야 하며, SQL 작성하다 '컴퓨터는 바본가' 라는 생각을 할 정도로 찾지 못하는 에러를 만들수도 있다.

 

장점

객체 지향적인 코드로 인해 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다.

  • SQL Query가 아닌 메서드로 데이터를 조작할 수 있다.
  • 객체 지향적인 접근으로 생산성이 증가한다.

 

재사용 및 유지보수의 편리성이 증가한다.

  • 독립적으로 작성되어있고 해당 객체들을 재활용 할 수 있다.

 

DBMS에 대한 종속성이 줄어든다.

  • 객체 간 관계를 바탕으로 SQL을 자동으로 생성한다.
  • 프로그래머는 객체에 집중하므로 DBMS를 다루는 큰 작업에도 비교적 적은 리스크와 시간만 소요할 수 있다.

 

단점

완벽한 ORM으로만 서비스를 구현하기 어렵다.

프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.

 


JPA (Java Persistence API)

Java ORM 기술에 대한 API 표준 명세를 의미한다.

ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해서는 JPA를 구현한 ORM 프레임워크를 사용해야 한다.

ORM 프레임워크 종류

  • Hibernate
  • EclipseLink
  • DataNucleus

 

동작 과정

JPA는 어플리케이션과 JDBC 사이에서 동작한다.

개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출해 DB와 통신한다.

https://ultrakain.gitbooks.io/jpa/content/chapter1/chapter1.3.html

 

장점

객체지향적 프로그래밍이다.

데이터베이스에 종속적이지 않다.

 

단점

학습이 어렵고 학습 비용이 높다.

통계쿼리처럼 복잡한 쿼리 사용에는 적합하지 않다.

 

영속성(Persistence)

데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성이다.

영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버린다.

 

참고

https://gist.github.com/taekwon-dev/351f2112993d6e813fc86b2ef0d2d721

https://hanamon.kr/orm%EC%9D%B4%EB%9E%80-nodejs-lib-sequelize-%EC%86%8C%EA%B0%9C/

http://www.incodom.kr/ORM#h_702209f3f35878a32ee91352ddc6bbe7

https://velog.io/@dnjscksdn98/Database-ORM%EC%9D%B4%EB%9E%80

'Framework > Spring' 카테고리의 다른 글

[Spring] Container  (0) 2022.08.17
[JPA] 영속성  (0) 2022.08.09
[JPA] View Table  (0) 2022.07.28
[JPA] Composite Key  (0) 2022.07.22
[Spring] JUnit  (0) 2022.07.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함