본문 바로가기
  • Where there is a will there is a way.
개발/기타개발

자바 ORM 표준 JPA 소개

by 소확행개발자 2019. 1. 6.

자바 ORM 표준 JPA 소개


객체와 관계형 데이터베잇 간의 차이를 중간에서 해결해주는 ORM ( object relational mapping ) 프레임워크를 알게 되었다. 

JPA는 지루하고 반복적인 CRUD SQL을 알아서 처리해줄 뿐만 아니라 객체 모델링과 관계형 데이터베이스 사이의 차이점도 해결해주었다. 


SQL을 직접 다룰 때 발생하는 문제점

public class Member {

private String memberId;
private String name;


}


다음과 같이 모델을 만들고


public class MemberDAO {

public Member find(String memberId){};

}

다음과 같은 객체를 만든다.


그다음 회원 조회용 SQL 을 만들고


SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?


그다음 JDBC API를 사용해서 SQL을 실행한다.


ResultSet rs = stmt.executeQuery(sql);


조회 결과를 Member 객체로 매핑한다.


String memberId = rs.getString("MEMBER_ID");

String name = rs.getString("NAME");


Member member = new Member():

member.setMemberId(memberId);

member.setName(name);


SQL에 의존적인 개발

아에서 만든 회원 객체를 관리하다가 회원의 연락처도 함께 저장해달라는 요구가 발생하면 모든 코드에서 수정이 발생한다.

JPA와 문제 해결


저장기능
jpa.persist(member);

조회기능
String memberId = "helloId"
Member member = jpa.find(Member.class, memberId);

수정기능
Member member = jpa.find(Member.class, memberId);
member.setName("이름변경")
// JPA는 별도의 수정 메소드를 제공하지 않는다 대신에 객체를 조회해서 값을 변경만 하면 트랜잭션을 커밋할ㄷ 때 데이터베이스에 적절한 UPDATE SQL이 전달 된다. 
자세한 내용은 3장에서 설명한다. 


연관된 객체 조회
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam(); // 연관된 객체 조회


패러다임 불일치

객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다. 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라고 한다.


따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다.


1.  JPA와 상속


abstract class Item {

Long id;
String name;
int price;

}

class Album extends Item {
String artist;
}


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


데이터베이스 모델링에서는 


INSERT INTO ITEM

INSERT INTO ALBUM


을 사용해야 한다.


저장

jpa.persist(album);

을 실행하면

다음 SQL을 실행하여 객체를 두 테이블에 나누어 저장한다.


조회

String albumId = "id100";

Album album = jpa.find(Album.class, albumId);


JPA는 ITEM 과 ALBUM 두 테이블을 조인해서 필요한 데이터를 조회하고 그 결과를 반환한다.


SELELCT I.*, A.*

FROM ITEM I

JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID


2. 객체지향 모델링


public class Member {

private String memberId;
Team team;
private String name;

Team getTeam() {
return team;
}

}


class Team {
Long id;
String name;
}


저장

member.setTeam(team);
jpa.persist(member);

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

3. JPA 와 비교

String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);

member1 == member2 ( false )


하지만 JPA는 이를 고려해서 사용한다.


String memberId = "100";

Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);


member1 == member2 ( true )


JPA 란 무엇인가




댓글