SQL 중심 개발의 문제점
SQL : 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.
애플리케이션에서는 주로 객체 지향 언어(JAVA)
데이터베이스에서는 관계형 DB를 사용하는데,
이 두 가지는 구조와 동작 방식이 다르다. 즉 패러다임의 불일치가 일어난다.
따라서 객체를 SQL로 변환하여 DB에 저장하는데, 이 과정을 개발자가 수행하게 된다.
이 때 문제점은 객체마다 CRUD에 맞게 SQL로 변환하려면 지루한 반복을 계속해야 하며, 변경, 확장시에도 수많은 코드를 변경해야하는 불편함이 있다.
즉 SQL에 의존적인 개발을 해야만 하는 상황이 발생한다.
객체와 관계형 데이터 베이스의 차이
1. 상속
(출처: 인프런 김영한 자바ORM 표준 JPA-기본편 수업자료)
DB에는 객체지향 언어의 상속관계와 같은 구조는 존재하지 않는다.
때문에 객체를 저장하고 조회하는 과정에서 다양하고 복잡한 문제가 발생한다.
이 때문에 우리가 객체지향 언어에서 당연하게 여기는 것들이 DB에서는 성립되지 않는다.
DB에서 Member을 가져왔을 때 객체지향 언어에서는 참조값인 Team 도 Member.getTeam을 통해 가져올 수 있어야 하지만,
실제로는 따로 Team 도 가져오지 않으면 Team에 대한 정보는 조회할 수 없다. 또 가져왔을 때도 Team과 Member에 대한 관계를 다시 설정해줘야 한다.
같은 맥락에서 객체는 자유롭게 객체 그래프를 탐색할 수 있어야하는데 이게 불가능해진다.
예를 들면 Member로 OrderItem을 찾을 때
Member.getOrder().getOrderItem() 이렇게 탐색할 수 있다.
이런 객체지향과 RDB의 차이로 발생하는 불편함들을 해결하기 위해 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있는 방법을 고안해 왔고 그 결과가 JPA이다.
JPA
JPA는 인터페이스의 모음
-> 구현체 : 하이버네이트, EclipseLink, DataNucleus
왜 JPA를 사용해야 하는가?
SQL 중심적인 개발에서 객체 중심으로 개발
생산성
기존 SQL과 비교했을 때 CRUD 면에서 말도 안되는 편리함을 제공한다.
• 저장: jpa.persist(member)
• 조회: Member member = jpa.find(memberId)
• 수정: member.setName(“변경할 이름”)
• 삭제: jpa.remove(member)
특히 UPDATE에서 그냥 변경만 해도 알아서 데이터베이스를 최신화해준다.
-> 유지보수 용이
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member1 = memberDAO.getMember(memberId);
//기존 코드, sql로 member를 가져오는 코드라고 가정
member1 !=member2 // 둘은 다르다
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다.