만들면서 배우는 JPA - 0

Pyro·2023년 6월 12일
0

만들면서 배우는 JPA 0일차

오랜만에 열린 테크살롱 오프라인 스터디에서 무료로 학습과정에 참여할 기회를 얻었다.
최종적으로는 학습 컨텐츠를 70만원 정도에 팔고 싶다는데 열심히 피드백을 드려야곘다.
회사 실무에서도 JPA 를 활용하고 있지만, 그 동작원리에 대해서 깊게 공부를 해나갈 수 있는 인연을 얻게 되어 다행이라 생각한다.

6월 10일 부터 7월 8일까지 매주 일요일마다 학습을 하면서 기대되는 학습 목표는 다음과 같다.

  • Spring Data JPA, JPA 및 Hibernate의 차이점에 대해 알고 있다.
  • 엔티티의 생명 주기를 영속성 컨텍스트와 연결 지어 설명할 수 있다.
  • JPA에서 프록시 객체를 사용하는 이유를 설명할 수 있다.
  • Hibernate의 고유 기능을 활용할 수 있다.

오늘은 스터디를 시작하며 JPA, Hibernate, Spring Data JPA 의 차이 부터 시작했다.
가장 확실하게 느껴지는 차이를 이야기하자면 3가지 다 소스가 다르다.

JPA 는 오라클의 JSR338 문서에 정의된 Specification 이다.
업무에서 JPA 관련 기능을 어떻게 활용할지 누군가 물어보면, 공식문서를 레퍼런스로 답변을 하면 될 것 같다.

Hibernate 는 Red Hat 휘하의 오픈소스 단체이다. 오픈소스로 만들어진 SW 중에서, JPA 의 실제 구현체인 hibernate-orm 이 매우 유명해서 JPA Provider 의 표준처럼 쓰이고 있다.

Spring Data JPA 는 스프링의 여러 오픈소스 프로젝트 중 하나이다.
JSR 에 공식문서로 정의된 JPA 스펙을 Java 의 오픈소스 프로젝트인 Spring 에서도 쉽게 사용할 수 있도록 지원하기 위해 만들어져 있다.

즉, JPA, Hibernate, Spring-Data-JPA 3가지는 현재 관리하고 만든 단체조차 아예 다르다.
Java 의 소유권을 가지고 있는 Oracle 에서 JSR338 스펙틀 통해 JPA 를 Java 진영의 공식적인 스펙으로 정의를 했고,
Java 의 WAS 오픈소스 중에서 Spring 이 유명해졌듯이,
Java 의 데이터 영속화 관련 오픈소스 중에서 Hibernate-ORM 이 가장 유명해졌을 뿐이다.

이제야 왜 Java 개발자들이 JPA 를 욕하면서도, JPA 를 공부하는지 조금은 이해가 간다.
Java 애플리케이션 개발자라면 Oracle 의 최신 권장 스펙을 지속적으로 공부할 수 밖에 없기 때문이다.
JPA 는 JSR338 공식 문서로 API 스펙이 정의가 되어 있지만, 다른 Java 의 Persistent Framework 들이 Oracle 의 공식문서로 권장되지는 않는다.
JPA 를 사용하고 있지 않는 회사에서 조차, JPA 관련된 지식을 물어보는 경향이 있는 것은 Oracle 의 Java 스펙 문서를 공부하고 있는지 확인하려던 건 아니었을까... 추측일 따름이다.

아무튼 이 스터디에서는 Hibernate 에 의존하지 말고 본인이 직접 JSR338 의 JPA 스펙을 구현해보는게 목표라고 한다.
전부 구현하기에는 방대하므로, 구현하고자 하는 영역을 동일하게 정하고 서로 비교하고 리뷰하는 형식으로 진행될 것 같다.

1주차에서는 쿼리빌더 부터 직접 만들어보기로 했다.
추상 구문 트리 분석을 위해 Antlr 과 Lex, Yacc 이야기가 나왔고, 구문 분석을 하는 소스코드들을 읽었는데 이건 진짜 현재 내 실력 밖의 영역인것 같다.

바닥부터 구문분석을 하려하기 보다는, Hibernate 코드를 직접 읽으면서 리팩토링을 하는 방향으로 도전을 해봐야겠다.
가령 JdbcTypeJavaClassMappings 에서 Java 의 타입과 SQL 의 타입이 어떻게 매핑되는지 보았는데,
보면서 아 진짜 테이블의 스키마는 절대로 Java 로 정의하지 말고 별도로 CREATE 쿼리로 형상관리를 해야겠다는 결심을 하였다.

profile
dreams of chronic and sustained passion

0개의 댓글