JPA의 탄생이유를 알아보기 위해 JPA가 없었던 시대로 돌아가보자
public class Member{
private String memberId;
private String name;
// 생략
}
# CRUD
INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES
SELECT MEMBER_ID, NAME FROM MEMBER M
UPDATE MEMBER SET ... # 생략
public class Member{
private String memberId;
private String name;
private String phoneNumber;
// 생략
}
# CRUD
INSERT INTO MEMBER(MEMBER_ID, NAME, PHONE_NUMBER) VALUES // 수정
SELECT MEMBER_ID, NAME, PHONE_NUMBER FROM MEMBER M // 수정
UPDATE MEMBER SET ...PHONE_NUMBER // 수정
이렇기때문에 SQL에 의존적인 개발을 피하기 어려웠다.
즉, SQL의 변환하는 SQL 매퍼 = 개발자 였다.
상속관계의 패러다임이 다르다는 것은 알았다. 그럼 이제 이게 무슨 연관이 있는지 알아보자
member.getTeam()
JOIN ON M.TEAM_ID = T.TEAM_ID
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 컬럼 사용
}
문제는 이것뿐만이 아니다.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
member.getTeam(); //OK
member.getOrder(); //null
member.getOrder().getDelivery(); // null
memberDAO.getMember(); //Member만 조회
memberDAO.getMemberWithTeam();//Member와 Team 조회
memberDAO.getMemberWithOrderWithDelivery();//Member,Order,Delivery 조회
물리적으로는 분할이 되어 있으나, 논리적으로는 연관되어있는 상태
즉, 진정한 의미의 계층 분할이 어렵다.
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //다르다.
class MemberDAO {
public Member getMember(String memberId) {
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
...
//JDBC API, SQL 실행
return new Member(...); // 새로만들어서 데이터 매핑
}
}
객체답게 모델링 할수록 매핑 작업만 늘어난다.
컬렉션에 저장해서 조회하는 형태로 되면, 같은 인스턴스를 사용할 수 있게 된다.
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; //같다.
Album album = list.get(albumId);
Item item = list.get(albumId);
즉, 쿼리문에 대한 결과를 list에 보관만 잘해주면된다.