JPA의 대해서 알아봅니다.
JDBC
데이터의 세계는 10~20년 동안 급속도로 발전하였습니다. 데이터가 증가함에 따라 더 빠른 처리기술과 특수 스토리지가 발명되었습니다. 하지만 발전되는 여러 스토리지기술은 구성 및 방법, 서로 다른 API를 규격을 사용하였고 JDBC라는 기술이 등장하여 SQL 데이터 저장소의 전반적인 표준화를 제공하였습니다.
JPA
자바 개발자들은 JPA등장 이전에는 JDBC API를 사용하여 관계형 데이터베이스를 쿼리를 하였습니다. JDBC를 사용하면 기본 SQL 쿼리를 사용하였고 개발자가 SQL 문을 작성하는 것은 많은 반복과 오류가 발생하기가 쉬웠습니다. 또한 데이터베이스를 변경할 때 쿼리 구문이 변경될 가능성이 있습니다.
public class Member {
private Long memberId;
private String name;
...
}
INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES
SELECT MEMBER_ID, NAME FROM MEMBER M
UPDATE MEMBER SET ...
public class Member {
private Long memberId;
private String name;
private String email;
...
}
INSERT INTO MEMBER(MEMBER_ID, NAME, EMAIL) VALUES
SELECT MEMBER_ID, NAME, EMAIL FROM MEMBER M
UPDATE MEMBER SET EMAIL = ? ...
객체 vs 관계형 데이터베이스
객체를 저장하는 다양한 저장소
객체를 관계형 데이터베이스에 저장
객체
관계형 데이터베이스
객체
테이블
class Member{
private String id; //MEMBER_ID 컬럼 사용
private Long teamId; //TEAM_ID FK 컬럼 사용
private String userName;
}
class Team{
private Long id;//TEAM_ID PK 컬럼 사용
private String name;
}
INSERT INTO MEMBER (MEMBER_ID, TEAM_ID, USERNAME) VALUES ...
class Member{
private String id; //MEMBER_ID 컬럼 사용
private Team team; //참조로 연관관계를 맺습니다.
private String userName;
}
class Team{
private Long id;//TEAM_ID PK 컬럼 사용
private String name;
}
teamId는 member.getTeam().getId()로 조회했습니다.
INSERT INTO MEMBER (MEMBER_ID, TEAM_ID, USERNAME) VALUES ...
멤버와 팀을 조인후 데이터를 불러옵니다.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
DB에서 조회후 객체에 값을 넣습니다.
public Member find(Strubg memberId) {
// SQL 실행하고
Member member = new Member();
// DB에서 조회한 회원 관련 정보를 모두 입력하고
Team team = new Team();
// DB에서 조회한 팀 관련 정보를 모두 넣고,
// 회원과 팀 관계 설정
member.setTeam(team);
return member;
}
객체 모델링을 자바컬렉션에 관리
객체는 자유롭게 객체 그래프를 탐색할 수 있습니다.
DB에서는 멤버와 팀, 멤버와 오더를 조회할 수 있습니다.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
member.getTeam() //조회가능
memeber.getOrder() //SQL문의 범위에 없음
아래와 같이 엔티티 신뢰 문제가 발생합니다.
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //???
member.getOrder().getDelivery(); //???
}
}