inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리

영한센세 members를 가져오는 과정에 대해서 질문이 있습니다!!!

279

JuNu

작성한 질문수 24

1

제가 이해한 바로는

            Team team = new Team();
team.setName("TeamA");
entityManager.persist(team);

Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
entityManager.persist(member);

// team.getMembers().add(member);


// entityManager.flush();
// entityManager.clear();

Team findTeam = entityManager.find(Team.class, team.getId());
List<Member> members = findTeam.getMembers();

for (Member m : members) {
System.out.println("member = " + m.getUsername());
}

(위의 코드는 강의에서 작성해주셨던 코드와 동일합니다)

제가 이해한 바로는

"flush, clear를 하지 않음으로써 그 상태의 영속성 컨텍스트에 등록된 Team과 Member 기준으로 members의 값을 가져오기 때문에 

System.out.println("member = " + m.getUsername());

위 코드에 대한 출력이 되지 않는것으로 이해했습니다 ㅠㅠ!"

제가 이해한 바가 맞을까요 센세...? 

이게 만약 맞다면 "추가적으로 "

flush 와 clear를 하는 과정에서

"원래 commit 시점에 쿼리가 발생하여 1차 캐시 혹은 DB에 값을 적재하는것이 정상이지만 flush 를 사용하는 시점에 해당과정을 즉시 실행하여 데이터를 적재시키고

다음으로 clear를 함으로써 비영속상태로 만들어 getMembers(); 시에 JOIN쿼리를 발생시켜 members와 관련된 데이터를 반영시킨다고 이해하였습니다."

마지막으로 "getMembers를 하는 과정에서 Member들을 가져오는 join 쿼리를 날리는 과정은 무조건 비영속 상태이어야만 하는지가 궁금합니다."

질문이 많았죠 센세... 항상 넘나 재밌게 잘 보고 있습니다~!!! JPA를 실무에서 사용한적이 없어서... 이런저런 궁금한점이 참 많습니당...

항상 감사합니다!!!!!

java JPA

답변 1

1

김영한

안녕하세요. JuNu님

앞부분은 이해하신 내용이 맞습니다^^!

추가적으로 부분을 답변 드릴게요.

"원래 commit 시점에 쿼리가 발생하여 1차 캐시 혹은 DB에 값을 적재하는것이 정상이지만 flush 를 사용하는 시점에 해당과정을 즉시 실행하여 데이터를 적재시키고

-> 네 맞습니다.

다음으로 clear를 함으로써 비영속상태로 만들어 getMembers(); 시에 JOIN쿼리를 발생시켜 members와 관련된 데이터를 반영시킨다고 이해하였습니다."

-> clear를 하게되면 영속성 컨텍스트가 완전히 비어있게 됩니다. 이 상태에서 em.find(Team.class ..)을 호출하게 되면 DB에서 새로 Team 객체를 조회합니다. 그리고 이 Team 객체는 team.getMembers()를 호출하게 되면 연관된 Member들을 조회할 수 있게 됩니다.(지연 로딩이라고 하는데 뒤에서 학습합니다.) JPA가 연관관계를 보고 이런 것을 해주는 것이지요.

반면에 앞에서 직접 저장한 team은 members 컬렉션에 아무것도 넣지 않았기 때문에 데이터가 없었습니다.

마지막으로 "getMembers를 하는 과정에서 Member들을 가져오는 join 쿼리를 날리는 과정은 무조건 비영속 상태이어야만 하는지가 궁금합니다."

-> 앞부분의 설명을 보시면 이해가 되실거에요^^

감사합니다.

0

JuNu

갓.... 그저 저에게 빛입니다 ㅠㅠ... 

이외의 추가적으로 질문드리자면... 제가 @Transactional 에 대한 이해가 없어서요...

해당 어노테이션에 대해서 공부를 하기 위해서는 추천해주실 영한님 강의가 있으신지 궁금합니다ㅠ!

0

김영한

@Transactional은 준비중인 스프링 데이터 접근 기술에서 자세히 다룰 예정입니다.

우선은 @Transactional로 한번 검색해보시거나, 토비의 스프링을 보시면 도움이 되실거에요^^

실무 조언 관련 질문입니다.

0

38

1

H2데이터베이스 파일 생성

0

45

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

47

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

45

1

JPQL 메소드와 락

0

47

1

Delivery @OneToOne

0

54

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

85

2

UnsupportedOperationException 발생

0

80

3

H2 Database 연결이 안됩니다.

0

86

2

연관관계 매핑 질문드립니다.

0

77

2

h2데이터베이스 실행오류

0

103

2

persistence.xml

0

101

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

74

1

영속성 컨텍스트

0

59

1

JPA 프록시

0

87

1

Native Query와 MyBatis

0

61

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

81

1

임베디드 타입 예시 코드 관련 질문

0

110

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

89

3

인텔리제이 패키지 커서 단축키 질문

0

100

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

133

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

67

1

임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.

0

95

1

데이터베이스가 초기화되는 것 같아요

1

172

2