JPA 가 무엇인가요? -지수민님의 정리내용
JPA란 쉽게 요약하면 자바명령어를 SQL로 번역해주고 SQL을 사용하지 않아도
데이터 생성,조회,수정,삭제(CRUD)를 할수있도록 해주는 번역기라고 말할수있다.
좀 더 자세히 나아가자면 JPA는 자바에서 ORM(object-Relational Mapping) 기술
표준으로 사용되는 인터페이스의 모음이다. 이말은 즉 실제적으로 구현된것이 아니라
구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.
여기서 ORM이란 어플리케이션 Class와 RDB(Relational DataBase)의 테이블을 연결한다는 뜻이며
기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화해주는것이라 생각하면된다.
Hibernate 란 자바의 다양한 ORM 프레임워크 중 가장많이 성숙한 프레임워크이고
이런 Hibernate 기반으로 만들어진 ORM 기술표준이 JPA이다.
즉 JPA라는 ORM 기술 표준을 구현한 것이 Hibernate이므로,
JPA를 사용하려면 Hibernate를 사용하면 된다.
다음은 JPA의 동작 과정을 나타내는 그림이다.
그림을 설명하자면 JPA는 어플리케이션과 JDBC 사이에서 동작한다.
개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓰는 것이 아니다.
Spring Data JPA - Reference Documentation
이링크는 JPA의 공식 홈페이지고 이미 수많은 기능이 존재하고 잘해주고 있다는것을 볼수있다.
이런 JPA도 역시 사용하는데 있어 장점과 단점이 존재한다.
장점
첫번째 : SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨)
두번째 : Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
세번째 : 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
네번째 : 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
다섯번째 : 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음
단점
첫번째 : 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
두번째 : 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음
우리는 이런 장점과 단점을 통해서 다음과 같은 JPA를 사용하는 이유를 알수있다.
JPA는 반복적인 CRUD SQL을 처리해준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.
JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다. 또한 JPA는 패러다임의 불일치도해결하였다. 예를 들면 JAVA에서는 부모클래스와 자식클래스의 관계 즉, 상속관계가 존재하는데 데이터베이스에서는 이러한 객체의 상속관계를 지원하지 않는다.
마지막으로 JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을 전송하여 UPDATE를 실행한다.
추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.
'공부 > 자료조사' 카테고리의 다른 글
Maven vs Gradle (0) | 2022.03.29 |
---|---|
Spring vs Spring Boot (0) | 2022.03.28 |
DNS의 원리 (0) | 2022.03.27 |
restAPI의 put 과 patch 는 어떤 차이점이 있을까요? (0) | 2022.03.26 |
Controller, Service, Repository 가 무엇인가요? (0) | 2022.03.24 |