자바 ORM 표준 JPA 프로그래밍 책을 읽었습니다.
우선 책을 읽으면서 내용은 JPA 를 처음하는 접하는 사람들은 조금 어려울 수 있다고 느꼈고, JPA 를 조금 접해본 사람들은 많은 도움이 될 것 같은 생각이 듭니다.
초반에 [SQL 로 직접 쿼리를 날려 개발할 때, JPA 사용할 때]의 장단점을 설명을 잘 해줘서 `mybatis, ibatis 를 사용해야 해` 라고 생각하는 사람도 충분히 `JPA 사용해도 괜찮을 것 같다` 라는 생각이 들도록 해주는 것 같습니다.
저는 이 책에서 중요한 내용이 다음의 내용이라고 생각합니다.
- 연관관계 매핑
- 엔티티 생명주기
- 영속성 컨텍스트
- 프록시
- 책의 15장, 16장 (15장-고급주제와 성능 최적화, 16장-트랜잭션과 락, 2차 캐시)
우선 [연관관계 매핑] 에 대한 내용은 `@OneTo*`, `@ManyTo*` 에 대해서 잘 설명을 해주며, 지연 및 즉시 로딩과 즉시로딩 시 발생하는 N+1 에 대해 해결하는 이야기도 나옵니다. 지연로딩에서 발생하는 N+1 에 대한 내용은 거의 마지막 챕터에 해당 내용이 나옵니다. 책에서도 `@BatchSize` 를 사용하라고 나오네요. 그리고 직접 예제코드를 보여주면서 매핑을 하기 때문에 이해하는데 수월했고, 특히 `@ManyToMany` 에 대해서 설명을 잘 해줍니다. (실제 사용할 일은 많이 없겠지만,,)
지금까지 연관관계 매핑 시 무슨 키로 어디를 join 하고 설정하는게 조금 헷갈렸는데 도움이 많이 됐고, insertable, updatable 사용하는 이유에 대해서 알게 돼서 도움이 많이 됐습니다. (외래키를 가지는 컬럼 2개가 있다고 했을 때 그 중 하나의 필드가 따른 엔티티를 조인했을 때 이 때 insertable, updatable 을 false 로 설정해야 합니다. 또한, 예를 들어 Person, Address 엔티티 클래스가 서로 매핑 돼 있다고 했을 때 Address 엔티티에서는 Person 엔티티의 생성, 수정에 대한 책임이 없기 때문에 서로 양방향 매핑이 돼 있다고 했을 때 Address 엔티티에서 Person 엔티티에 updatable, insertable 을 false 로 줘야 합니다.)
또한, 엔티티 생명주기에 대해서도 이해가 쉽게 설명을 해줍니다. 어떤 개발을 하던 간에 생명주기 관련해서는 항상 머릿속에 들고 있어야 한다고 생각하기에 중요한 것 같습니다. 이와 더불어 내부에서 영속성 컨텍스트가 어떻게 작동되는지 아는게 중요한 것 같습니다. 내부적으로 어떻게 동작 하는지, noticeRepository.findById(1) 을 같은 트랜잭션 내에 한 해서 여러 곳에서 사용해도 결과로 반환되는 엔티티가 왜 동일한지 알아야 하니까요.
프록시는 lazy loading 왜 관한 내용인데 어떻게 lazy loading 을 할 수 있는지에 대해서 알아야 하는 것 같습니다.
- lazy loading 할 때 프록시 객체를 만들어놓음
- 프록시 객체의 메소드 호출을 하면 실제 엔티티 레퍼런스를 가지고 있지 않기 때문에 이 때 영속성 컨텍스트가 DB 에서 엔티티 조회를 해 실제 엔티티 객체 생성
- 그리고 프록시 객체는 생성된 실제 엔티티 객체의 레퍼런스를 target 이라는 멤버 변수에 보관
- 그리고 target 에 보관 돼 있는 실제 엔티티 객체의 메소드를 호출해 결과 반환
이런 식으로 lazy loading 동작 되는 것은 잘 몰랐기 때문에 어떻게 동작하는 알 수 있어서 좋았습니다.
이번에 책을 읽으면서 느낀점은 제가 그동안 JPA 로 삽질했던 것들이 대부분 책에 해결방법이 나와있었습니다. (ex.. bulk insert, N+1 등..) 그래서 앞으로 개발을 시작하기 전 책을 먼저 구입해 읽어야 하겠다는 생각이 무척 많이 들었습니다.
해당 책에서 제일 흥미있게 읽었던 부분은 lazy loading 을 어떻게 하는가, 엔티티 매니저, 영속성 컨텍스트 등 조금 이론적인 부분이 제일 흥미 있게 읽었고 많은 도움이 됐던 것 같습니다. lazy loading 으로 객체를 가져오는데 그 원리를 몰랐던 제가 너무 부끄럽네요. 물론 지금도 자세히는 모르지만요
현재 2018년 12월 31일이기 때문에 내년에는 꼭 책을 더 읽어서 전문적인 지식을 가지도록 노력하겠습니다.
참고로 후반 쪽에는 점점 제가 이해하기 너무 힘든 내용이 나와서 이해가 잘 가지 않거나 아예 무슨 말을 하는 지 모르겠더군요( 책의 15 장, 16장) 그만큼 중요한 내용, 심화적인 내용이라 생각하고 학업에 증진해 이해가 가도록 잘 하겠습니다.