본문으로 바로가기

[JPA] 01 JPA 소개

category Back-end 2019.04.11 10:38
1. SQL을 직접 다룰 때 발생하는 문제점
    1.1 반복, 반복 그리고 반복
        SQL을 직접 다룰 때의 문제점을 알아보기 위해 자바와 관계형 데이터베이스를 사용해서 회원 관리 기능을 개발해보자. 
# 회원 클래스
public class Member {
    private String memberId;
    private String name;
}
        회원을 조회하는 기능을 개발하자.
            1. 회원 조회용 SQL을 작성한다.
            2. SQL을 실행한다.
            3. 조회 결과를 Member 객체로 매핑한다.

        회원 등록 기능을 만들어 보자.
            1. 회원 등록용 SQL을 작성한다.
            2. 회원 객체의 값을 꺼내서 등록 SQL에 전달한다.
            3. JDBC API를 사용해서 SQL을 실행한다.

        회원을 수정하고 삭제하는 기능을 추가할 때에도 같은 단계를 반복한다.

    1.2 SQL에 의존적인 개발
        요구사항 추가 : 기존 회원 정보에 연락처를 함께 저장
# 회원 클래스
public class Member {
    private String memberId;
    private String name;
    private String tel; // 추가
}
            1. 연락처를 저장할 수 있도록 INSERT SQL를 수정했다.
            2. 회원 정보를 조회하는 SQL에 연락처가 포함될 수 있도록 수정한다.

        요구사항 추가 : 회원 정보 조회 시 팀 정보 추가
            1. 회원 정보 조회 쿼리 수정 : 회원 정보와 팀 정보를 조인하여 조회

    1.3 SQL을 직접 다룰 때 발생하는 문제점을 요약하면
        - 진정한 의미의 계층 분할이 어렵다.
        - 엔티티를 신뢰할 수 없다.
        - SQL에 의존적인 개발을 피하기 어렵다.

2. 패러다임의 불일치
    2.1 상속
        - 클래스는 “상속"이 가능하다. ITEM을 상속 받아 Album, Move, Book을 클래스를 정의한다.
        

        
        - 데이터 베이스는 테이블과의 “관계”를 정의한다. ITEM 테이블과 Album, Move, Book 테이블을 기본키와 외래키로 “관계”를 맺는다. (화살표가 보이지 않는 것은 기분 탓이다.)
        


        - 클래스 모델 코드
abstract class Item {
    Long id;
    String name;
    int price;
}

class Album extends Item {
    String artist;
}

class Movie extends Item {
    String director;
    String actor;
}

class Book extends Item {
    String author;
    String isbn;
}

        - Album, Movie, Book 객체를 DB에 저장할려면 각 객체 별로 SQL을 만들어야 한다.
        - 또한, ITEM에서 정의된 DTYPE도 매핑하여 저장해야 한다.
# ALBUM Insert
INSERT INTO ITEM ...
INSERT INTO ALBUM ...

# Movie Insert
INSERT INTO ITEM ...
INSERT INTO MOVIE ...

# Book Insert
INSERT INTO ITEM ...
INSERT INTO BOOK ...

    2.2 연관 관계
        - 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.
        - Member 객체는 Member.team 필드에 Team 객체의 참조를 보관해서 Team 객체와 관계를 맺는다.
        - 따라서, 이 참조 필드에 접근하면 Member와 연관된 Team을 조회할 수 있다.
        - 객체는 참조가 있는 방향으로만 조회할 수 있다. member.getTeam()은 가능해도 team.getMember()는 참조가 없으므로 불가능하다.
        

        - 반면, 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
        - Member 테이블은 Member.TEM_ID 외래 키 컬럼을 사용해서 Team 테이블과 관계를 맺는다.

    2.3 정리
        - 객체 모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 서로 다르다.
        - 이 패러다임의 차이를 극복하려고 개발자가 너무 많은 시간과 코드를 소비한다.
        - 객체지향 애플리케이션답게 정교한 객체 모델링을 할수록 패러다임의 불일치 문제가 더 커진다.
        - 이 틈을 메우기 위해 개발자가 소모해야 하는 비용도 점점 커지고, 객체 모델링은 힘을 잃고 점점 데이터 중심의 모델로 변해간다.
        - 자바 진영에서는 오랜 기간 이 문제를 해결하기 위해 JPA 나타나게 되었다.
        - JPA는 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 유지하게 도와준다.

출처: 자바 ORM 표준 JPA 프로그래밍 [김영한 지음], 01 JPA 소개


댓글을 달아 주세요

대마도사 블로그
블로그 이미지 대마도사 님의 블로그
MENU
VISITOR 오늘15 / 전체12,225