JPA는 Java Persistance API로 현재 자바 진영의 ORM 기술 표준입니다. 자바 애플리케이션과 JDBC 사이에서 동작하며 쿼리를 자동으로 생성해줍니다.
ORM: Object-relational mappin(객체 관계 매핑)으로 객체와 관계형 DB를 매핑해주는 프레임워크입니다.
JPA를 사용하기 이전에 개발자들은 SQL문을 일일히 작성해줘야하는 번거로움이 있었습니다. 한 객체를 만들면 그 객체의 CRUD 쿼리를 모두 작성해줘야했는데, 이때 객체가 수십개로 늘어난다면 그만큼 개발자가 작성해야 할 쿼리문이 늘어나 개발 효율이 떨어지게 됩니다. 이런 불편함을 해결해주는 것이 JPA입니다.
SQL중심 개발에서 객체 중심 개발을 하여 생산성을 높일 수 있습니다.
- 저장: jpa.persist(객체)
- 조회: jpa.find(객체_id)
- 수정: 객체.setName("변경할 이름")
- 삭제: jpa.remove(객체)
기존에는 필드 변경 시 모든 쿼리를 수정해야했지만, JPA를 사용하면 JPA가 자동으로 쿼리를 수정하기 때문에 유지보수가 용이합니다.
패러다임의 불일치 해결
해당 내용은 아래에서 더 자세히 다루겠습니다.
데이터베이스는 데이터를 중심으로 구조화 되어있습니다. 따라서 객체의 상속 및 다형성과 같은 개념이 없습니다. 즉, 객체와 데이터베이스가 지향하는 점이 다른데, 이를 객체와 데이터베이스의 패러다임 불일치라고 합니다.
이를 JPA가 대신 해결해줍니다.
예를 들어 위와 같은 상속 관계를 가지는 객체와 DB가 준비되어있습니다.
// 저장.
jpa.persist(album);
// INSERT INTO ITEM ...
// INSERT INTO ALBUM ...
// 조회.
jpa.find(Album.class, albumId);
// SELECT I.*, A.*
// FROM ITEM I
// JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
위와 같이 jpa를 이용해 작업을 진행하면 jpa가 객체의 상속 등 관계에 따라 여러 개의 쿼리를 보내거나 복잡한 쿼리를 만들어 보냅니다.
객체를 테이블에 맞게 모델링 하는 경우와 객체 지향에 따라 모델링하는 경우에 따라 다른 문제가 나타납니다.
객체를 테이블에 맞게 모델링하는 경우, 객체지향이라는 특징을 잃게 되며 모델링이 복잡해집니다.
반대로 객체 지향에 따라 모델링하는 경우, 서로 다른 모양의 객체가 만들어지며, 이를 맞춰가는 코드를 또 한번 작성해야 하는 비용이 요구됩니다.
// 객체를 테이블에 맞게 모델링.
class Member {
String id; //MEMBER_ID 컬럼 사용
Long teamId; //TEAM_ID FK컬럼 사용
String username; //USERNAME 컬럼 사용
}
class Team {
Long id; //TEAM_ID PK사용
String name; //NAME 컬럼 사용
}
// 객체지향 모델링.
class Member {
String id; // MEMBER_ID 컬럼 사용
Team team; // 참조로 연관관계를 맺음
String username; // USERNAME 컬럼 사용
Team getTeam() {
return team;
}
}
class Team {
Long id; // TEAM_ID PK 사용
String name; // NAME 컬럼 사용
}
-> 두 객체를 연결하기 위한 추가적인 코드가 많이 필요함.
하지만 JPA를 사용한다면 객체 지향 모델링을 사용하며 두 객체의 관계를 쉽게 맺을 수 있습니다.
member.setTeam(team);
jpa.persist(member);
아래와 같은 객체 그래프가 있습니다.
객체 그래프는 서로 연관된 객체를 참조해서 사용할 수 있어야합니다. 즉, 주문이 멤버와 배달을 참조하여 사용할 수 있어야 한다는 의미입니다.
하지만 SQL을 직접 다루면 처음 실행하는 SQL문에 따라 그래프 탐색이 한정됩니다. JPA는 객체 그래프를 마음껏 탐색할 수 있습니다.
아직 개념만 본 상태고 직접 코드를 작성해보지 않아 모든 개념이 완벽하게 와닿지 않은 느낌을 많이 받은 상태로 정리하고, 정리한걸 보고 작성한 글이라 미숙한 부분이 많습니다..😥
앞으로 JPA에 대해 공부해나가며 더 자세한 개념과 코드 작성법에 대해 정리해나갈 예정입니다🤗