Blog-V3, 스칼라(Scala),QLRM(Query Language Result Mapping)

Scala, QLRM(Query Language Result Mapping)
홍윤's avatar
Sep 13, 2024
Blog-V3, 스칼라(Scala),QLRM(Query Language Result Mapping)
 

1. 스칼라(Scala)

💡
스칼라(Scala)는 객체지향함수형 프로그래밍 패러다임을 통합한 고급 프로그래밍 언어입니다. JVM(Java Virtual Machine) 위에서 실행되며, 자바와의 상호 운용성이 뛰어나 자바의 대안으로 사용되는 경우가 많습니다. 스칼라는 간결하고 표현력이 뛰어나며, 특히 대규모 데이터 처리 및 동시성 프로그래밍에 적합한 특징을 가지고 있습니다.

스칼라의 주요 특징

  1. 객체지향: 스칼라는 모든 것이 객체입니다. 자바처럼 클래스, 객체, 상속을 지원하며, 자바와 비슷한 문법을 사용합니다.
  1. 함수형 프로그래밍: 스칼라는 함수형 프로그래밍 패러다임을 지원하며, 함수는 일급 시민(first-class citizen)입니다. 즉, 함수가 변수처럼 사용될 수 있습니다. 이를 통해 불변성(immutability) 및 순수 함수 같은 함수형 프로그래밍의 핵심 개념을 활용할 수 있습니다.
  1. 타입 추론: 스칼라는 변수와 함수의 타입을 자동으로 추론합니다. 이를 통해 코드가 더 간결해집니다.
    1. val x = 10 // Int로 추론
  1. 표현력: 스칼라는 매우 간결한 코드 작성이 가능합니다. 한 줄로 작성할 수 있는 코드가 많으며, 간단한 구문으로 복잡한 로직을 처리할 수 있습니다.
  1. JVM 호환성: 스칼라는 JVM 위에서 실행되므로, 자바 코드와 상호 운용이 가능합니다. 자바 라이브러리를 사용할 수 있으며, 자바 프로젝트에 스칼라 코드를 쉽게 통합할 수 있습니다.

스칼라 코드 예시

1. 간단한 함수

def add(x: Int, y: Int): Int = { x + y } val result = add(3, 5) println(result) // 8

2. 함수형 프로그래밍

val numbers = List(1, 2, 3, 4, 5) val doubled = numbers.map(_ * 2) println(doubled) // List(2, 4, 6, 8, 10)

3. 불변성(immutability)

val name = "Alice" // name = "Bob" // 오류: val은 불변성을 가지므로 재할당 불가능

4. 고차 함수 (함수를 인자로 받거나 반환하는 함수)

def applyOperation(x: Int, y: Int, operation: (Int, Int) => Int): Int = { operation(x, y) } val sum = applyOperation(5, 3, _ + _) val product = applyOperation(5, 3, _ * _) println(sum) // 8 println(product) // 15

스칼라의 활용

  • 데이터 처리: 스칼라는 Apache Spark와 같은 분산 데이터 처리 시스템에서 많이 사용됩니다.
  • 웹 개발: Play Framework와 같은 스칼라 기반의 웹 프레임워크를 통해 웹 애플리케이션을 개발할 수 있습니다.
  • 동시성 프로그래밍: 스칼라는 액터 기반의 동시성 모델인 Akka 프레임워크와 함께 사용되며, 대규모 동시성 처리에 적합합니다.

결론

스칼라는 자바와 같은 객체지향 프로그래밍의 장점과 함수형 프로그래밍의 강력함을 결합한 언어로, 대규모 시스템 및 복잡한 로직을 간결하게 처리하는 데 매우 유용합니다. 특히, 데이터 처리와 동시성 프로그래밍에 적합한 언어입니다.

 

2. QLRM(Query Language Result Mapping)

💡
QLRM(Query Language Result Mapping)은 JPAHibernate에서 Native Query의 결과를 객체에 직접 매핑해주는 라이브러리입니다. QLRM을 사용하면 복잡한 SQL 쿼리의 결과를 DTO나 특정 클래스에 매핑할 수 있습니다. 이 라이브러리는 JPA의 EntityManager에서 직접 SQL을 실행할 때, 결과를 자동으로 객체로 변환해줍니다.

QLRM의 주요 특징

  1. Native Query 지원: 복잡한 SQL 쿼리를 사용해야 할 때, JPA의 @Query나 JPQL로 처리하기 어려운 경우 Native Query를 사용해도 객체로 쉽게 매핑할 수 있습니다.
  1. DTO 매핑: 엔티티 외의 특정 클래스나 DTO(Data Transfer Object)로 결과를 매핑할 수 있습니다.
  1. 간단한 사용법: EntityManager와 함께 동작하며, QueryResultMapper 클래스를 사용해 결과를 객체로 변환합니다.

QLRM 사용 예시

1. 의존성 추가:

QLRM은 Maven Central에 등록되어 있으므로, 프로젝트에 추가하려면 다음과 같은 의존성을 추가해야 합니다.

Maven:

<dependency> <groupId>com.github.qlrm</groupId> <artifactId>qlrm</artifactId> <version>1.7.0</version> </dependency>

Gradle: 가져오기 : https://mvnrepository.com/artifact/org.qlrm/qlrm

implementation group: 'org.qlrm', name: 'qlrm', version: '4.0.1'

2. DTO 클래스 생성:

먼저 Native Query 결과를 담을 DTO 클래스를 정의합니다.
public class UserDTO { private Long id; private String loginId; private String email; // 생성자 public UserDTO(Long id, String loginId, String email) { this.id = id; this.loginId = loginId; this.email = email; } // getter 및 setter public Long getId() { return id; } public String getLoginId() { return loginId; } public String getEmail() { return email; } }

3. Native Query 실행 및 QLRM 사용:

EntityManager를 사용하여 Native Query를 실행하고, QLRM의 QueryResultMapper를 사용하여 결과를 DTO로 매핑합니다.
import com.github.qlrm.mapper.JpaResultMapper; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class UserRepository { private final EntityManager em; public UserRepository(EntityManager em) { this.em = em; } public List<UserDTO> findUsers() { // Native Query 작성 String sql = "SELECT id, login_id, email FROM user_tb"; Query query = em.createNativeQuery(sql); // QLRM을 사용하여 결과를 UserDTO로 매핑 JpaResultMapper jpaResultMapper = new JpaResultMapper(); List<UserDTO> users = jpaResultMapper.list(query, UserDTO.class); return users; } }

주요 구성 요소:

  1. Native Query 실행: em.createNativeQuery() 메서드를 사용하여 SQL을 실행합니다.
  1. JpaResultMapper를 사용한 매핑: JpaResultMapper 클래스를 사용하여 Native Query의 결과를 지정된 DTO 클래스(UserDTO)로 매핑합니다.
  1. 결과 리스트 반환: 매핑된 결과를 리스트로 반환합니다.

4. 서비스 레이어에서 호출:

위에서 정의한 UserRepository를 서비스 레이어에서 사용하여 결과를 처리할 수 있습니다.
@Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public List<UserDTO> getAllUsers() { return userRepository.findUsers(); } }

결론:

QLRM은 JPA나 Hibernate에서 Native Query를 실행한 후, 그 결과를 객체로 매핑하는 것을 쉽게 도와주는 라이브러리입니다. Native SQL을 사용해야 할 때, 직접적으로 엔티티가 아닌 DTO로 결과를 매핑할 수 있는 장점을 제공합니다. QLRM을 사용하면 Native Query를 더 유연하게 활용할 수 있으며, 복잡한 SQL 쿼리 결과를 DTO로 변환하는 작업을 간단하게 처리할 수 있습니다.
 
Share article

Uni