본문으로 바로가기
반응형

안녕하세요, 여러분. 오늘은 MyBatis의 SQL Builder를 이용하여 동적 SQL을 작성하는 방법에 대해 알아보도록 하겠습니다. 조건이 최소 3개인 SQL을 작성하고 이를 반환하는 메서드를 예제로 살펴보며 시작하겠습니다.

SQL Builder란?
SQL Builder는 MyBatis에서 제공하는 도구로, Java 코드로 SQL 문을 작성하고 실행할 수 있게 도와줍니다. 이를 이용하면 동적으로 SQL 문을 생성하고 조건을 추가할 수 있습니다.

SQL 작성 메서드 만들기
다음은 조건이 여러개인 SQL을 작성하고 이를 반환하는 메서드의 예제입니다.

import org.apache.ibatis.jdbc.SQL;

public String buildSelectSQL(String col1, String col2, String col3) {
    final String TB_CONFIG = "tb_config";
    SQL sql = new SQL();

    sql.SELECT("*")
       .FROM(TB_CONFIG)
       .WHERE("col1 = #{col1}")
       .WHERE("col2 = #{col2}")
       .WHERE("col3 = #{col3}");

    return sql.toString();
}

위 코드는 buildSelectSQL 메서드를 정의하고 있습니다. 이 메서드는 col1, col2, col3라는 세 가지 매개변수를 받아서 이를 조건으로 하는 SQL 문을 작성합니다. SELECT * FROM tb_config WHERE col1 = #{col1} AND col2 = #{col2} AND col3 = #{col3} 형식의 SQL 문을 반환합니다.

SQL 작성 메서드 사용하기
이제 buildSelectSQL 메서드를 이용하는 방법을 알아봅시다.

public void executeQuery() {
    String sql = buildSelectSQL("value1", "value2", "value3");

    // 여기에서 sql을 이용하여 쿼리를 실행합니다.
    System.out.println(sql);
}

위 코드는 buildSelectSQL 메서드를 호출하여 SQL 문을 생성하고, 이를 출력하는 예제입니다.

SQL Builder 외의 다른 방법
SQL Builder 외에도 동적 SQL을 작성하는 다른 방법으로는 문자열 연산을 이용하는 방법, StringBuilder나 StringBuffer를 이용하는 방법, 그리고 String.format을 이용하는 방법 등이 있습니다. 하지만 이런 방법들은 SQL 문이 복잡해질수록 코드의 가독성을 떨어뜨리는 단점이 있습니다. 반면에 SQL Builder를 이용하면 SQL 문이 복잡해져도 코드의 가독성을 유지할 수 있습니다.

그래도 확인차 방법들에 대해 알아보겠습니다.

StringBuilder를 이용한 SQL 작성
먼저, 가장 흔하게 사용되는 StringBuilder를 이용한 SQL 작성 방법을 알아보겠습니다.

public String buildSelectSQLUsingStringBuilder(String col1, String col2, String col3) {
    StringBuilder sb = new StringBuilder();
    sb.append("SELECT * FROM tb_config WHERE ")
      .append("col1 = '").append(col1).append("' AND ")
      .append("col2 = '").append(col2).append("' AND ")
      .append("col3 = '").append(col3).append("'");

    return sb.toString();
}

StringBuilder는 문자열을 변경 가능한 상태로 관리하여 여러 조각의 문자열을 효율적으로 연결할 수 있습니다.

StringBuffer를 이용한 SQL 작성
다음으로는 StringBuffer를 이용한 방법을 살펴보겠습니다.

public String buildSelectSQLUsingStringBuffer(String col1, String col2, String col3) {
    StringBuffer sb = new StringBuffer();
    sb.append("SELECT * FROM tb_config WHERE ")
      .append("col1 = '").append(col1).append("' AND ")
      .append("col2 = '").append(col2).append("' AND ")
      .append("col3 = '").append(col3).append("'");

    return sb.toString();
}

StringBuffer는 StringBuilder와 비슷하게 작동하지만, 멀티스레드 환경에서 안전하도록 동기화가 되어 있는 차이점이 있습니다.

String.format을 이용한 SQL 작성
마지막으로, String.format을 이용한 방법을 살펴보겠습니다.

public String buildSelectSQLUsingStringFormat(String col1, String col2, String col3) {
    return String.format("SELECT * FROM tb_config WHERE col1 = '%s' AND col2 = '%s' AND col3 = '%s'", col1, col2, col3);
}

String.format은 템플릿 문자열에 변수를 삽입하여 문자열을 생성하는 방법입니다. SQL 문을 작성할 때는 주의해야 하며, 외부에서 입력받은 값이 SQL Injection 공격에 사용될 수 있기 때문입니다.

위의 방법들은 간단한 SQL 작성에 효과적일 수 있지만, SQL 문이 복잡해지면 가독성을 저해하거나 오류를 유발할 수 있습니다. 이럴 때는 MyBatis와 같은 도구를 사용하는 것이 더 효율적일 수 있습니다.

MyBatis의 SQL Builder를 이용하면 동적으로 SQL 문을 작성하고 실행할 수 있습니다. 이를 활용하면 코드의 가독성을 높이면서도 복잡한 SQL 문을 효율적으로 작성할 수 있습니다.

 

반응형