1. 오류 발생

  • 프로젝트 진행 중 returnType="HashMap"으로 넘길 시에 조회가 되지 않는 오류 발생했고 두 가지의 해결 방법을 찾았다.

    • 첫 번째 방법(권장) : resultMap 사용하기
    • 두 번째 방법 : DTO와 데이터베이스의 컬럼이 정확히 일치하면 HashMap으로 넘길 시에 List로 받더라도 자동 매핑이 되지만, 그게 아닐 때는 키값을 이용하여 넣어주면 된다. (키 값은 Iterator를 통하여 값에 접근)

2. 첫 번째 방법 : ResultMap 사용하기

  • ResultMap은 DB 컬럼명과 DTO의 변수 명이 다를 때 사용한다.

    • resultMap 선언
      • id = 사용할 id 명
      • resultMap type= DTO명
      • column = DTO 변수 명
      • property = 데이터베이스 컬럼 명
    • select 문에서 사용
      • resultMap="resultMap의 id명"
  • 예제 코드

    • USER.xml

      <resultMap id="UserList" type="User">
          <result column="userId" property="USER_ID">
          <result column="userName" property="USER_NAME">
      </resultMap>
      
      <select id="userList" resultMap="UserList">
             select \* from USER
      </select>

3. 두 번째 방법 : Iterator 란?

  • Iterator는 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화하였는데 그중 하나가 Iterator이다.
  • 자세한 설명 : https://vaert.tistory.com/108
  • 예제 코드
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

// DTO와 DB가 일치하지 않으므로 HashMap List 사용
// Post 자리에는 사용될 객체 이름을 넣어주면 된다. ( 저는 임의로 Post 사용! )
List<HashMap<Object, Post>> result = sqlSession.selectList(NS+"searchPost");

// 가져온 객체들을 저장해서 반환 할 새로운 배열을 선언
List<Post> list = new ArrayList<Post>();

// 받아온 HashMap List를 HashMap에 차례로 넣어준다.
for(HashMap<Object, Post> hash : result){
    // Hash의 value값을 조회 할 key값 가져오기
        Set key = hash.keySet();
    // Iterator에 key를 담는다.
        Iterator iterator = key.iterator();

    // list에 하나씩 담아 줄 새로운 객체 생성
        Post post = new Post();

        // setter 사용
        // iterator.next()를 통하여 값을 접근한다.
        post.setTitle(hash.get(iterator.next()).toString());
        post.setContent(hash.get(iterator.next()).toString());

        // setter를 통하여 값을 다 넣어준 후에는 list에 추가해주기
        list.add(post);

        // hasNext를 통해 다음 KEY값들의 모음으로 넘어간다.

      }
      return list;
}

 

4. 기타 기억할 점

  • 가져오는 값이 Int형일 경우 Integer.parseInt(가져올 값)
  • 그 외 형 변환 오류 발생시 (가져올 값). getClass(). getName()으로 자료형 확인해서 맞춰주기

+ Recent posts