본문 바로가기
카테고리 없음

자바 최대 절전 모드 (4) - 쿼리 · SQL · 저장 프로시저

by gentle-tiger 2025. 7. 10.

Hibernate 4 - 쿼리 · SQL · 저장 프로시저

  1. 명명된(Named) SQL 쿼리란 무엇입니까?
  2. 명명된 SQL 쿼리의 이점은 무엇입니까?
  3. 저장 프로시저를 어떻게 호출합니까?

 

명명된(Named) SQL 쿼리란 무엇입니까?

명명된(Named) SQL 쿼리는 @NamedQuery · @NamedNativeQuery(또는 XML)로 애플리케이션 시작 시 한 번만 등록해 두고, 실행할 때는 긴 SQL 문자열 대신 지정한 이름으로 호출하는 사전 정의 JPQL·네이티브 SQL입니다. 이렇게 하면 자주 쓰는 쿼리를 중앙에서 관리해 오타나 중복 선언을 막고, 코드와 SQL을 분리해 유지보수와 재사용성을 크게 높일 수 있습니다.

@Entity
@NamedQuery(name = "findByName", query = "SELECT m FROM Member m WHERE m.name = :name")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    
    // Getters and Setters
}

 

명명된 SQL 쿼리의 이점은 무엇입니까?

명명된 SQL쿼리는 한번 정의한 쿼리를 여러 곳에서 사용할 수 있으며, 쿼리 문장을 직접 하드코딩하지 않고 이름을 통해 참조할 수 있기 때문에 코드의 가독성과 유지보수가 쉬워집니다. 

 

저장 프로시저를 어떻게 호출합니?

저장 프로시저는 DB 서버에 미리 정의된 SQL 명령어의 집합으로, DB에 저장된 SQL 명령어를 반복적으로 사용할 수 있는 SQL 코드 블럭입니다. Hibernate에서 저장 프로시저를 호출할 때는 session.createSQLQuery()나 @Query 어노테이션을 사용하여 파라미터를 전달하고 실행하는 방식으로 진행됩니다. 

-- MySQL 예시: 사용자 상태 업데이트 프로시저
CREATE PROCEDURE update_member_status(IN member_id INT, IN new_status VARCHAR(50))
BEGIN
    UPDATE members
    SET status = new_status
    WHERE id = member_id;
END;

 

session.createSQLQuery() 방식

import org.hibernate.Session;
import org.hibernate.query.Query;

public class MemberRepository {

    public void callStoredProcedure(Session session) {
        String sql = "CALL update_member_status(:memberId)";
        Query query = session.createSQLQuery(sql);
        query.setParameter("memberId", 123);
        query.executeUpdate(); // 저장 프로시저 실행
    }
}

 

@Query 방식

public interface MemberRepository extends JpaRepository<Member, Long> {

    // 네이티브 SQL로 저장 프로시저 호출
    @Query(value = "CALL update_member_status(:memberId, :status)", nativeQuery = true)
    void updateMemberStatus(@Param("memberId") Long memberId, @Param("status") String status);
}

 

저장 프로시저는 매일 처리해야 하는 대규모 배치 처리나 금융 기관의 계좌 이체 등의 복잡한 조건문과 계산을 포함하는 등의 작업에서 주로 사용합니다. 또한 네트워크 비용을 줄이기 위해 여러 SQL 명령을 하나의 트랜잭션으로 묶어 처리할 수 있으며 DB와 트랜잭션 범위를 확장할 수도 있습니다.