SpringBoot 를 배워보자

오라클 환경에서 MyBatis를 사용하여 SQL을 기능적으로 쪼개어 동적으로 조합하는 예

_Blue_Sky_ 2024. 12. 2. 23:12
728x90

MyBatis에서 SQL 문을 기능적으로 쪼개어 필요에 따라 조합하는 방법은 주로 동적 SQL을 활용하여 구현할 수 있습니다. MyBatis는 <if>, <choose>, <when>, <foreach>, <trim> 등의 태그를 제공하여 조건에 맞는 SQL을 동적으로 생성할 수 있게 합니다. 이를 통해 SQL을 조합하거나 조건에 따라 쪼갠 후, 필요에 맞게 결합할 수 있습니다.

아래는 오라클 환경에서 MyBatis를 사용하여 SQL을 기능적으로 쪼개어 동적으로 조합하는 예입니다.

예제: 동적 검색 조건을 활용한 SQL 쪼개기

1. SQL Mapper 파일 (XML)

<mapper namespace="com.example.mapper.UserMapper">

  <!-- 동적 검색 SQL -->
  <select id="selectUsers" resultType="User">
    SELECT * 
    FROM users 
    WHERE 1=1
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
    <if test="email != null">
      AND email = #{email}
    </if>
    <if test="status != null">
      AND status = #{status}
    </if>
  </select>

</mapper>

이 예제에서는 name, age, email, status와 같은 여러 검색 조건이 주어질 때, 해당 조건들이 존재하면 그 조건만을 포함하는 SQL을 동적으로 생성합니다. 조건이 없다면 해당 조건은 SQL에 포함되지 않게 됩니다.

 

728x90

2. Java 인터페이스

package com.example.mapper;

import com.example.domain.User;
import java.util.List;

public interface UserMapper {
  List<User> selectUsers(String name, Integer age, String email, String status);
}

3. Service 클래스 (Java)

package com.example.service;

import com.example.domain.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {

  @Autowired
  private UserMapper userMapper;

  public List<User> searchUsers(String name, Integer age, String email, String status) {
    return userMapper.selectUsers(name, age, email, status);
  }
}

4. Mapper 호출 예제

package com.example;

import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class UserController {

  @Autowired
  private UserService userService;

  public List<User> getUsers(@RequestParam(required = false) String name, 
                             @RequestParam(required = false) Integer age, 
                             @RequestParam(required = false) String email,
                             @RequestParam(required = false) String status) {
    return userService.searchUsers(name, age, email, status);
  }
}

 

728x90

동적 SQL의 특징

  • 조건에 따른 쪼개기: <if> 태그를 사용해 조건이 만족할 때만 SQL에 포함하도록 쪼갭니다.
  • 가변적인 조건: 사용자가 입력하는 파라미터에 따라 SQL이 달라지기 때문에, 필요에 따라 기능적으로 조합된 SQL 문을 생성할 수 있습니다.
  • 재사용성: 각 조건을 독립적으로 관리하여, 여러 곳에서 재사용할 수 있습니다.

이처럼 MyBatis에서 SQL을 쪼개서 조합하는 방법은 주로 동적 SQL을 사용하여 조건에 맞는 부분만을 포함시키는 방식으로 처리합니다.

 


User VO (Value Object) 생성

MyBatis의 동적 SQL 예제에서 데이터를 담을 User VO를 생성하는 것은 필수적인 작업입니다. User VO는 데이터베이스의 users 테이블과 일대일 매핑되는 자바 객체로, SQL 쿼리 결과를 담아서 사용하게 됩니다.

1. User 클래스 생성:

package com.example.domain;

public class User {
    private int id;
    private String name;
    private int age;
    private String email;
    private String status;

    // getter, setter 생성 (lombok 등을 사용하면 편리하게 생성 가능)

    // toString() 메서드 오버라이딩 (디버깅 시 유용)
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", status='" + status + '\'' +
                '}';
    }
}

2. Mapper XML 파일 수정:

<mapper namespace="com.example.mapper.UserMapper">
  <select id="selectUsers" resultType="com.example.domain.User">
    </select>
</mapper>

resultType 속성에 com.example.domain.User를 지정하여 쿼리 결과를 User 객체에 매핑하도록 합니다.

lombok을 사용한 간편한 setter와 getter 생성

lombok은 자바 개발 생산성을 높여주는 유용한 라이브러리입니다. getter, setter, 생성자 등 반복적인 코드를 자동으로 생성해주는 기능을 제공합니다.

1. build.gradle (Gradle) 또는 pom.xml (Maven)에 lombok 의존성 추가:

// build.gradle (Gradle)
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// pom.xml (Maven)
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version> <scope>provided</scope>
</dependency>

2. User 클래스에 @Data 어노테이션 추가:

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private int age;
    private String email;
    private String status;
}

@Data 어노테이션은 다음 기능을 한 번에 제공합니다:

  • 모든 필드에 대한 getter와 setter 자동 생성
  • equals(), hashCode(), toString() 메서드 자동 생성
  • allArgsConstructor, noArgsConstructor 등 다양한 생성자 자동 생성

3. 완성된 User 클래스:

lombok을 사용하면 위와 같이 간단하게 User 클래스를 작성할 수 있습니다. 컴파일 시 lombok이 자동으로 getter와 setter를 생성해주기 때문에 개발자가 직접 작성할 필요가 없습니다.

728x90