스마트웹앱콘텐츠전문가

MyBatis에서 String 비교 시 == 대신 equals()를 사용해야 하는 이유

9D4U 2025. 3. 26. 12:30
728x90
반응형

MyBatis는 Java와 SQL을 매핑하여 데이터베이스 쿼리를 실행하는 프레임워크입니다. MyBatis에서 조건을 설정할 때, 특히 String 객체를 비교하는 경우, 주의해야 할 점이 있습니다. 자주 발생하는 오류 중 하나는 test 구문에서 == 연산자를 사용하여 String 값을 비교할 때 조건이 만족하지 않는 문제입니다. 이 문제를 해결하려면 == 대신 equals 메서드를 사용해야 합니다. 이 글에서는 MyBatis에서 String 비교 시 발생할 수 있는 오류와 이를 해결하는 방법에 대해 설명합니다.

 

 

img

 


1. MyBatis에서 test 구문과 == 비교

 

MyBatis는 동적 SQL을 작성할 때, <if> 또는 <when> 태그를 사용하여 조건을 설정할 수 있습니다. 이때, 특정 조건에 맞는 쿼리만 실행되도록 하려면 조건식을 정확하게 작성해야 합니다.

다음은 MyBatis의 test 구문에서 String 비교를 시도하는 코드 예시입니다:

 

<when test="clmTypStr == 'NC'">

 

위 코드에서는 clmTypStr이 'NC'와 같은지 비교하는 조건을 작성하고 있습니다. 그런데 이 코드가 제대로 작동하지 않는 경우가 많습니다. 왜 그럴까요?

 

 

 


2. == 연산자와 equals() 메서드의 차이

 

Java에서 == 연산자는 참조 비교를 수행합니다. 즉, 두 객체가 동일한 메모리 주소를 참조하는지 비교합니다. 반면, equals() 메서드는 값 비교를 수행합니다. 문자열 비교의 경우, 문자열의 내용이 같은지 확인해야 하므로 equals()를 사용해야 합니다.

 

예시 1: == 연산자 사용

String str1 = new String("NC");
String str2 = new String("NC");

System.out.println(str1 == str2); // false

위의 예시에서 str1 == str2는 false를 출력합니다. 그 이유는 new String("NC")로 두 개의 서로 다른 객체를 생성했기 때문입니다. 따라서 메모리 주소가 다르기 때문에 참조 비교에서 false가 반환됩니다.

 

예시 2: equals() 메서드 사용

String str1 = new String("NC");
String str2 = new String("NC");

System.out.println(str1.equals(str2)); // true

 

반면, str1.equals(str2)는 true를 반환합니다. 이는 equals()가 객체의 값을 비교하기 때문입니다.

 

 

 


3. MyBatis에서 == 대신 equals() 사용하기

 

MyBatis에서 String 객체를 비교할 때 ==를 사용하면 test 구문이 제대로 동작하지 않을 수 있습니다. 이를 해결하려면, == 대신 equals() 메서드를 사용해야 합니다.

올바른 예시

<when test="clmTypStr.equals('NC')">

 

위와 같이 equals() 메서드를 사용하면, clmTypStr이 'NC'와 동일한 값을 가질 때 조건이 만족하게 됩니다. equals()는 문자열의 내용을 비교하기 때문에, String 객체를 비교할 때는 항상 equals()를 사용해야 합니다.

 

 

 

반응형

 

 


4. 실수로 ==을 사용했을 때 발생할 수 있는 문제

 

==를 사용하여 문자열을 비교할 때 발생할 수 있는 문제는 다음과 같습니다:

 

  • 조건이 만족하지 않음: String 객체는 동일한 내용이라도 서로 다른 메모리 주소를 가질 수 있기 때문에, == 비교는 항상 실패할 수 있습니다.
  • 디버깅이 어려움: 개발자는 String 값이 같다고 생각하고 조건문을 작성하지만, 실제로는 참조가 다르기 때문에 조건이 만족되지 않아 예상하지 못한 결과를 초래할 수 있습니다.

 

 

 


5. MyBatis에서 문자열 비교 시 주의 사항

 

MyBatis의 test 구문에서 String을 비교할 때 다음과 같은 사항들을 유의해야 합니다:

 

  1. equals() 메서드를 사용: 문자열 비교를 할 때는 반드시 equals()를 사용하세요. == 연산자는 참조를 비교하므로 문자열 값 비교에는 적합하지 않습니다.
  2. 빈 문자열 비교: clmTypStr 값이 빈 문자열인 경우도 처리해야 합니다. 이를 위해 StringUtil.nullToSpaceTrim() 같은 방법을 사용하여 값을 미리 처리하고 조건을 작성하는 것이 좋습니다.
  3. null 체크: clmTypStr이 null인 경우도 있을 수 있습니다. 이를 체크하고 비교하기 전에 null인 경우를 처리하는 로직을 추가해야 합니다.

 

 

 


 

 

 

MyBatis에서 String을 비교할 때 == 대신 equals()를 사용해야 하는 이유는, ==는 객체의 참조를 비교하고, equals()는 객체의 내용을 비교하기 때문입니다. MyBatis의 test 구문에서 문자열을 비교할 때 조건이 만족하지 않는 문제를 해결하려면, 항상 equals()를 사용하여 문자열의 값을 정확하게 비교하는 것이 중요합니다. 이를 통해 동적 SQL에서 발생할 수 있는 오류를 방지하고, 보다 안정적인 쿼리 로직을 작성할 수 있습니다.

MyBatis를 활용한 동적 SQL 작성 시 이러한 점들을 유의하면서 개발하면, 코드의 안정성을 높이고, 불필요한 디버깅 시간을 줄일 수 있습니다.

728x90