초기 환경 세팅

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 테이블의 슈퍼타입, 서브타입 관계)
  • 연간관계
  • 데이터 타입
  • 데이터 식별 방법

JPA1

연관 관계

  • 객체는 참조를 사용 : 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();


  • 객체 그래프 탐색 : 객체는 자유롭게 객체 그래프를 탐색할 수 있어야한다.

JPA2

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 기본 강의 및 교재

🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

개인메모

태그:

카테고리:

업데이트: