제이제이
article thumbnail

4. JPA는 영속성 컨텍스트를 가지고 있습니다.


이전에 “영속성”에 대한 의미를 알아봤었습니다.

💡 영속성이란?

🔥 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미합니다.

 

❓ 그럼 컨텍스트란?

🔥 “대상에 대한 모든 정보”를 영구히 저장하는 환경을 의미합니다.

 

❗ ”컨텍스트를 넘겨준다”라는 의미

🔥 대상에 대한 모든 정보를 넘겨줌으로써 해당 대상의 모든 정보를 알게됨을 의미합니다.

1) 데이터를 생성했을 때, 삭제했을 때(Create, Delete)

다음의 그림을 살펴봅시다.

 

과정

그림처럼 자바 프로그램에 동물 데이터가 있다고 가정하겠습니다.

1. 자바 프로그램에서 영속성 컨텍스트에게 동물 데이터를 전달합니다.

2. 영속성 컨텍스트DB동물 데이터를 전달함으로 최종적으로 DB에 동물에 대한 정보가 생기게 됩니다.

3. 만약 자바 프로그램에서 동물 데이터를 삭제하게 되었습니다.

4. 영속성 컨텍스트동물 데이터를 삭제합니다.

5. DB에서도 동물 데이터를 삭제합니다.

위의 과정을 통해 영속성 컨텍스트는 DB와 동기화 됨을 알 수 있습니다.

2) 데이터를 조회할 때(Read)

다음의 그림을 살펴봅시다.

 

과정

그림처럼 DB에 있는 과일 데이터가 있을 때 자바 프로그램에서 조회할 경우를 가정하겠습니다.

1. 자바 프로그램에서 영속성 컨텍스트에게 과일 데이터를 조회를 요청합니다.(Select 요청)

2. 영속성 컨텍스트DB에게 과일 데이터를 전달해달라고 요청합니다.

3. 영속성 컨텍스트과일 데이터를 딸기 데이터로 변경합니다.

4. DB에서는과일 데이터를 응답합니다.

5. 영속성 컨텍스트과일 데이터자바 Object로 변경하여 자바 프로그램에게 넘겨줍니다.

3)데이터를 변경했을 때(Update)

다음의 그림을 살펴봅시다.

 

과정

그림처럼 자바 프로그램에 과일 데이터가 있다고 가정하겠습니다.

1. 자바 프로그램에서 영속성 컨텍스트에게 과일 데이터를 전달합니다.

2. 영속성 컨텍스트DB과일 데이터를 전달함으로 최종적으로 DB에 과일에 대한 정보가 생기게 됩니다.
(자바프로그램 - 영속성 컨텍스트 - DB에 있는 과일 데이터는 내용이 일치하게 됩니다.)

3. 그 다음 만약 자바 프로그램에서 과일 데이터딸기 데이터로 변경하게 되었습니다.

4. 영속성 컨텍스트과일 데이터딸기 데이터로 변경합니다.

5. 이를 DB에서도 과일 데이터딸기 데이터로 변경합니다.
(변경 과정 중 Insert가 아닌 Update가 일어나게 됩니다.)

정리

❓영속성 컨텍스트란?

🔥 자바 프로그램의 정보를 DB에 저장하고, 필요한 DB의 데이터를 선택하여 자바 프로그램에 가져오는 모든 정보를 수행합니다.
  • 자바 프로그램이 DB에 저장해야 하는 모든 메타 데이터들을 영속성 컨텍스트가 가지고 있습니다.
  • 영속성 컨텍스트에서 일어나는 일들은 모두 자동으로 일어납니다.

5. JPA는 DB와 OOP의 불 일치성을 해결하기 위한 방법론을 제공합니다.


다음 그림을 살펴봅시다.

Player테이블의 TeamIDTeam테이블의 ID외래키(FK)로 설정했음을 알 수 있습니다.

즉, Team테이블의 ID를 참조합니다.

 

❗주목해야 할 점

DB가 가질수 있는 데이터의 유형

🔥 DB는 기본 자료형만 가질 수 있습니다. (즉, Object를 가질 수 없습니다.)

 

위의 DB 데이터를 모델링하면 하면 다음과 같습니다.

Team 테이블을 모델링한 예(Team 클래스)

class Team{
    int id;
    String name;
    String year;
}

 

Player 테이블을 모델링한 예(Player 클래스)

class Player{
    int id;
    String name;
    int teamId;

}

 

분석

Player 클래스는 teamId를 int형으로 가지고 있습니다.

 

❓만약 Player DB 테이블에서 가득염을 조회(Select)한다면?

Player 클래스에 id = 2, name = 가득염, teamId =1 로 들어가게 됩니다.

이렇게 되면 가득염이 어느 팀에 속해 있는지 모르게 됩니다.

(프로그래머는 알지만 웹 페이지를 보는 클라이언트는 모릅니다.)

 

따라서 어떤 팀인지 보여주려고 한다면 다음과 같은 작업이 추가로 필요합니다.

1. teamId = 1로 DB 테이블에서 어떤 팀인지 찾아와야 합니다.
(어떤 팀인지 select문을 하거나)

2. 테이블 조인을 통해서 해결해야 합니다.

 

❗ 그런데 자바 프로그램에서는 Object를 사용할 수 있습니다.

따라서 위의 코드의 Player에서 Object인 team을 사용할 수 있습니다.

 

Team 테이블을 모델링한 예(Team 클래스)

class Team{
    int id;
    String name;
    String year;
}

 

Player 테이블을 모델링한 예(Player 클래스)

class Player{
    int id;
    String name;
    Team teamId;

}

🚨 문제

🔥 DB에 저장되어 있는 Player 테이블과 불일치하게 됩니다.
  • DB의 Player 테이블의 teamId는 Int형이기 때문입니다.

🔎 해결 방법

🔥 이때 ORM을 이용하면 모델을 만들 때 자바가 주도권을 쥐고 있는 모델을 만들 수 있습니다.
  • Team team; 으로 선언이 가능하게 됩니다.

💡 ORM을 하게 된다면?

🔥 자바 프로그램에서 저장할 때는 객체를 통해 저장하며
      JPA가 DB에 있는 데이터를 조회, 삽입할 때는 자동으로 Foreign Key를 넣어줍니다.

📒 Reference(참고자료)


 

[무료] 스프링부트 개념정리(이론) - 인프런 | 강의

스프링부트를 공부하며 헷갈리는 개념이 많았던 분 스프링부트에 대해 공부하고 싶었던 모든 분, - 강의 소개 | 인프런...

www.inflearn.com

 

profile

제이제이

@아사비치즈스틱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!