[Spring Boot] 09. MyBatis 파라미터 사용하기

하림·2024년 8월 30일

Spring

목록 보기
5/16
post-thumbnail

1. 프로젝트 생성 및 설정

다음과 같이 프로젝트를 생성합니다.

  1. 기존 프로젝트인 B08aMybatis를 복사하여 이름을 변경합니다.
  2. 프로젝트명 우클릭 > Properties > Web Project Settings 에서 Context root를 프로젝트명으로 변경합니다.
  3. settings.gradle 에서 rootProject.name 을 프로젝트명으로 변경합니다.
  4. Refresh Gradle Project 를 눌러 적용합니다.

이전 프로젝트(MyBatis 설정 및 회원관리 게시판 제작하기)의 구성을 그대로 유지한채 파라미터 부분만 수정해봅니다.




2. 회원정보 등록

2.1 소스코드 작성하기

컨트롤러를 생성합니다. 다음과 같이 com.edu.springboot.MainController.java 파일을 수정합니다.

@GetMapping("/regist.do")
public String regist1() {
	return "regist";
}
@PostMapping("/regist.do")
/* 회원등록 폼에서 전송한 파라미터를 request 내장객체를 통해 저장한다.
 * 개별적으로 전달받은 파라미터를 insert() 메서드로 전달한다. */
public String regist2(HttpServletRequest req) {
	String id = req.getParameter("id");
	String pass = req.getParameter("pass");
	String name = req.getParameter("name");
		
	int result = dao.insert(id, pass, name);
	if (result == 1) System.out.println("회원정보가 등록되었습니다.");
	return "redirect:list.do";
}

인터페이스를 생성합니다. 다음과 같이 com.edu.springboot.jdbc.IMemberService.java 파일을 수정합니다.

package com.edu.springboot.jdbc;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface IMemberService {
	public List<MemberDTO> select();
	// 회원등록 : request 내장객체를 통해 받은 파라미터를 전달한다.
	public int insert(String id, String pass, String name);
	/* 회원정보 가져오기 : 파라미터를 받은 후 @Param 어노테이션으로 매퍼에서 사용할 파라미터 명을 지정한다.
	 * 즉 id로 받은 후 _id로 변경한다. */
	public MemberDTO selectOne(@Param("_id") String id);
	// 수정처리 : 파라미터가 저장된 Map을 매개변수로 전달한다.
	public int update(Map<String, String> paramMap);
	// 삭제처리
	public int delete(String id);
}

매퍼를 생성합니다. 다음과 같이 resources/mybatis/mapper/MemberDAO.xml 파일을 수정합니다.

<!-- 회원정보 등록 : request 내장객체를 통해 받은 파라미터를 개별적으로 전달한 값으로 인파라미터를 채워준다.
이 경우 DTO를 사용하지 않으므로 parameterType은 명시할 필요가 없다.
전달되는 3개의 인수는 순서대로 param1, 2, 3와 같이 명시하면 된다. -->
<insert id="insert">
	INSERT INTO member (id, pass, name) VALUES (#{param1}, #{param2}, #{param3})
</insert>

2.2 실행하기

다음과 같이 실행됩니다.

'회원등록' 링크를 클릭하면 회원정보를 입력할 수 있는 페이지로 이동합니다.

등록할 회원정보를 입력합니다.

입력한 후 '전송하기' 버튼을 클릭하면 회원정보가 등록된 후 회원목록 페이지로 이동합니다. 목록에서 회원정보가 정상적으로 등록되었음을 확인할 수 있습니다.

콘솔에는 다음과 같이 출력됩니다.

회원정보가 등록되었습니다.

회원정보 등록 기능이 성공적으로 구현되었습니다.




3. 회원정보 수정

3.1 소스코드 작성하기

컨트롤러를 생성합니다. 다음과 같이 com.edu.springboot.MainController.java 파일을 수정합니다.

// 회원정보 수정
@GetMapping("/edit.do")
public String edit1(HttpServletRequest req, MemberDTO memberDTO, Model model) {
	// 폼값을 request 내장객체로 받은 후 전달한다.
	memberDTO = dao.selectOne(req.getParameter("id"));
	model.addAttribute("dto", memberDTO);
	return "edit";
}
@PostMapping("/edit.do")
public String edit2(HttpServletRequest req) {
	// 폼값을 request 내장객체를 통해 받는다.
	String id = req.getParameter("id");
	String pass = req.getParameter("pass");
	String name = req.getParameter("name");
	// 폼값을 한꺼번에 DAO로 전달하기 위해 Map을 선언한다.
	Map<String, String> paramMap = new HashMap<String, String>();
	// 파라미터를 각 Key에 저장한다.
	paramMap.put("m_id", id);
	paramMap.put("m_pass", pass);
	paramMap.put("m_name", name);
		
	int result = dao.update(paramMap);
	if (result == 1) System.out.println("회원정보가 수정되었습니다.");
	return "redirect:list.do";
}

매퍼를 생성합니다. 다음과 같이 resources/mybatis/mapper/MemberDAO.xml 파일을 수정합니다.

<!-- 회원정보 불러오기 : 파라미터를 받은 후 @Param 어노테이션으로 이름을 변경해서 전달한다.
Mapper에서는 변경된 이름으로 인파라미터를 설정할 수 있다. -->
<select id="selectOne"
	resultType="com.edu.springboot.jdbc.MemberDTO">
	SELECT * FROM member WHERE id=#{_id}
</select>
<!-- 수정처리 : Map에 저장된 파라미터를 받으므로 parameterType에 Map을 명시한다.
이 경우에도 패키지의 풀경로를 입력한다.
그리고 Key로 저장된 값을 얻어온 후 인파라미터를 설정할 수 있다. -->
<update id="update"
	parameterType="java.util.HashMap">
	UPDATE member SET pass=#{m_pass}, name=#{m_name} WHERE id=#{m_id}
</update>

3.2 실행하기

다음과 같이 실행됩니다.

수정할 회원의 '수정' 링크를 클릭하여 수정할 정보를 입력합니다.

'전송하기' 버튼을 누르면 회원 정보가 수정된 후 회원목록 페이지로 이동합니다. 목록에서 회원정보가 정상적으로 수정되었음을 확인할 수 있습니다.

콘솔에는 다음과 같이 출력됩니다.

회원정보가 수정되었습니다.

회원정보 수정 기능이 성공적으로 구현되었습니다.




4. 회원정보 삭제

4.1 소스코드 작성하기

컨트롤러를 생성합니다. 다음과 같이 com.edu.springboot.MainController.java 파일을 작성합니다.

@RequestMapping("/delete.do")
public String delete(HttpServletRequest req) {
	String id = req.getParameter("id");
	int result = dao.delete(id);
	if (result == 1) System.out.println("회원정보가 삭제되었습니다.");
	return "redirect:list.do";
}

매퍼를 생성합니다. 다음과 같이 resources/mybatis/mapper/MemberDAO.xml 파일을 작성합니다.

<!-- 회원정보 삭제 : 파라미터 순서대로 배열처럼 0, 1, 2, .. 와 같이 인파라미터를 설정할 수 있다. -->
<delete id="delete">
	DELETE FROM member WHERE id=#{0}
</delete>

4.2 실행하기

다음과 같이 실행됩니다.

수정할 회원의 '삭제' 링크를 클릭하면 회원 정보가 삭제된 후 회원목록 페이지로 이동합니다. 목록에서 회원정보가 정상적으로 삭제되었음을 확인할 수 있습니다.

콘솔에는 다음과 같이 출력됩니다.

회원정보가 삭제되었습니다.

회원정보 삭제 기능이 성공적으로 구현되었습니다.




5. 제어문으로 회원정보 검색

5.1 소스코드 작성하기

뷰를 생성합니다. 다음과 같이 webapp/WEB-INF/views/list.jsp 파일에 코드를 추가합니다.

<form>
	<table>
		<tr>
			<td>
				<!-- 검색을 위한 필드(컬럼)을 두 개 이상 선택하기 위해 체크박스로 구성한다. 폼값은 List로 전송된다. -->
				<input type="checkbox" name="searchField" value="id" />아이디
				<input type="checkbox" name="searchField" value="name" />이름
				<input type="checkbox" name="searchField" value="pass" />패스워드
				<!-- 검색어는 일반적인 문자열로 전송된다. -->
				<input type="text" name="searchKeyword" />
				<input type="submit" value="검색" />
			</td>
		</tr>
	</table>
</form>

DTO를 생성합니다. 다음과 같이 com.edu.springboot.jdbc.MemberDTO.java 파일에 멤버변수를 추가합니다.

package com.edu.springboot.jdbc;

import java.util.List;

import lombok.Data;

@Data
public class MemberDTO {
	private String id;
	private String pass;
	private String name;
	private String regidate;
	
	/* 검색을 위한 멤버변수 추가
	 * 필드명의 경우 체크박스이므로 두 개 이상의 항목을 저장하기 위해 List로 정의한다.
	 * 검색어는 단일항목이므로 String으로 정의한다. */
	private List<String> searchField;
	private String searchKeyword;
}

컨트롤러를 생성합니다. 다음과 같이 com.edu.springboot.MainController.java 파일에 매개변수를 추가합니다.

// 회원목록
@RequestMapping("/list.do")
public String list(Model model, MemberDTO memberDTO) {
	/* dao.select() : 서비스 인터페이스의 추상메서드를 호출한다.
	 * 그러면 인터페이스와 연결된 Mapper 파일에 정의된 특정 엘리먼트가 호출되어 실행된다. */
	model.addAttribute("memberList", dao.select(memberDTO));
	return "list";
}

인터페이스를 생성합니다. 다음과 같이 com.edu.springboot.jdbc.IMemberService.java 파일에서 추상메소드를 수정합니다.

// 회원목록(검색X)
// public List<MemberDTO> select();
// 회원목록(검색O)
public List<MemberDTO> select(MemberDTO memberDTO);

매퍼를 생성합니다. 다음과 같이 resources/mybatis/mapper/MemberDAO.xml 파일에 제어문을 추가합니다.

<!-- 조건문은 <if> 태그로 정의 : test에 조건을 추가한다. 전체적인 사용법은 JSTL과 동일하다.
반복문은 <forEach> 태그로 정의
	- collection : 반복을 위해 사용할 컬렉션 변수명 지정
	- item : 반복시 해당 루프에서 반환되는 객체를 저장
	- open : 쿼리문 시작 부분에 추가할 문자열
	- close : 쿼리문 종료 부분에 추가할 문자열
	- separator : 쿼리문을 반복할 때 구분자로 사용할 항목 -->
<select id="select"
	parameterType="com.edu.springboot.jdbc.MemberDTO"
	resultType="com.edu.springboot.jdbc.MemberDTO">
	SELECT * FROM member
	<!-- 파라미터 형식이
		요청명?searchKeyword=abc => 값이 있다
		요청명?searchKeyword=    => 빈값으로 지정됨. ''로 체크해야함
		요청명                   => null로 지정. 따라서 null인지 체크 -->
	<if test="searchKeyword!=null and !searchKeyword.equals('')">
		WHERE
		<!-- like절이 있는 쿼리문을 or로 연결해서 2개 이상의 항목이 들어간 쿼리문을 생성해준다.
		가령 이름과 아이디를 선택했고, 검색어로 a를 입력했다면 다음과 같이 생성된다.
		(name like '%a%' or id like '%a%') -->
		<foreach collection="searchField" item="sfield" open="(" close=")" separator="or">
			${sfield} like '%' || #{searchKeyword} || '%'
		</foreach>
	</if>
	ORDER BY regidate DESC
</select>

이제 회원정보를 검색할 수 있습니다.


5.2 실행하기

다음과 같이 실행됩니다.

'아이디'를 선택하고 'ha'를 입력하면 해당하는 회원정보 목록이 검색됩니다.

회원정보 검색 기능이 성공적으로 구현되었습니다.

0개의 댓글