공부방

19_11_24일 공부정리(마이바티스 프로그래밍 원리와 활용 5장)

Winter_Snow 2019. 11. 24. 21:57

5.1 마이바티스 매핑 구문 정의의 개요

매핑을 해놓는 이유 : 실행 애플리케이션에 쿼리를 넣으면, 코드보기가 복잡하기도 하며, 쿼리문 오류인지 어플리케이션 오류인지 알기가 어렵기 때문에 쿼리문을 추출한 다음 형식에 맞추어 파일에 정의 한다.

이를 매핑구문 정의라고 한다. 이로인해 좋은 점은 쿼리문 변경시, 소스 코드를 일일이 찾지않아도 된다는 점이다.

마이바티스는 1. 마이바티스 매퍼xml파일이나   2. 매퍼 인터페이스에 매핑구문을 정의할 수 있다. 

각각 1. 매퍼 xml의 구성요소, 2. 어노테이션을 사용한다.

일단 매퍼 인터페이스는 6장에서 다루기로 하고 , 오늘은 마이바티스 매퍼 xml에 대해서 공부하겠다.

 

 


예시

 

/* 쿼리문 */

select shop_no, shop_name, shop_location, shop_status,

from shop

where shop_no = ?

 

/* 마이바티스 매퍼 xml파일 */

select shop_no, shop_name, shop_location, shop_status,

from shop

where shop_no = #{shopNo}

 

/* 매퍼 인터페이스 */

public interface ShopMapper{

      @Select({

        select shop_no, shop_name, shop_location, shop_status,

       from shop

       where shop_no = #{shopNo}

      })

      @Results(value = {

      @Result(column = "shop_no" , property="shopNo" , id=true);

      @Result(column = "shop_name" , property="shopName" );

      @Result(column = "shop_location" , property="shopLocation");

      @Result(column = "shop_status" , property="shopStatus");

      })

     public Shop select(Shop shop);

}


매퍼 xml의 여러 구성요소 중에 5개에 대해서 공부를 해보겠다

 1. 인자와 결과를 지정하는 구성요소

 2. 매핑 구문 정의에 사용하는 구성요소

 3. 동적 매핑 구문 생성에 사용하는 구성요소

 4. 공통된 매핑 구문을 재사용하기 위한 구성요소

 5. 성능 향상과 관련된 구성요소

 

5.2 인자와 결과를 지정하는 구성요소

 매핑구문에 필요한 인자를 파라미터 , 매핑구문 실행 결과를 리절트라고 한다. 이때 전달하고 받는 객체를 파라미터 객체, 리절트 객체라고 한다. 

 (1) 파라미터 객체

 어떤 파라미터를 받을지 parameterType ="" 이렇게 속성으로 지정할수 있다. 지정하는 parameterType으로는 크게 기본타입과 객체 타입으로 나뉘는데 기본타입으로는 int , String 등이 있고, 객체 타입으로는 자바빈즈(Entity객체), 컬렉션 타입등이 있다.

 기본타입은 파라미터가 하나인 경우에 사용하며, 객체타입은 파라미터가 여러 개인 경우에 사용한다.

마이바티스에서 파라미터를 바인딩하려면 인라인 파라미터 표기를 사용해야 한다. 방법은 #{},  ${}인데,

#기호는 인라인 파라미터 표기를 물음표로 변경한 다음 파라미터를 바인딩한다. 이때 파라미터 타입이 문자 타입인 경우 파라미터 값 앞뒤로 ' ' 가 붙는다. 

$기호는 인라인 파라미터를 물음표로 변경하지 않고 파라미터를 바인딩 한다. 이때 파라미터 값을 변경하거나 이스케이프 처리를 하지않는다. 문자열이 바로 바인딩 되기 때문에 SQL주입 공격에 노출될 수 있다.

#기호와 $기호의 차이는  PreparedStatement, Statement 차이와 동일하다.

인라인 파라미터는 속성을 추가 할수있는데 대표적으로 javaType , jdbcType 등이 있다. 하지만, 모든 인라인 파라미터에 속성을 추가한다면 코드가 복잡해 지고, 속성 변경시 모든 매핑구문을 일일이 수정해야한다. 따라서 이런 중복되는 속성을 관리할수 있는 파라미터 맵이 있다.

즉 파라미터 맵이라는 것은 인라인 파라미터들의 공통된 속성을 묶어놓은 것이다.

 <parameterMap>

  <parameter property="shopNo" javaType="int" jdbcType="NUMERIC"/>

  <parameter property="shopStatus" javaType="java.lang.String" jdbcType="VARCHAR"> 

 </parameterMap>

그리고 파라미터 맵은 파라미터를 매핑구문에 전달하는 중간 역할을 수행한다, 따라서 파라미터 맵역시 전달받는 파라미터 타입 객체의 타입을 지정 해야 한다. 

또한 파라미터 맵은 여러 번 정의 가능하기에 아이디 속성을 가지는 것이 좋다. 최종적으로

<parameterMap id = "shopParameterMap" parameterType ="java.util.HashMap" >

  <parameter property="shopNo" javaType="int" jdbcType="NUMERIC"/>

  <parameter property="shopStatus" javaType="java.lang.String" jdbcType="VARCHAR"> 

 </parameterMap>

 

 (2) 리절트 객체

 파라미터 객체와 마찬가지로 1.기본타입 2. 객체타입이 있으며, 리턴되는 리절트가 1개일 경우 기본타입을 리턴되는 리절트가 2개이상일경우 객체 타입을 사용한다.

리절트 객체에 바인딩 되는 순서 : 

1. 리절트 셋에 결과가 존재하면 objectFactory 가 리절트 객체를 생성하고 초기화시킨다.

2. 프로퍼티와 타입핸들러를 통해 리저트 셋의 값을 리저트 객체에 바인딩을 한다.