[GP] Spring boot에서 DBMS를 연동하는 방법 JPA 고급편

이 글은 N.K Dev Lab에서 작성된 글입니다.

안녕하세요. Spring 관련 글을 정말 안쓴지가 너무 오래되었네요…ㅠㅠ 요즘 데이터 분야에서 일하다보니 R을 다루면서 백엔드에 대한 포스팅이 많이 밀려있네요.. 앞으로는 Spring을 이용한 오픈 프로젝트에 참여 중이니 다시 재건을 위해서라도 천천히 하나씩 글을 작성해보도록 하겠습니다.

이번에는 지난 글에 이어서 JPA 고급편에 대해 작성해보도록 하겠습니다. 워낙 오래됐음에도 불구하고 고급편에 무엇을 적어야할지 명시가 되어 있네요. 오늘은 그 부분을 다뤄보겠습니다.

SQL과 HQL

SQL은 Structed Query Language의 약자로 DBMS의 데이터를 조작/제어하는 쿼리 언어 중에 하나입니다. SQL Server에서는 T-SQL을 사용하는 것처럼 말이죠.

HQL은 그것과 유사하게 Hibernate Query Language의 약자로 객체 지향적으로 데이터베이스를 다루도록하는 쿼리 언어입니다. Spring boot에서 주로 데이터베이스를 다룰 때 사용하는 hibernate 라이브러리를 쿼리로 질의할 때 사용하는 언어 중 하나이며 무엇보다 장점은 SQL에서는 여러 테이블을 작업할 때 명시적인 JOIN 쿼리를 요구하지만 HQL은 그러한 쿼리를 요구하지 않는다는 것입니다.

HQL의 장단점

그럼 간단히 HQL이 SQL에 비하여 어떠한 점이 좋고 나쁜지를 정리해보겠습니다.

  • 장점
    1. 객체지향적으로 데이터를 관리할 수 있습니다.
    2. 앞서 기본편에서 JPA를 다뤘듯이 테이블 생성, 변경, 관리가 쉽습니다.
    3. 정적인 쿼리를 정의하지 않고 객체에 집중하기 때문에 빠른 개발이 가능합니다.
  • 단점
    1. 일반적인 SQL Query를 사용할 때 보다 성능적인 이슈가 존재합니다.
    2. 데이터 손실에 대해 민감합니다.

확실히 편한만큼 단점이 존재합니다. 정적인 쿼리를 사용하면 그만큼 빠르다는 장점이 있는 반면 개발은 조금 어려워지고 쉽게 개발하려고 한다면 그만큼 성능의 감소는 조금은 감안해야 합니다.

HQL을 사용해야 하는 경우

기본편에서 간단한 코드 작성으로 CRUD를 작성했습니다. 이를 통하여 Create, Read, Update, Delete를 별도의 쿼리 없이 쉽게 진행할 수 있었는데요. 그렇다면 어떨 때 쿼리 언어를 사용해야 할까요?

코드를 살펴보도록 하겠습니다. (이번 포스트에서는 Kotlin 코드만을 다룰 것입니다.)

1
2
3
4
5
6
7
8
9
10
11
12
package xyz.neonkid.jpaexample.Model

import java.io.Serializable
import javax.persistence.*

@Entity
@Table(name = "items")
data class Item(@Column(name = "name", updatable = false, nullable = false) val name: String, @Column(name = "price", updatable = false, nullable = false) val price: Int) : Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
val Id: Long? = null
}
1
2
3
4
5
6
7
package xyz.neonkid.jpaexample.Model

import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface ItemRepository : CrudRepository<Item, Long>

기본편에서 이 두가지 코드만을 가지고 REST API를 호출하여 Item 테이블에 대한 정보를 가져오고, 값을 추가하는 것이 가능했습니다. 그런데, 여기서 기본적으로 제공하는 간단한 쿼리 말고 나만의 조건을 걸어줘서 나만의 메소드를 정의해야할 때가 있습니다. 어떠한 경우가 있을까요?

예를 들자면, 지금은 GET 메소드를 이용해서 Items 테이블의 모든 요소를 가져오게끔 기본적으로 작성되어 있습니다. 하지만 특정 아이템 한 가지만을 고르고 싶다면? 물론 GET 메소드를 통해서 모든 아이템 요소를 가져온 다음 클라이언트 단에서 색인하는 방법도 있을 것입니다. 하지만 이 방법은 테이블 내에 item이 10,000개, 100,000개 있는 무수한 경우가 생길 수 있기 때문에 정말 좋은 방법이 아닙니다.

이럴 경우 HQL을 사용해서 코드를 작성해주시면 됩니다.


이어서 읽으시려면 아래의 버튼을 클릭해주세요.


... 계속 읽기


comments powered by Disqus

Tistory Comments 0