JPA란?
JPA(Java Persistance Api)는 간단하게 데이터에 접근하기 위한 API의 규격을 정의한 것이다.
JPA는 ORM에 속하기 때문에 ORM을 먼저 알아야 할 필요가 있다.
ORM이란?
ORM(Object Relational Mapping)은 뜻 그대로 객체와 데이터베이스 사이의 관계를 연결해주는 것이다.
객체지향 프로그래밍은 class 를 사용하고 관계형 데이터베이스는 Table을 사용한다.
객체 모델과 관계형 모델간의 불일치가 존재할 수 있는데 이 때 ORM을 통해 객체간의 관계를 바탕으로 SQL을 자동
생성해 불일치를 해결하게 된다.
그래서 ORM을 Persistant API 라고도 할 수 있다.
ORM의 장점으로는 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 집중 할 수 있도록 도와준다.
ORM을 이용하게 되면 SQL Query가 아닌 메소드로 데이터를 조작할 수 있어 개발자가 객체 모델로 프로그래밍하는데
집중할 수 있게 된다.
선언문, 할당, 종료와 같은 부수적인 코드가 없거나 급격히 줄어들게 되며 각종 객체에 대한 코드를 별도로 작성하기
때문에 코드의 가독성을 올려준다.
그리고 ORM은 독립적으로 작성되어 있고 해당 객체들을 재활용 할 수 있기 때문에 재사용 및 유지보수의 편리성이
증가한다.
그렇기 때문에 모델에서 가공된 데이터를 컨트롤러에 의해 뷰와 합쳐지는 형태로 디자인 패턴을 견고하게 다지는데
유리하다.
DBMS에 대한 종속성도 줄어들게 되는데 객체간의 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDBMS의
데이터 구조와 Java의 객체지향 모델 사이의 간격을 좁힐 수 있다.
종속성이 줄어들기 때문에 개발자는 Object에 집중하고 DBMS를 교체하는 작업에도 비교적 적은 리스크와 시간이
소요된다.
또한 자바에서 가공하는 경우엔 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있으며 간결하고
빠른 가공이 가능하다.
단점은 ORM으로만 서비스를 구현하기가 어렵다.
사용하기는 편하지만 설계를 매우 신중하게 해야하며 프로젝트의 복잡성이 커질수록 난이도가 올라갈 수 있다.
구현이 잘못된 경우에는 속도 저하가 발생할 수 있고 심각한 경우 일관성이 무너지는 문제점이 생길 수 있다.
일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는 등 별도의 튜닝이 필요한 경우가 있다.
그리고 DBMS 의 고유 기능을 이용하기 어려운데 이것은 마냥 단점으로만 보기 어려운게 특정 DBMS의 고유기능을
이용하면 이식성이 저하될 수 있기 때문이다.
프로시저가 많은 시스템에서는 다시 객체로 바꿔야 하며 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있기
때문에 ORM의 객체 지향적인 장점을 활용하기가 어렵다.
세분성(Granularity), 상속성(Inheritance), 일치(Identity), 연관성(Associations), 탐색(Navigation)등의 특성에서
객체-관계간의 불일치가 생긴다.
세분성은 경우에 따라 데이터베이스에 있는 테이블의 수보다 더 많은 클래스를 가진 모델이 생길 수 있다는 것이고
상속성은 RDMBS는 객체지향 언어의 특징인 상속의 개념이 없는 것이다.
일치는 RDBMS에서는 기본키(primary key)를 이용해 동일성을 정의하지만 자바에서는 객체식별(a == b)와 객체
동일성(a.equals(b))을 모두 정의 하는데에서 발생하는 차이다.
연관성은 객체지향 언어에서는 방향성이 있는 객체의 참조(reference)를 사용하여 연관성을 나타내지만 RDMBS에서는
방향성이 없는 외래키(foreign key)를 이용해서 나타내는 점이다.
탐색은 자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다른 것이다. 자바는 그래프 형태로 하나의 연결에서
다른 연결로 이동하며 탐색하지만 RDBMS에서는 일반적으로 SQL문을 최소화 하고 JOIN을 통해 여러 Entity를
로드하고 원하는 대상 Entity를 선택하는 방식으로 탐색한다.
간단하게 정리하자면 ORM의 장점은 완벽한 객체지향적인 코드, 재사용, 유지보수, 리팩토링의 용이성, DBMS의
종속성 하락이 있으며 단점으로는 ORM으로만 모든것을 해결 할 수 없는것과 세분, 상속성, 연관성 등에서 오는
객체-관계 간의 불일치가 있다.
JPA란?
그럼 JPA란 '데이터에 접근하기 위한 API의 규격을 정의한 것이다.'라고 했다.
JPA는 자바 진영의 ORM 기술 표준으로 인터페이스의 모음이다.
인터페이스이기 때문에 Hibernate, OpenJPA등이 JPA를 구현한다.
ORM이 전체적인 개념이라고 한다면 JPA는 좀 더 구체적으로 그 기능을 정의했다고 볼 수 있다.
JPA를 사용하게 되면 객체를 DB에 저장하고 관리할 때, 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를
자동으로 Mapping해주기 때문에 개발자가 직접 SQL을 작성하지 않아도 된다.
JPA는 내부적으로 JDBC API를 활용하는데 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로
인해 효율성이 떨어지게 된다. 이때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는
점에서 생산성을 크게 높여준다.
JPA는 반복적인 CRUD SQL을 처리해주기 때문에 개발자는 어떤 SQL이 실행될지 생각만 하면 된다.
그리고 JPA는 Native SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 직접
SQL을 작성해 사용할 수도 있다.
JPA를 사용해 얻을 수 있는 가장 큰 것은 SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다.
Reference
ORM
https://gmlwjd9405.github.io/2019/02/01/orm.html
[DB] ORM이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
https://geonlee.tistory.com/207
ORM(Object Relational Mapping)이 뭘까? 🤔
ORM이란? ORM은 Object Relational Mapping 즉, 객체-관계 매핑의 줄임말이다. 객체-관계 매핑을 풀어서 설명하자면 우리가 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(R..
geonlee.tistory.com
JPA
https://velog.io/@jwkim/JPA-JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
[JPA] JPA란 무엇인가?
[JPA] JPA란 무엇인가?
velog.io
[Spring JPA] JPA 란?
이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이
dbjh.tistory.com