[JPA] 왜 JPA 사용하는지에 대한 정리 1
초기 환경 세팅
Spring Boot 2.6.4
Build : Gradle Project
Language : JAVA
DB : MySQL
Library : Lombok, Spring Web, Spring JPA, Thymleaf, devtools
ABOUT JPA
1) SQL 중심적인 개발
만약에 회원테이블에 ‘연락처 컬럼’를 추가해주세요 요청을 받는다면 객체 필드 추가와 쿼리 변경 모두 다 확인하고 수정해야한다.
SQL에 의존적인 개발을 진행해왔다.
2) 객체 VS 관계형 데이터 베이스
객체를 관계형 데이터 베이스에 저장하기 위해선
객체 - SQL 변환 -> SQL+RDB 의 과정으로 개발자가 SQL 매퍼 역할을 하고 SQL 작성을 모두 해주어야한다.
객체와 관계형 데이터 베이스의 차이
- 상속 ( 객체의 상속관계 vs 테이블의 슈퍼타입, 서브타입 관계)
- 연간관계
- 데이터 타입
- 데이터 식별 방법
연관 관계
- 객체는 참조를 사용 : member.getTeam();
- 테이블은 외래키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID
- 객체는 팀에서 멤버를 못가는데 테이블은 객체와 다르게 반대로도 접근가능
객체를 테이블에 맞추어 보통 모델링 (아래)
class Member{
String id; // 멤버 아이디 컬럼
Long teamId; // 팀아이디 fk 컬럼 사용
String username; // username 컬럼 사용
}
class Team{
Long id; // 팀아이디 pk 사용
String name; // Name 컬럼 사용
}
객체다운 모델링
class Member{
String id; // 멤버 아이디 컬럼
// Long teamId; // 팀아이디 fk 컬럼 사용
Team team;
String username; // username 컬럼 사용
Team getTeam() {
return team;
}
// -> insert 시 member.getTeam().getId(); 로 가져와서 넣음
}
class Team{
Long id; // 팀아이디 pk 사용
String name; // Name 컬럼 사용
}
객체 모델링 조회
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID
public Member find(String memberId){
//sql 실행...
Member member = new Member();
//데이터 베이스에서 조회한 회원 관련 정보를 모두 입력
Team team = new Team();
//데이터베이스에서 조회한 팀 관련 정보를 모두 입력
//회원과 팀 관계설정을 해야함..
member.setTeam(team);
return member;
}
객체모델링, 자바 컬렉션에서 관리한다면?
list.add(member);
Member member = list.get(memberId);
Team team = member.getTeam();
- 객체 그래프 탐색 : 객체는 자유롭게 객체 그래프를 탐색할 수 있어야한다.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID
- member.getTeam(); //ok
- member.getOrder(); //null
- 이유 : 처음 sql 시 전부 범위가 결정되기 때문에
엔티티 신뢰 문제
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //???
member.getOrder().getDelivery(); //???
}
}
memberDAO의 find에서 뭘했고 무슨 sql 동작으로 조립했는지 모르기때문에 사용할 수 없음
계층형 아키텍처 분할이 어렵다.
비교
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; // 같다 !!!!!
객체답게 모델링할수록 매핑작업만 늘어나는것이다.
객체를 자바 컬렉션에 저장하듯이 DB에 저장하는 방법에 대한 고민 => JPA ! 다음장에 계속…
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모