SpringBoot/Spring 김영한님

Spring 김영한 - JPA (1)

함형우 2022. 12. 23. 11:30
728x90

대다수의 어플리케이션은 데이터를 관계형 DB에 저장하게 된다. 그렇기 떄문에 데이터를 저장하고 불러오는데 SQL이 자주 사용되는데, 여기서 많은 문제가 발생하게 된다. 객체 그리고 관계형 데이터베이스의 불일치가 일어나는데, 이것으로 인해 상속, 연관관계, 데이터 타입, 데이터 식별 방법 등에서 문제가 발생한다.

위와 같이 상속을 받는 객체 구조(ITEM) 이 있다면, Album 객체를 db에 저장한다면, 테이블에는 상속이라는 개념이 없기 때문에 Album 테이블 내에 있는 멤버 중에 Item 테이블에 있는 항목과 Album에 있는 항목을 각각 sql에 작성해서 넣어주어야한다. DB에서 꺼낼때 또한 마찬가지다.

연관관계의 경우, Member와 Team의 객체가 위와 같다면, 객체와 테이블 간의 불일치가 또 발생한다. 객체는 Member에서 Team 에 접근할때는 참조를 이용, Mmeber → Tema 단방향 접근만 가능하다. 반대로 테이블은 Member 에서 Team 에 접근할 때 PK,FK 를 이용하고, Member ↔ Team 양방향 접근이 가능하다.

즉, 개체답게 바꾸어서 설계를 해도 필연적으로 매핑을 하게되는데 이를 해결하기 위해 고안된 것이 JPA이다. 자바에서 사용하는 ORM 기술 표준을 뜻한다 ( 객체-관계형 데이터베이스 중간에서 자동으로 매핑해주는 기술 )

SQL 중심적인 개발에서 객체 중심으로 개발방향이 바뀌며, 생산성과 유지보수가 뛰어나고 패러다임의 불일치가 해결된다.

INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES
SELECT MEMBER_ID, NAME, TEL FROM MEMBER M
UPDATE MEMBER SET ... TEL = ?
public class Member {
    private String memberId;
    private String name;
    private String tel;
}

위와 같은 SQL문을 아래 처럼 간단하게 표현할 수 있다.


영속성 컨텍스트란

JPA를 이해하는데 가장 중요한 용어이며, Entity를 영구 저장하는 환경이라는 뜻이다. EntityManager.persist(Member); 해당 문구가 DB에 저장하는 것이 아닌 영속성 컨텍스트라는 곳에 저장한다는 의미이다.

객체를 생성만 한 상ㅌ에서는 JPA와 관계없이 영속성 컨텍스트에서 관리해주지 않기 때문에 비영속 상태라고 한다.

객체를 생성 한 후에, 엔티티 매니저를 통해서 persist를 하게 되면, 영속성 컨텍스트에 객체가 들어간다. ( 영속상태 )

Member member = new Member();
member.setId("member1");
member.setEamil("nelap1234@kakako.com");

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// 객체를 저장한 상태
em.persist(member);

이 em.persist을 하게되면 영속성 컨텍스트에 저장이 되고, 트랜잭션 커밋을 하는 시점에 DB에 SQL문이 보내지게 된다. 이런 영속성 컨텍스트를 사용하면 동일성이 보장되며, 변경 감지가 가능하다.

위와 같이 상속을 받는 객체 구조(ITEM) 이 있다면, Album 객체를 db에 저장한다면, 테이블에는 상속이라는 개념이 없기 때문에 Album 테이블 내에 있는 멤버 중에 Item 테이블에 있는 항목과 Album에 있는 항목을 각각 sql에 작성해서 넣어주어야한다. DB에서 꺼낼때 또한 마찬가지다.

연관관계의 경우, Member와 Team의 객체가 위와 같다면, 객체와 테이블 간의 불일치가 또 발생한다. 객체는 Member에서 Team 에 접근할때는 참조를 이용, Mmeber → Tema 단방향 접근만 가능하다. 반대로 테이블은 Member 에서 Team 에 접근할 때 PK,FK 를 이용하고, Member ↔ Team 양방향 접근이 가능하다.

즉, 개체답게 바꾸어서 설계를 해도 필연적으로 매핑을 하게되는데 이를 해결하기 위해 고안된 것이 JPA이다. 자바에서 사용하는 ORM 기술 표준을 뜻한다 ( 객체-관계형 데이터베이스 중간에서 자동으로 매핑해주는 기술 )

SQL 중심적인 개발에서 객체 중심으로 개발방향이 바뀌며, 생산성과 유지보수가 뛰어나고 패러다임의 불일치가 해결된다.

INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES
SELECT MEMBER_ID, NAME, TEL FROM MEMBER M
UPDATE MEMBER SET ... TEL = ?
public class Member {
    private String memberId;
    private String name;
    private String tel;
}

위와 같은 SQL문을 아래 처럼 간단하게 표현할 수 있다.


영속성 컨텍스트란

JPA를 이해하는데 가장 중요한 용어이며, Entity를 영구 저장하는 환경이라는 뜻이다. EntityManager.persist(Member); 해당 문구가 DB에 저장하는 것이 아닌 영속성 컨텍스트라는 곳에 저장한다는 의미이다.

객체를 생성만 한 상ㅌ에서는 JPA와 관계없이 영속성 컨텍스트에서 관리해주지 않기 때문에 비영속 상태라고 한다.

객체를 생성 한 후에, 엔티티 매니저를 통해서 persist를 하게 되면, 영속성 컨텍스트에 객체가 들어간다. ( 영속상태 )

Member member = new Member();
member.setId("member1");
member.setEamil("nelap1234@kakako.com");

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// 객체를 저장한 상태
em.persist(member);

이 em.persist을 하게되면 영속성 컨텍스트에 저장이 되고, 트랜잭션 커밋을 하는 시점에 DB에 SQL문이 보내지게 된다. 이런 영속성 컨텍스트를 사용하면 동일성이 보장되며, 변경 감지가 가능하다.

728x90