필자는 JDBC, Spring Data JPA를 사용해본 경험이 있다.
정확히 말하자면 사용해본 경험'만' 있다.
다른 개발자분과 Spring Data JPA에 대해 의견을 나누던 중 JDBC, Hibernate 등의 키워드가 나왔었지만 정확히 어떤 것인지 모르고 있는 나 자신을 반성하게 되었다.
따라서 이번 기회에 정확하게 짚고 넘어가보고자 한다.
테코톡에서 JDBC를 이해하기 쉽게 설명해준 영상이 기억난다.
JDBC는 Java Database Connectivity의 약자로 데이터베이스와 통신하기 위한 API이다.
우리는 추상화, 의존성 역전의 개념을 알고 있다.
그렇다면 "데이터베이스는 여러 종류가 있는데, 데이터베이스별로 통신하는 코드가 달라지지 않을까?"
가 아닌 "사용하는 데이터베이스만 교체해도 사용할 수 있게 만들 수 있지 않을까?"
라는 생각도 할 수 있을 것이다.
그것이 바로 JDBC이다.
JDBC는 데이터베이스의 종류에 상관없이 똑같은 코드로 해결할 수 있다.
JDBC API는 설정한 데이터베이스에 맞는 드라이버를 사용하여 데이터베이스에 접근하기 때문이다.
즉, JDBC는 인터페이스이고 구현한 것은 각 데이터베이스에 맞는 드라이버들이다.
관계형 데이터베이스의 하나의 row를 하나의 인스턴스로 생각한다면, column의 값은 필드의 값으로 매핑할 수 있을 것이다.
하지만 객체의 필드에 리스트가 존재하는 경우 애매해지게 된다.
데이터베이스는 row 단위이기 때문에 하나의 row에는 하나의 컬럼 값만 들어가기 때문이다.
또한 객체의 필드에 다른 객체가 존재하는 경우 Java는 참조로 접근하지만 데이터베이스는 Join으로 접근하기 때문에 다르다.
객체에서의 상속도 관계형 데이터베이스에서 나타내기 힘들게 되고, 이렇게 두 개념을 매핑하는 것이 힘든 것을 패러다임의 불일치라고 한다.
비슷하지만 다른 두 개념을 매핑해 주는 것이 ORM(Object Relational Mapping)이고 Java 진영에는 JPA(Java Persistence API)가 존재한다.
개발자는 두 개념을 매핑시키기 위해 엄청난 양의 코드를 작성할 필요 없이 JPA가 알아서 매핑해주고 쿼리도 만들어준다.
그렇다면 JDBC와 JPA는 아예 다른 것인가? - 아니다.
JPA는 데이터베이스와 객체를 매핑하는 기술일 뿐, 내부적으로는 데이터베이스와의 통신을 위해 JDBC를 사용한다.
또한 JPA도 JDBC와 마찬가지로 인터페이스이기 때문에 구현체가 필요하고, 그 구현체 중 하나가 Hibernate(가장 널리 사용됨) 이다.
공식문서에 Spring Data JPA의 설명이 나와있다.
Spring Data JPA는 JPA를 Repository 기반으로 간편하고 효율적으로 사용할 수 있는 모듈이라고 설명되어 있다.
Spring Data JPA는 Repository의 메소드를 통해 쿼리를 날릴 수 있다.
쿼리는 Repository의 메소드 명을 통하여 생성되는데, 컨벤션이 존재하니 공식문서를 참고하자.
또한 쿼리를 직접적으로 만들고 싶다면 @Query 어노테이션을 사용한다.
이 때 JPQL 혹은 일반 쿼리를 사용할 수 있고 nativeQuery의 값에 따라 선택 가능하다.
false(default) -> JPQL, true -> 일반 쿼리
많은 도움 됐습니다. 감사합니다.