JPA, Hibernate, Spring Data JPA

권태용·2020년 9월 15일
0

작년 이 맘때쯤 Mybatis, JPA, Hibernate, SpringData JPA, QueryDSL등을 사용해가면서 외주 프로젝트를 진행하였다. 개념이 정립 되지 않은 상태에서 개발을 진행하다 보니 구현하기에 급급하여 코드의 문법적 에러만 주의하며 개발하였다. 뒤죽박죽으로 시작하다보니 나중에 JPA, Hibernate를 찾아보니 그 글에서는 EntityManager를 사용하고 있었기에 혼란만 커져갔다.

혼란은 여전했고 "JPA와 Hibernate를 설명해보세요"라는 질문에 명쾌한 답을 하지 못 했다. 내가 알고 있는 일반적 개념은 "Hibernate는 JPA의 구현체" 라는 것이 전부였다. 틀린 말은 아니지만 그 속에 의미하고 있는 중요한 개념을 여전히 놓치고 있었다.

JPA - Java Persistence API

JPA는 결국 API이다. API는 무엇을 의미하는 것일까? 프로젝트를 진행하다보면 여러번 듣었던 말일 것이다. 'API쓰면 되요', 'API찾아 봐요'. 하지만 API를 사용하는 데만 급급해서 API란 무엇일까에 대해 생각해 본적이 없었다.

API-Application Programing Interface 를 해석해보면 어플리케이션을 개발(프로그래밍) 하는 인터페이스 .. ? 해석같지 않은 해석이다. 대체 Interface는 무엇일까? Java에서 Interface은 다형성과 상속을 의미한다. 이때 API에 Interface는 다형성을 통해 어떤 형태로든 기본적인 틀을 유지하면 사용이 가능하다는 것을 의미한다.

그럼 Java Persistence는 무엇일까? 아직 이에대한 해답을 풀어서 설명하지 못 하고 있다. ORM이란 개념을 이해하면 나중에 설명을 더 잘 할수 있을것 같다. 우선 Java에서 CRUD 기능이라 생각하는것이 좋을 것 같다.

그렇다면 JPA는 Java에서 디비에 접근해 Create Read Update Delete기능을 할 수 있도록 추상적인 개념을 제시해주는 명세서이다.

Hibernate

Hibernate는 이전에 말한대로 JPA의 구현체이다. 즉 JPA가 제시해준 명세서를 실제로 구현한 것이다. 이는 JPA를 사용에서 명세한 인터페이스로 EntityManager 객체를 생성하여 사용하지만 실제로 구현되어 JDBC를 통해 데이터베이스를 접근하는것은 Hibernate가 구현한 Session라는 것이다.

Spring Data JPA

JPA, Hibernate는 이제 이해가 간다. 하지만 내가 실제로 코딩했던 Syntax는 @Repository를 선언하고 JpaRepositoryImplementation을 상속받아 함수를 정의해서 쿼리를 보내는 형식이였다.

여기서 개념이 한번 더 꼬였었다. EntityManager는 어디에도 보이지 않는데 나는 Hibernate를 써서 개발하고 있다고한다. 이게 논리적으로 말이 되나? 하는 의구심이 들었다.

Spring Data JPA는 또 하나의 모듈이다. 이 모듈은 JPA를 한단계 더 추상화한 모듈로써 사용자가 EntityManager를 빈으로 등록하여 사용하지 않아도 스프링이 자동으로 주입하여 사용할 수 있는 모듈이였던 것이다...

결론

내가 Repo로직에서 짰던 코드는

Spring Data JPA -> JPA -> Hibernate -> JDBC -> MySQL or etc...

위와 같은 흐름으로 접근했던 것이다. 오늘도 많이 배운 하루였다

profile
개발일기장

0개의 댓글