본문 바로가기
교재 실습/자바 웹 개발 워크북

117. 동적 SQL의 사용 (4)

by Jint 2022. 9. 21.

3. 프로젝트 목록 컨트롤러 변경

프로젝트 목록 페이지에서 컬럼 헤더를 클릭하면 정렬 요청을 서버에 보낸다. 정렬 요청을 처리하려면 기존 컨트롤러를 변경해야 한다.

spms.controls 패키지에 있는 ProjectListController 클래스를 열고 다음과 같이 편집한다.

package spms.controls;

import java.util.HashMap;
import java.util.Map;

import spms.annotation.Component;
import spms.bind.DataBinding;
import spms.dao.MySqlProjectDao;

@Component("/project/list.do")
public class ProjectListController implements Controller, DataBinding {
	
	//인스턴스 변수
	MySqlProjectDao projectDao;
	
	//셋터 메서드
	public ProjectListController setProjectDao(MySqlProjectDao projectDao) {
		this.projectDao = projectDao;
		return this;
	}
	
	//DataBinding 인터페이스의 구현 메서드
	@Override
	public Object[] getDataBinders() {
		return new Object[] {"orderCond", String.class};
	}

	//Controller 인터페이스 구현 메서드
	@Override
	public String execute(Map<String, Object> model) throws Exception {
		HashMap<String,Object> paramMap = new HashMap<String,Object>();
	  	paramMap.put("orderCond", model.get("orderCond"));
		model.put("projects", projectDao.selectList(paramMap));
		return "/project/ProjectList.jsp";
	}
	
}

 

- DataBinding의 구현

ProjectListController 클래스가 정렬 요청을 처리하려면 정렬 조건을 알아야 한다. 클라이언트는 'orderCond'라는 매개변수 이름으로 정렬 조건을 보냈다. 클라이언트가 보낸 이 값을 받으려면 페이지 컨트롤러는 '제 6장 미니 MVC 프레임워크 만들기'에서 만든 MVC 구조에 따라 DataBinding 인터페이스를 구현해야 한다.

public class ProjectListController implements Controller, DataBinding {
    ...
}

그리고 getDataBinders() 메서드에서 받기를 원하는 매개변수 이름과 데이터형을 선언한다.

//DataBinding 인터페이스의 구현 메서드
@Override
public Object[] getDataBinders() {
    return new Object[] {"orderCond", String.class};
}

 

- DAO에게 정렬 조건 전달

이전에는 프로젝트 목록을 가져올 때 특별한 조건이 필요하지 않았기 때문에 매개변수 없이 DAO의 메서드를 호출하였다.

model.put("projects", projectDao.selectList());

하지만, 이제는 정렬 조건이 필요하다. execute() 메서드에서는 projectDao의 selectList() 메서드를 호출하기 전에 매개변수로 전달할 객체를 먼저 준비한다. 매개변수 객체에는 SQL 맵퍼에서 사용할 정렬 조건이 들어가야 한다. 그래서 'orderCond'라는 이름으로 정렬 조건을 저장하였다. projectDao의 selectList() 메서드를 호출할 때 이 매개변수 객체를 전달한다.

HashMap<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("orderCond", model.get("orderCond"));
model.put("projects", projectDao.selectList(paramMap));

 

4. ProjectDao 인터페이스 변경

selectList() 메서드에서 매개변수 값을 받을 수 있게 인터페이스를 변경한다.

spms.dao 패키지에 있는 ProjectDao 인터페이스를 열고 selectList() 메서드의 선언을 다음과 같이 변경한다.

package spms.dao;

import java.util.HashMap;
import java.util.List;

import spms.vo.Project;

//ProjectDao 인터페이스 정의
public interface ProjectDao {
	List<Project> selectList(HashMap<String,Object> paramMap) throws Exception; //프로젝트 목록 반환 메서드
	int insert(Project project) throws Exception; //프로젝트 데이터 등록 메서드
	Project selectOne(int no) throws Exception; //프로젝트 상세정보 조회 메서드
	int update(Project project) throws Exception; //프로젝트 데이터 변경 메서드
	int delete(int no) throws Exception; //프로젝트 데이터 삭제 메서드
}

이전 selectList() 메서드는 매개변수가 없었지만, 지금은 HashMap 객체를 매개변수로 받는다.

 

- MySqlProjectDao 클래스 변경

인터페이스를 바꿨으니 당연히 이를 구현하는 클래스 또한 바꿔야 한다.

spms.dao 패키지의 MySqlProjectDao 클래스를 열고 selectList() 메서드를 다음과 같이 변경한다.

//mybatis적용
@Component("projectDao")
public class MySqlProjectDao implements ProjectDao {
	
	//SqlSessionFactory 인터페이스
	SqlSessionFactory sqlSessionFactory;
	
	/**
	 * SqlSessionFactory 인터페이스 객체 주입
	 * @param sqlSessionFactory
	 */
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}
	
	/**
	 * 프로젝트 목록 조회
	 * @return sqlSession.selectList("spms.dao.ProjectDao.selectList")
	 */
	public List<Project> selectList(HashMap<String,Object> paramMap) throws Exception {
		//SqlSession : SQL 실행하는 도구, sqlSessionFactory 객체 통해서만 얻을 수 있다
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			//selectList() : 여러 개의 결과 반환하는 SELECT문 실행시 호출
			return sqlSession.selectList("spms.dao.ProjectDao.selectList", paramMap);
		} finally {
			//close() : SQL문 실행할 때 사용한 자원 해제
			sqlSession.close();
		}
	}
    
    ...
}

SqlSession 객체의 selectList() 메서드를 호출할 때 매개변수 객체를 넘기도록 코드를 변경하였다. 이렇게 넘겨준 매개변수 객체는 SQL 맵퍼에 있는 SQL문을 실행할 때 사용된다.

 

이제 톰캣 서버를 재시작한 뒤, 웹 브라우저에서 http://localhost:9999/web07/project/list.do를 요청한다. 다음은 프로젝트 목록을 출력한 화면이다(그림 1).

그림 1 (정렬 기능이 추가된 프로젝트 목록 화면과 정렬 결과 화면1)

프로젝트 목록 화면에서 컬럼 헤더 '제목'을 클릭하면 프로젝트 제목에 대해 오름차순으로 정렬된 결과를 볼 수 있다(그림 2).

그림 2 (정렬 기능이 추가된 프로젝트 목록 화면과 정렬 결과 화면2)

이 때 브라우저의 주소창을 보면 정렬 조건이 'orderCond'라는 이름의 매개변수로 전달되는 것을 알 수 있다.

http://localhost:9999/web07/project/list.do?orderCond=TITLE_ASC

프로젝트 제목으로 정렬된 결과 화면을 보면 컬럼 헤더가 '제목↑'으로 바뀌어 있다.

mybatis의 동적 SQL 기능이 없었다면 정렬 조건별로 많은 SELECT문을 작성했어야 한다. 동적 SQL 기능을 잘 활용한다면 적은 양의 코딩으로 많은 일을 수행할 수 있을 것이다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

119. 실력 향상 훈련  (2) 2022.09.25
118. 동적 SQL의 사용 (5)  (0) 2022.09.22
116. 동적 SQL의 사용 (3)  (2) 2022.09.20
115. 동적 SQL의 사용 (2)  (1) 2022.09.19
114. 동적 SQL의 사용 (1)  (0) 2022.09.18

댓글