* 공부하기 위한 정리글로 내용이 정확하지 않거나 자세하게 설명되지 않을 수 있습니다.
스프링을 공부하면서 DB를 사용하기 위한 기술이 아주 다양하게 있다.
이전에 공부하던 책에서는 mybatis를 사용했는데 현재 공부중인 책에서는 jqa, querydsl... 뭔가 다양하게 얘기한다.
체계적으로 교육을 받은게 아닌 여러 책들, 인터넷 자료 등으로 공부를 하다보니 뭐가 다른건지도 잘 모르겠고 어떻게 사용해야할지 많이 헷갈려서 정리해보려고 한다.
자바/스프링을 하면서 디비를 이용하기 위한 방법을 찾아보면 많이 보이는 것들은 다음과 같다.
JDBC, Mybatis, JDBCtemplate, JPA, Hibernate, Spring Data JPA, JPQL, Querydsl 등..
본문에서 이것들이 뭔지 찾기 쉽도록 빨간색 굵은 글씨로 표시해두겠다.
가장 먼저 알아야할 것은 JDBC이다. 구글에 jdbc를 검색해보면 위키백과에 다음과 같이 나온다.
JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
쉽게말해 JDBC란 자바에서 DB에 접근하고 사용할수 있는 방법들을 정리해둔 인터페이스 모임이라고 생각할수있지않을까.
그렇기 때문에 위에서 말했던 mybatis, jpa 등 모두 기본적으로 JDBC를 깔고 그 위에서 돌아간다.
주의할 점은 JDBC는 관계형 데이터베이스를 사용하기위한 것이므로 Mongo DB, Dynamo 등과 같은 비관계형 데이터베이스는 다른 방법을 사용한다고한다.

이러한 과정으로 동작되며
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("org.h2.Driver");
String url = "jdbc:h2:~/test"; //database specific url.
String user = "sa"; String password = "";
try(Connection connection = DriverManager.getConnection(url, user, password)) {
try(Statement statement = connection.createStatement()){
String sql = "select * from people";
try(ResultSet result = statement.executeQuery(sql)){
while(result.next()) {
String name = result.getString("name");
long age = result.getLong ("age");
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
위의 예제 코드같은 방법으로 직접 구현하며 개발을 할수도 있지만, 알다시피 더욱 편리하게 이용할 수 있도록 해주는 기술들이 많이 있으며 대부분 그것을 사용한다.
가장 베이스에서 JDBC를 이용하는것을 알았다면 다음 고려할 사항은 영속성 프레임워크(persistence framework)이다.
크게 ORM 방식과 SQL mapper 방식으로 나눠진다.
쉽게 요약하자면 sql을 직접 적어서 원래 db를 컨트롤 하듯이 사용한다면 sql mapper방식, sql을 사용하지 않고 객체지향적으로 사용할수있는게 ORM방식이다.
(각각의 장단점이 있지만 단순하게 생각할때 스프링을 보더라도 초기 xml을 사용하던 것들이 버전이 올라가며 객체지향에 어울리는 어노테이션과 자바코드로 작성할수있도록 바뀐걸보면 ORM이 더 좋은게 아닐까?)
1. ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑하여 DB을 객체지향적으로 사용하기 위한 기술이다.
ORM을 사용한다면, SQL문 작성 없이 매핑하는 설정만으로 DB 테이블내의 데이터를 객체로 전달 받을 수 있다.
ORM을 사용하기 위한 표준 인터페이스를 모아둔것이 JPA(Java Persistence API)이다.
- JPA 구현체로 Hibernate,DataNucleus, EclipseLink가 있다.
여기서 또 하나의 궁금증이 풀린다.
JPA는 그 자체로 기능을 하는것이 아닌 ORM방식을 정의한 인터페이스, 기술 명세일 뿐이다.
또한 Hibernate는 그런 jpa를 구현한 구현체이다.

참고: https://truehong.tistory.com/99
또 JPA에서는 sql을 사용하지 않고 db 테이블이 아닌 객체를 중심으로 사용하는데, 문제는 검색을 할때도 자바 코드의 객체만 보고 검색을 하기는 힘들다. 그래서 나온것이 JPQL(Java Persistence Query Language) 이다
JPQL은 SQL을 추상화한 객체지향 쿼리 언어이다. sql과 문법이 거의 유사하지만 테이블을 대상으로 질의하는것이 아닌 엔티티 객체를 대상으로 질의한다.
2. SQL Mapper : 객체(Object)와 SQL 문을 매핑하여 데이터를 객체화하는 기술을 뜻한다.
객체와 관계를 매핑하기보다는 SQL문의 질의 결과와 객체를 매핑시켜준다.
-대표적으로 MyBatis, JDBCtemplate 등이 있다.
참고: https://dev-coco.tistory.com/77
꽤나 많이 정리가 됐다.
위에서 JPA가 뭔지 알았는데 Spring Data JPA는 뭔가 다른걸까?
Spring Data JPA는 JPA를 쉽고 편하게 사용할 수 있도록 Spring에서 제공하는 모듈 중 하나이다.
JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공하고, Repository 구현에서 JPA를 사용한다.
여기서 쿼리메서드라는 편리한 기능도 제공해주는데 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드의 이름만 정해서 선언하면
Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

마지막으로 Querydsl이다.
이것은 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API이다. 쿼리를 자바코드로 작성할수있다.
ORM방식은 객체지향 프로그래밍 언어인 자바에서 db사용 또한 자바에 어울리는 방식으로 사용하도록 하는게 정체성이라고 이해했다.
하지만 JPA에서 사용하는 JPQL도 결국은 문자열로 작성되며 컴파일 중 오타나 에러를 찾기는 힘들다.
그런데 이것을 자바코드로 작성할 수 있다는것은 컴파일 시점에서 문법오류를 찾아낼수도 있다.
잘은 모르지만 간단하게 사용해보고 공부해본 입장으로 querydsl이 ORM방식의 가치를 끌어올려준 녀석 아닐까.
'Web > Spring' 카테고리의 다른 글
[Spring security] jwt 로그인 구현에서 OncePerRequestFilter (0) | 2023.07.20 |
---|---|
[Spring] 자바 네이밍 컨벤션의 중요성 (0) | 2023.07.20 |
[Spring] @Data 어노테이션 (0) | 2023.07.20 |
[Spring] 요청 데이터 처리 관련 어노테이션 정리 (0) | 2023.07.20 |
Spring Data JPA - 쿼리메소드 (0) | 2023.07.19 |