본문 바로가기

Java/mybatis

mapper 인터페이스에서 사용 가능한 annotation

 

Annotation

Location

XML Element

Description

@CacheNamespace

 class

<cache>

네임스페이스가 되는 인터페이스별로 Cache를 설정한다.

사용 가능한 속성은 implementation, eviction, flushInterval, size, 그리고 readWrite 등이 있다.

@CacheNamespaceRef

class

<cacheRef>

다른 네임스페이스의 캐시 설정을 그대로 사용하기 위해 사용할 캐시 설정이 담긴 네임스페이스를 지정한다.

사용 가능한 속성은 네임스페이스의 이름 적어주는 value 한 개다.

@ConstructorArgs

method

<constructor>

조회 결과를 자바 객체에 설정할 때 생성자를 사용해서 처리한다.

사용 가능한 속성은 @Arg 어노테이션의 배열을 갖는 value 이다.

@Arg

method

<arg>, <idArg>

@ConstructorArgs 어노테이션의 내용을 구성한다. 생성자의 파라미터 하나 하나를 지정하는데 사용한다.

사용 가능한 속성들은 id, column, javaType, jdbcType, typeHandler, select, resultMap 등이 있다.

id 속성은 기본 키인지 아닌지를 비교하기 위해 사용되는 값이다. id 속성에 따라 매퍼 XML의 idArg, arg 두 가지 엘리먼트와 유사하다.

@TypeDiscriminator

method

<discriminator>

결과 매핑을 할 때 동적으로 결과 매핑을 선택한다.

사용 가능한 속성들은 column, javaType, jdbcType, typeHandler, cases 등이 있다. cases 속성은 비교하는 조건을 배열 형태로 정의한다.

@Case

method

<case>

@TypeDiscriminator 어노테이션에서 비교하고자 하는 조건을 명시할 때 사용한다.

사용 가능한 속성들은 value, type, results 등이 있다.

results 속성은 @Result 어노테이션의 배열이다.

@Results

method

<resultMap>

결과 매핑의 세부 설정을 다룬다.

사용 가능한 속성들은 결과 매핑을 구성하는 클래스 필드 각각을 지정하는 @Result 어노테이션의 배열을 갖는 value이다.

@Result

method

<result>, <id>

결과 매핑에서 클래스 필드 각각을 지정한다.

사용 가능한 속성들은 id, column, property, javaType, jdbcType, typeHandler, one, many 등이다. id 속성은 기본 키인지 아닌지 나타내는 boolean 값이고, id 값에 따라 매퍼 XML에서 id, result 엘리먼트와 유사하다.

@One

method

<association>

테이블 간 관계를 나타낼 때 1:1 관계의 객체를 설정할 때 사용한다.

사용 가능한 속성들은 매핑 구문을 지정하는 select이다.

매퍼 XML과 달리 조인 결과 매핑에는 사용할 수 없다. 조인 매핑은 어노테이션 API를 통해서는 지원되지 않는다. 왜냐하면 순환(circular) 참조를 허용하지 않는 자바 어노테이션의 제약 사항 때문이다. 

@Many

method

<collection>

테이블 간 관계를 나타낼 때 1:N 관계의 객체를 설정할 때 사용한다.

사용 가능한 속성들은 매핑 구문을 지정하는 select이다.

매퍼 XML과 달리 조인 결과 매핑에는 사용할 수 없다. 조인 매핑은 어노테이션 API를 통해서는 지원되지 않는다. 왜냐하면 순환(circular) 참조를 처용하지 않는 자바 어노테이션의 제약 사항 때문이다.

@MapKey

method

 

반환 타입이 Map인 메소드에서 사용한다. 대개 여러 개의 조회 결과가 나올 때 List 타입을 사용하긴 하지만, 조회 결과를 Map에 넣고 값을 가져와야 하는데 특정 프로퍼티(또는 컬럼) 값을 기준으로 Map에서 가져오고자 할 때 이 어노테이션을 사용한다.

@MapKey 어노테이션에서 지정한 프로퍼티를 사용해서 조회 결과를 가져올 수 있다.

@Options

method

매핑 구문의 속성들

매핑 구문에 부가적으로 필요한 다양한 설정을 할 수 있다. 매핑 구문의 속성을 다양하게 적으면 아무래도 보기 불편하기 때문에 @Options 어노테이션으로 별도로 정의하면 가시성이 좋다.

사용 가능한 속성들은 useCase=true, flushCache=false, resultSetType=FORWARD_ONLY, statementType=PREPARED, fetchSize=-1, timeout=-1, useGeneratedKeys=false, keyProperty="id", keyColumn="" 등이 있다.

자바 어노테이션은 null을 설정할 수 없어서 @Options 어노테이션으로 지정하는 옵션들은 디폴트 값을 사용한다. @Options 어노테이션이 제공하는 다양한 속성의 디폴트 값이 의도하는 것과 다를 수 있으므로 디폴트 값이 맞는지 반드시 확인하고 사용해야 한다.

keyColumn은 키 컬럼이 테이블의 첫 번째 컬럼이 아닌 PostgreSQL과 같은 데이터베이스에서만 필요하다.

@Insert, @Update,  @Delete, @Select

method

<insert>, <update>, <delete>, <select>

어노테이션의 명칭 처럼 각각의 어노테이션은 명칭에 맞는 SQL을 처리한다. @Insert 구문은 INSERT 구문을 처리하고 @Update 어노테이션은 UPDATE 구문을 처리한다. delete와 select 역시 마찬가지다.

사용 가능한 속성은 SQL 구문을 적는 value이다. 설정할 값은 실행할 SQL 문장 전체를 한 번에 넣어도 되고, SQL 문장을 조각조각 나눠서 배열 형태로 적어줘도 된다. 이렇게 배열 형태로 적어주면 마이바티스가 SQL 문장으로 합칠 때 각각의 조각 사이에 공백을 채워서 합쳐준다. 이렇게 공백을 채워주는 것은 SQL을 작성할 때 개발자가 공백으로 누락해서 발생하는 SQL 문법 에러를 쉽게 해결해준다.

@InsertProvider,

@UpdateProvider,

@DeleteProvider,

@SelectProvider

method

<insert>, <update>, <delete>, <select>,

동적 SQL 생성을

허용

어노테이션으로 SQL을 작성할 때 동적 SQL을 처리하기 매우 어려우므로 동적 SQL을 만드는 외부 클래스와 메소드를 정의하기 위해 사용한다.

사용 가능한 속성들은 type, method이다. 매핑 구문을 실행할 때 type 속성에 지정한 클래스의 인스턴스를 만들고 method 속성에 지정한 메소드를 실행한다. 메소드는 파라미터 객체를 받을 수도 있다.

type 속성에 클래스 명을 적어줄 때는 클래스의 패키지 경로까지 모두 적어주어야 한다.  

@Param

parameter

대체 가능한 XML 엘리먼트가 없다.

매퍼 인터페이스의 메소드가 여러 개의 파라미터를 가진다면 파라미터 이름은 어노테이션에 정의한 SQL의 파라미터 표기법의 명칭과 일치해야 한다. 하지만 경우에 따라 메소드 파라미터의 이름과 어노테이션에 정의한 SQL에 적용한(파라미터 표기법) 명칭이 다를 수 있다. 이런 겨우처럼 메소드 파라미터와 파라미터 표기법의 명칭을 맞춰주기 위해 사용한다.

예를 들어 메소드의 파라미터로

@Param("person")

String personCode 를 지정하면 파라미터 표기법에서 #{person}으로 지정하더라도 personCode 파라미터의 값을 사용하게 된다.

@SelectKey

method

<selectKey>

@Insert 어노테이션과 @InsertProvider 어노테이션을 사용할 때 자동 생성 키를 가져온다.

사용 가능한 속성들은 자동 생성 키를 조회하는 SQL의 전체 문장이거나 SQL 조각들이 배열이다.

keyProperty 속성은 자동 생성 키를 설정할 객체의 프로퍼티이고 resultType은 이 프로퍼티의 타입이다.

before 속성은 자동 생성 키를 조회하는  SQL을 데이터를 입력하기 전에 실행할지 입력 후에 실행할지를 결정한다. 데이터를 입력하기 전에 실행하려면 true로 설정하고, 데이터를 입력하고 실행하려면 false로 설정한다.

statementType 속성은 구문 형태를 정하는데, 구문 객체를 재사용하지 않는 STATEMENT, 구문 객체를 재사용하는 PREPARED, 그리고 프로시저를 호출할 때 사용하는  CALLABLE 중에 하나를  선택할 수 있다. 이 구문 타입의 각각은 Statement, PreparedStatement, 그리고 CallableStatement를 나타낸다. 디폴트는 PREPARED이다.

@ResultMap

method

대체 가능한 XML 엘리먼트가 없다.

매퍼 XML과 매퍼 인터페이스를 사용할 때 매퍼 인터페이스에서 매퍼 XML에 정의한 결과 매핑을 사용할 수 있다. @ResultMap 어노테이션은 매퍼 XML에 정의한 결과 매핑을 사용하기 위해 제공한다. @Select 어노테이션과 @SelectProvider 어노테이션을 사용할 때 사용 가능하다. @Results 어노테이션이나 @ConstructorArgs 어노테이션과 함께 사용하면 @ResultMap 어노테이션이 다른 설정보다 우선 시 된다.