개요

이전 느린 응답 26배 빠르게 개선해보기를 겪으면서, 복잡한 쿼리들을 메서드 체이닝을 이용해서 가져올 수 있었다면(QueryDSL을 썼다면) 이런 느린 쿼리 말고도 연관관계가 깊은 복잡한 쿼리들도 단번에 가져올 수 있지 않을까하는 생각이 들었다.

이번 글에서는 ORM과 JPA에 대해서 간단히 알아보고, QueryDSL의 간단한 적용과 예시를 구현해보고자 한다.

이를 통해서 추후에 직접 서비스에 적용해서 위에서 일어났던 휴먼 에러와 몰라서 생기는 불필요한 호출들을 줄일 수 있으면 좋겠다!


ORM부터 Spring Data JPA까지

우선 QueryDSL로 넘어가기 전에, 간단하게 ORM과 Spring Data JPA에 대해서 짚고 가보자.

ORM(Object-Relational-Mapping)

스크린샷 2023-07-17 오후 8.53.55.png

**객체 관계 매핑(ORM)**은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다.

간단하게 말하면 ‘백엔드 서버(WAS, Web Application Server)와 DB 서버간의 데이터 형변환’이라고 생각할 수 있겠다. 다음 코드를 생각해보자.

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

	private Long id;
	private String name;
	private Integer age;

	public static Member of(String name, Integer age) {
		Member member = new Member();
		member.name = name;
		member.age = age;
		return member;
	}
}

위 Member는 ‘WAS의 객체’이다.

DB에 member라는 테이블이 있고, 그곳에 id, name, age라는 column이 있다고 하자. 물론 우리 눈에는 같은 데이터처럼 보일 수는 있다. 하지만..

DB와 WAS는 서로 다른 방식의 데이터 양식을 가진다.

이 둘을 DB와 WAS가 한 몸처럼 유연하게 읽기, 쓰기를 하기 위해 ORM을 사용하는 것이다.

ORM은 단순히 한 언어나 프레임워크에만 국한되는 개념은 아니다. Object와 연관해서 DB와 상호 Mapping하면 그것이 ORM인 것이다.

JDBC와 Hibernate

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. → DB와 가장 맞닿아있는 저수준의 영역이며, 각 DB에 대해 알맞게 구현하도록 Interface를 명세한다.