[java] MyBatis에서 XML과 애노테이션을 혼합해서 사용하는 방법

MyBatis는 Java에서 SQL 데이터베이스 접근을 단순화하기 위한 프레임워크로 많은 개발자들이 사용하고 있습니다. MyBatis는 SQL 매핑을 위해 XML을 지원하며, 최근 버전에서는 애노테이션을 통한 매핑도 지원합니다. 이번 글에서는 MyBatis에서 XML과 애노테이션을 혼합해서 사용하는 방법에 대해 알아보겠습니다.

1. XML과 애노테이션의 장단점

XML을 사용한 MyBatis는 매핑 정보를 명확하게 정의하고 유지보수하기 쉽게 만들어줍니다. 또한, 별도의 컴파일 과정 없이 동적으로 쿼리를 생성하는 기능을 제공합니다. 하지만 XML은 복잡한 구조를 가지고 있어 코드 가독성이 떨어지고, 실수할 수 있는 여지가 있습니다.

반면, 애노테이션은 코드 자체에 매핑 정보를 포함하므로 코드 가독성을 높일 수 있습니다. 또한, 컴파일 시에 오류를 잡을 수 있으므로 실수를 방지할 수 있습니다. 하지만 애노테이션은 동적으로 쿼리를 생성하는 기능을 제공하지는 않습니다.

따라서, MyBatis를 사용할 때는 XML과 애노테이션을 혼합하여 사용하는 것이 좋습니다. XML을 사용하여 정적인 쿼리를 작성하고, 애노테이션을 사용하여 동적인 쿼리를 작성하는 방법을 사용할 수 있습니다.

2. XML과 애노테이션 혼합 사용 방법

MyBatis에서 XML과 애노테이션을 혼합해서 사용하려면 다음과 같은 단계를 따라야 합니다.

2.1. 인터페이스 생성

먼저, MyBatis 매퍼 인터페이스를 생성합니다. 이 인터페이스는 애노테이션을 통해 매핑 정보를 포함하게 됩니다.

public interface UserMapper {

    // 애노테이션을 통해 매핑 정보를 포함한 메소드 선언
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);

}

2.2. XML 매퍼 작성

다음으로, XML 매퍼 파일을 작성합니다. 이 파일은 XML을 사용하여 정적인 쿼리를 작성할 수 있습니다.

<!-- UserMapper.xml -->

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

    <!-- XML을 통해 정적인 쿼리 작성 -->
    <select id="getUserByName" resultType="User">
        SELECT * FROM users WHERE name = #{name}
    </select>

</mapper>

2.3. MyBatis 구성 설정

MyBatis 구성 파일에는 XML과 애노테이션을 모두 사용하기 위한 설정이 필요합니다. 이를 위해 다음과 같이 설정해줍니다.

<!-- mybatis-config.xml -->

<configuration>

    <!-- XML 매퍼 파일 등록 -->
    <mappers>
        <mapper resource="com/example/UserMapper.xml"/>
    </mappers>

    <!-- 애노테이션 스캔 설정 -->
    <settings>
        <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
    </settings>

</configuration>

위의 설정에서 <setting> 요소를 통해 XMLLanguageDriver를 사용하도록 설정했습니다. 이를 통해 애노테이션과 XML을 함께 사용할 수 있게 됩니다.

2.4. 사용하기

이제 MyBatis를 사용하여 XML과 애노테이션을 혼합해서 쿼리를 수행할 수 있습니다.

// MyBatis 설정 로드
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// SqlSession 생성
SqlSession sqlSession = sqlSessionFactory.openSession(true);

// 매퍼 인터페이스 가져오기
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 애노테이션을 통한 쿼리 실행
User user = userMapper.getUserByName("John");
System.out.println(user);

// XML을 통한 쿼리 실행
User user = userMapper.getUserById(1);
System.out.println(user);

위의 예시에서는 애노테이션을 통해 getUserByName 메소드를 호출하고, XML을 통해 getUserById 메소드를 호출하는 방법을 보여줍니다.

결론

MyBatis에서 XML과 애노테이션을 혼합해서 사용하면 정적인 쿼리에는 XML을, 동적인 쿼리에는 애노테이션을 사용하여 코드의 가독성과 유지보수성을 높일 수 있습니다. XML과 애노테이션을 혼합하여 MyBatis를 사용해보세요!