• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

영속성 컨텍스트 2 강 질문있습니다.

23.12.23 22:49 작성 23.12.23 23:09 수정 조회수 157

0

1. 7분 1초 그림과 7분 9초 그림이랑 차이가 뭔가요? 혹시 7분 1초 그림에서 3번이 7분 9초 그림인건가요?

2. 13분에 내부적으로 리프랙션을 하기때문에 동적으로 생성자를 생성해야 한다고 하셨는데요.

리프랙션은 뭐고 동적은 무슨의미인가요? 움직임을 뜻하는건 아닌것 같아서요

3. 23분에 1번에는 flush() 이렇게 되어있고 4번에는 flush 이렇게 되어있는데 혹시 flush 가 2번 실행되는건가요?

첫째코드가 강의 Hello JPA - 애플리케이션 개발28분에 나온 코드이고 2번째코드가 영속성 컨텍스트 2 24분에서 나온코드입니다.

List<Member> result=em.createQuery("select m from Member as m",Member.class).getResultList();
//Member 객체를 m으로 별칭하고 객체 m을 선택해라
for (Member member:result){// 각 Member 엔터티에 대해 반복합니다.
    System.out.println("member name = " + member.getName());

}

Member member=em.find(Mmeber.class,150L);

를 List<Member> member=em.find(Mmeber.class,150L); 이렇게 바꿔도 되나요?

 

4.영속성 컨텍스트 2 7분 그림에서요. 그림에서 flash는 3번과정인가요? 아니면 3번과정 직전인 동기화 상태인가요?

 

 

답변 2

·

답변을 작성해보세요.

1

1. 7분 1초 그림과 7분 9초 그림이랑 차이가 뭔가요? 혹시 7분 1초 그림에서 3번이 7분 9초 그림인건가요?

-> 두 그림은 그림은 em.find()를 통해 조회하는 흐름입니다.

7분 1초의 그림은 영속성 컨텍스트에 엔티티가 없을 때이고,

7분 9초 그림은 영속성 컨텍스트에 엔티티가 존재할 때 입니다.

2. 13분에 내부적으로 리프랙션을 하기때문에 동적으로 생성자를 생성해야 한다고 하셨는데요.

리프랙션은 뭐고 동적은 무슨의미인가요? 움직임을 뜻하는건 아닌것 같아서요

-> 객체를 생성하려면 new Member()와 같이 코드를 작성해야 하는데요. 리플렉션은 자바에서 클래스 이름만 보고 객체를 생성할 수 있는 기술입니다.

3. 23분에 1번에는 flush() 이렇게 되어있고 4번에는 flush 이렇게 되어있는데 혹시 flush 가 2번 실행되는건가요?

-> 1번의 플러시는 em.flush()를 호출하는 경우입니다. 개발자가 JPA에게 플러시를 호출하는 것입니다. 2번의 플러시는 JPA가 DB에게 SQL 변경 내용을 전달하는 뜻의 플러시입니다.

리스트 조회 추가 질문

-> 안됩니다. em.find()는 엔티티를 하나만 조회할 수 있습니다. List로 조회할 수 없습니다.

4.영속성 컨텍스트 2 7분 그림에서요. 그림에서 flash는 3번과정인가요? 아니면 3번과정 직전인 동기화 상태인가요?

-> 7분 그림에는 플러시 과정이 없습니다. em.find()를 호출할 때는 플러시가 발생하지 않습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.25

안녕하세요, 인프런 AI 인턴입니다.

ekek님, JPA 관련 질문에 답변 드리겠습니다.

  1. 영상 내용에 직접적인 접근이 불가능하여 강의에서 어떤 그림들이 나왔는지 구체적으로 알 수 없으나, 일반적으로 JPA 에서 언급하는 영속성 컨텍스트 과정의 경우, 엔티티의 생명주기를 설명할 때 사용됩니다. 7분 1초 그림이 3번 과정을 나타내고 있다면, 7분 9초 그림은 그 과정 후의 상태나 변화를 보여줄 수 있습니다. 영속성 컨텍스트의 라이프 사이클을 보여주는 다른 단계가 될 가능성이 높습니다.

  2. 리플렉션(Reflection)은 자바에서 클래스의 속성과 메서드를 프로그램 실행 중에 접근하고 조작할 수 있게 하는 기능을 말합니다. “동적”이라는 말은 리플렉션을 통해서 런타임 시에 동적으로, 즉 프로그램이 실행되는 동안에 객체를 생성하거나 메서드를 호출하는 것을 의미합니다.

  3. ‘flush()‘가 코드에 2번 나타난 것은 영속성 컨텍스트와 데이터베이스 사이의 동기화를 위해 ‘flush’가 호출된 것으로 해석될 수 있지만, 실제로 ‘flush’가 2회 실행되는지 여부는 강의 내용을 토대로 정확히 파악해야 합니다. 강의에서 특별히 2번의 flush 작업이 언급된 것이 아니라면, 일반적인 경우에는 한 번의 flush 동작으로 이해하는 것이 맞습니다.

주어진 코드의 경우, em.find() 메소드는 단일 엔티티를 찾기 위해 사용되므로, List<Member> 타입으로 받는 것이 아니라 Member 타입으로 받아야 합니다. 따라서 List<Member> member=em.find(Member.class, 150L); 는 올바르지 않습니다. find 메소드는 단일 엔터티를 반환하기 때문입니다.

  1. 영속성 컨텍스트 내 ‘flush’는 변경 감지(Dirty Checking), 수정된 엔티티 쓰기 지연 SQL 저장소에 등록된 쿼리 실행 등을 포함한 후, 실제 데이터베이스에 반영하는 과정을 말합니다. 따라서 ‘flush’는 변경 사항을 데이터베이스에 동기화하는 3번 과정을 의미하는 경우가 많습니다. 그러나 7분 그림에서의 ‘flash’가 정확히 어떤 상황을 나타내는지는 강의의 구체적 내용을 확인해야 할 것 같습니다.

추가적인 질문이 있으시다면 언제든지 문의해 주세요.