java는 관계형 언어이고, 데이터베이스도 관계형 데이터베이스인데 sql에 종속적인 시스템이 옳은가?
JPA를 사용하는 이유
1. 상속관계
위의 ERD에서 Item과 Album 데이터를 입력 할 때 mybatis를 사용한다면 2개의 쿼리가 필요하다.
INSERT INTO ITEM(ID, NAME, PRICE) VALUES(...);
INSERT INTO ITEM(ITEM_ID, ID, ARTIST) VALUES(...);
조회 할 때는 최소 세개 이상의 select 쿼리가 필요하다.
-- Item, Album 조회
SELECT A.*, B.* FROM ITEM AS A LEFT JOIN ALBUM AS B ON A.ID = B.ID;
-- Item, Movie 조회
SELECT A.*, B.* FROM ITEM AS A LEFT JOIN MOVIE AS B ON A.ID = B.ID;
-- Item, Book 조회
SELECT A.*, B.* FROM ITEM AS A LEFT JOIN BOOK AS B ON A.ID = B.ID;
위의 테이블 구조에서 컬럼이 추가된다면, 이 테이블을 사용하는 모든 쿼리문을 확인해야 한다.
2. 연관관계
2.1 입력
객체는 참조를 통해 연관관계를 설정하지만, DB에서는 PK와 FK를 통해 연관관계를 설정한다.
DB의 구조를 class화 시키면 아래와 같다.
class Member {
String id;
String username;
// team
Team team;
}
class Team {
long teamId;
String teamname;
}
Member를 DB에 넣는 쿼리는 아래와 같을텐데, TEAM_ID의 데이터를 넣기 위해선 member.getTeam().getTeamId()를 호출해야 하므로 코드가 번잡해진다.
INSERT INTO MEMBER(MEMEBER_ID, USERNAME, TEAM_ID) VALUES(...)
2.2 조회
또한 Member를 조회할 경우 조인이 포함된 SQL을 실행 후 그 결과값을 코드내에서 다시 설정해줘야하는 번거로움이 있다.
3 객체 그래프 탐색
추가적으로 Member 클래스가 다른 참조 클래스(OtherClass)를 갖고 있다고 가정하고,
SQL에서 Member와 Team만 조인하여 조회했다면 member.getOtherClass().getId()의 값는 null이다.
즉 SQL에 의해 탐색 범위가 결정되고, 이 entity에 대한 신뢰성을 보장하기 어렵다.
그래서 다른 개발자가 작성한 코드를 봐야하는 불편함이 생긴다.
이 문제를 해결하기 위해 모든 정보를 다 조회한다면?
SQL은 더욱 복잡해질 것이며, 모든 데이터를 조회해야 하므로 성능 또한 보장하기 어렵다.
4. 데이터 식별 방법
String id = "100";
Member member1 = memberDAO.getMember(id);
Member member2 = memberDAO.getMember(id);
class MemberDAO {
public Member getMemeber(String id) {
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?"
// ... JDBC
return new Member(...);
}
}
위 코드에서 member1 == member2의 결과값은 어떨까?
데이터는 같지만, 새로운 인스턴스 이므로 당연히 다르다.
String id = "100";
Member memeber1 = memberList.get(id)
Member memeber2 = memberList.get(id)
위 코드에서 member1 == member2의 결과값은 어떨까?
같은 인스턴스가 반환되므로 true가 나온다.
이 문제들을 보면 객체지향적으로 코드를 설계할 경우 매핑 작업만 늘어나는 문제가 있다.
이런 고민의 결과로 객체를 자바 컬렉션에 저장 하듯이 DB에 저장하기 위해 JPA(Java Persistence API)를 사용한다.
최근 트랜드
지난 5년간의 google trend를 보면 JPA를 사용하는 사용자가 많이 증가했음을 볼 수 있다.
또한 mybatis, ibatis를 넘어선 것을 볼 수 있다.
Reference
자바 ORM 표준 JPA 프로그래밍(인프런, 김영한)
'framework > jpa' 카테고리의 다른 글
[JPA] 엔티티 매핑 3 (0) | 2023.04.23 |
---|---|
[JPA] 엔티티 매핑 2 (0) | 2023.04.09 |
[JPA] 엔티티 매핑 1 (0) | 2023.04.08 |
[JPA] 기본 사용 방법 (0) | 2023.04.07 |
[JPA] JPA 사용 이유 및 개념 정리 (0) | 2023.04.07 |