JPA를 접하게 되면서
왜 JPA를 공부해야되는지 ??
왜 기업들은 JPA을 쓰고 있는지 ??
의문점을 가졌는데 그러한 의문점에 대해서 설명하려고 글을 작성했습니다.
1) JPA가 나오게 된 배경
현재 나와있는 다양한 에플리케이션을 개발하면서 개발자들은 CRUD용 SQL을 반복해서 작성해야 했고 이런 과정은 비 생산적이었습니다. 그래서 CRUD를 자동으로 생성해주는 도구를 만들어서 사용하기도 했지만 애플리케이션의 요구사항이 추가되는 것 까지는 해결해주지 못했습니다.
객체 모델링을 SQL로 풀어내는 데 너무 많은 코드와 노력이 필요했고, 객체 모델은 점점 데이터 중심의 모델로 변해갔습니다. 많은 개발자들이 이러한 부분을 많이 고민하게 되면서 ORM 프레임워크를 알게 되었고, JPA는 자바 진영의 ORM 기술 표준입니다.
2) 왜 JPA를 사용해야 하는가?
● 생산성
- 위에서 설명했듯이 귀찮고, 비생산적인 CRUD 반복적인 SQL 쿼리를 JPA가 대신 처리해주므로 개발자가 직접 SQL을 작성하지 않게 되었습니다. 이에 따라 생산성이 올라가고 데이터중심의 설계에서 객체 중심의 설계로 변화시킬 수가 있게 되었습니다.
▶ 기존
각 테이블마다 SELECT, INSERT, UPDATE, DELETE 쿼리를 작성해놓고 변경 될때마다 수정해야 됨.
그리고 이를 갖고오기 위해 mybatis 등으로 갖고오고 binding 처리를 해야됨.
▶ JPA
em.persist(); 저장
, em.find(); 조회 등
Entity만 제대로 설계되어 있다면
이러한 단순한 명령어 하나로 저장, 조회 등 CRUD의 전반적인 작업을 가능하게 됨.
● 유지보수
- SQL에 의존적인 개발에서는 엔티티에 필드 하나만 추가해도 CRUD 쿼리에 결과를 매핑하기 위해 전체 SQL을 수정해야만 했습니다. 하지만 JPA에서는 자바 엔티티 클래스에 필드만 추가해도 자동으로 생성되고 매핑이 되므로 유지보수하기에 편리합니다.
* 예시로 USER테이블에 직무코드 컬럼 추가
▶ 기존
INSERT, UPDATE, SELECT SQL를 쿼리를 수정해야되고, USER테이블에 관련된 모든 테이블에 직무코드 컬럼을 추 가해야됨
▶ JPA
해당 USER 테이블에 ENTITY를 추가하면 끝!
● 관계형데이터베이스 객체 사이의 불일치 문제 해결
- 애플리케이션은 발전하게 되면서 내부의 복잡성은 증가하고 있습니다. 복잡성을 제어하지 못하면 유지보수는 어려워지기 마련입니다. 하지만 객체구조를 테이블 구조에 저장하는데에는 한계가 있습니다. 애플리케이션 자바는 객체지향 언어로 개발하고 데이터는 관계형 데이터베이스로 저장해야 한다면 개발자가 중간에서 해결해야 되는 상황이 벌어집니다. 이러한 과정에서 많은 개발자들의 시간낭비와 비용낭비가 발생하게 됩니다.
▶ 상속
- 객체는 상속이라는 기능이 있지만 테이블은 상속이 없다.
그래서 만약 Human 와 Student 을 저장하려면 INSERT문을 두번 써야되는 문제가 있습니다.
EX ) INSERT Human
INSERT Student
하지만 JPA는 이러한 점을 Persist메소드로 해결했습니다.
EX ) Entity로 Student에서 Human을 상속하고
jpa.persist(MEMBER) 만 넣으면 간단하게 해결됩니다.
이러한 예시 처럼 간단하게 JPA는 상속에 있어서 객체지향으로 변경하여 해결했습니다.
▶ 연관관계
- 객체는 참조를 통해 관계를 맺는다.
그러므로 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 맺는다.
마찬가지로 두 Entity를 각각 연결시켜 jpa.find();로 해결합니다.
3) JPA 단점
● 통계쿼리 등 복잡한 쿼리는 구현하기 어려움
- 단순한 명령어 하나로 CRUD 구현이 가능하기 때문에 복잡한 관계의 쿼리를
구현하기는 어려움이 있습니다.
대처방법으로는 mybatis로 따로 쿼리를 작성하여 구현하면 됩니다.
● 학습하기가 어려움
- 기존의 자바 개발자들이 JPA를 공부하기 위해서는 ORM 개념으로 개념 자체를 바꿔야 하기 때문에
생각보다 학습하기 어려운 부분이 있습니다.
● 최적화가 필요
- 자동으로 생성되는 쿼리가 많고, 쓰이지도 않는 불필요한 것들이 생성되어지기 때문에
성능향상을 위해서는 최적화가 필요합니다.
4) 정리
전세계 기업들이 추구하는 것은 이윤입니다. 이윤을 위해서는 비용절감, 상품의 퀄리티를 높이는 방법 등이 있습니다. 이러한 기업 이윤추구와 발전과정에서 저는 동일한 시간에 양질의 퀄리티와 비용절감 효과를 이룰 수 있는 JPA가 나오는 것은 다양한 수순이라고 생각합니다.
JPA는 많은 관계형 데이터베이스와 객체지향의 불일치의 문제를 해결했고, 반복적이고 불 필요한 시간낭비 코드를 줄였습니다. JPA 이러한 점들은 기업들이 추구하는 이윤추구와도 많은 부분에서 일맥상통하다고 생각합니다. 그리하여 최근 기업들은 기존 SQL의존의 JAVA 기술들을 JPA로 업그레이드 하는 추세이며 JPA를 배우는 것은 JAVA 개발자로서 가져야 할 소양이라 생각합니다. 앞으로 JPA를 익힌 부분을 꾸준히 업로드 할 것이며 저의 블로그를 통해 조금이나마 JPA를 알아가셨으면 좋겠습니다.