inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

2가지 질문 추가로 드립니다

해결된 질문

246

jhwoo

작성한 질문수 6

1

안녕하세요 또 질문드리게 되었네요^^

항상 감사드립니다

1. EntityManager Thread Safe 질문

책을 보던 중 책 91페이지에

- EntityManager는 스레드 간에 절대 공유하면 안된다고 되어 있습니다

강의 중 예제에서 Repository 생성하실 때 Spring Data Jpa에서 제공하는 JpaRepository 사용하지 않고 직접 EntityManager 주입받아서 사용하시던데 이 때 Spring 기본 정책인 싱글턴 빈이 등록되면 모든 쓰레드가 하나의 EntityManager를 공유하는 것이 아닌지에 대한 의문이 들어 질문드립니다

2. Spring OSIV 사용 시 Controller에서 Lazy 로딩 후 Object -> JSON 변환 중 serialize 방법

- REST API서버를 개발중입니다

  Controller에서 Lazy 로딩 후 jackson의 API를  이용해서 Object -> JSON 변환하는 중 프록시 객체의 "hibernateLazyInitializer", "handler" 2개의 필드가 getter가 없어 serialize 실패하는 현상이 있습니다

현재까지 생각한 해결 방법은 아래의 2가지 방법입니다

       1) Mapper 변환 옵션에서 2개의 필드만 except 처리 

       2) Mapper 사용하지 않고 2개의 필드를 제외한 각 필드의 Getter를 호출해서 직접 Json String 생성

Controller에서 Lazy 로딩을 하는 상황에서 위 2가지 방법이 아닌 다른 방법이 있는지 궁금합니다

JPA java

답변 2

1

jhwoo

감사합니다 

책을 보고 이해했습니다

실전강의 2편에서 뵐게요 ^^

1

김영한

안녕하세요 jhwoo님^^

1. 책 13.1 트랜잭션 범위의 영속성 컨텍스트(578p)를 보시면 원하는 답을 얻으실 수 있을 거에요^^

스프링 컨테이너가 주입하는 EntityManager는 사실 진짜 EntityManager가 아니라 가짜 객체입니다. 이 가짜 객체가 현재 트랜잭션에 물려있는 영속성 컨텍스트(진짜 EntityManager)를 찾아서 연결해 줍니다.

2. 이 부분은 hibernate5module로 검색해보시면 원하는 답을 구할 수 있을 꺼에요. 결국 지연 로딩이 되면 객체가 진짜 객체가 아니라 프록시 객체인데, Jackson JSON 라이브러리가 이것을 모르고, 파싱할 수 없기 때문에 발생하는 문제입니다. 그래서 Jackson JSON이 하이버네이트 프록시 객체를 인지할 수 있게 라이브러리를 등록해주어야 합니다.

그런데! 이렇게 엔티티를 직접 API로 노출하는 것은 유지보수 관점에서 좋은 방법이 아닙니다. 결국 DTO로 변환해서 처리해야 합니다.

2번처럼 API 하나를 개발해도 JPA를 사용하면, 엔티티라는 개념이 들어가면서 고민할 거리가 많아집니다. 엔티티를 API에 직접 노출해야 하나? 아니면 별도의 객체를 별도로 만들어서 반환해야 하나? 엔티티를 반환하면 지연 로딩은 어떻게 처리해야 하나? 등등 수 많은 고민을 하게 됩니다. 내일 오픈 예정인 활용편 2탄에서 실무에서 어떻게 구현하는 것이 안전하고, 유지보수하기 좋은 방법인지 실전 노하우를 알려드립니다^^! (이건 광고요 ㅎㅎ)

감사합니다.

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

0

38

1

H2데이터베이스 파일 생성

0

46

2

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

0

48

2

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

0

45

1

JPQL 메소드와 락

0

48

1

Delivery @OneToOne

0

55

1

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

0

85

2

UnsupportedOperationException 발생

0

80

3

H2 Database 연결이 안됩니다.

0

87

2

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

0

78

2

h2데이터베이스 실행오류

0

103

2

persistence.xml

0

101

2

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

0

75

1

영속성 컨텍스트

0

60

1

JPA 프록시

0

87

1

Native Query와 MyBatis

0

62

1

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

0

81

1

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

0

110

3

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

0

89

3

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

0

103

2

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

0

134

1

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

0

67

1

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

0

95

1

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

1

172

2