Spring Boot(JSP,Mybatis)

상품 검색

작성자
vita
작성일
2023-11-19 23:15
조회
84

상품 검색

상품검색 기능을 테스트할 수 있도록 몇개의 상품정보를 먼저 작성하시고 테스트해 주시기 바랍니다.

 

 

1. list.jsp

상품검색을 위한 폼 양식을 추가합니다.

 


<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

[생략]

<body>

<h2>상품목록</h2>

<form method="post">

상품명: <input type="text" name="product_name" value="${product_name}">

<input type="submit" value="조회">

</form>

<br>

<button type="button" onclick="location.href='write'">상품등록</button>

[생략]

</body>

</html>


 

[해설]

 

form 태그에 action을 지정하지 않으면 현재 사용중인 url인 http://localhost/list 로 자료를 보내게 됩니다.

상품이름을 입력하고 서버에 보냅니다.

 


<form method="post">

상품명: <input type="text" name="product_name" value="${product_name}">

<input type="submit" value="조회">

</form>





2. ProductDAO.java

검색을 하려면 상품 이름을 전달해야 하므로 변경 사항이 있습니다. 빨간색 부분을 추가하면 됩니다.

 


package com.example.product;

@Repository

public class ProductDAO {

   @Autowired

   SqlSession sqlSession;

   public List<Map<String, Object>> list(String product_name) {

       return sqlSession.selectList("product.list", "%" + product_name + "%");

   }

   

}


 

[해설]

 


   public List<Map<String, Object>> list(String product_name) {

       return sqlSession.selectList("product.list", "%" + product_name + "%");

   }


 

Controller에서 보낸 상품이름이 product_name 변수에 저장됩니다.

상품이름을 전달하여 해당되는 상품의 리스트를 리턴합니다.  상품이름이 빈값일 경우 모든 상품들을 리턴하게 됩니다.

 

 

3. product.xml

검색을 하려면 상품 이름을 전달해야 하므로 변경 사항이 있습니다. 빨간색 부분을 추가하면 됩니다.

 


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="product">

   <select id="list" resultType="java.util.Map">

       select * from product

       where product_name like #{product_name}

       order by product_name

   </select>

</mapper>


 

[해설]

 


   <select id="list" resultType="java.util.Map" parameterType="String">


 

dao에서 보낸 product_name 값을 받을 변수의 자료형이 parameterType에 지정됩니다.  여기서는 값이 하나이므로 String만 지정했습니다.  값이 2개 이상일 때는 Map이 되겠습니다. parameterType은 생략해도 됩니다.

 

select 명령어의 형식은 아래와 같습니다.

 


select 필드

from 테이블

where 검색할 레코드의 조건


 

 

여기서는 상품이름으로 검색을 하게 됩니다.  

 


       where product_name like #{product_name}


 

 

예를 들어 사과 라면

 


where product_name = "사과"


 

라고 하면 됩니다.

 

여기서는 = 대신 like을 사용했습니다.

like을 사용하게 되면 키워드 검색도 가능하게 됩니다.




where product_name like "%사과%"


라고 한다면

 

상품 이름이 정확히 "사과" 가 아닌 "풋사과", "맛잇는 사과", "사과쥬스" 등 사과라는 키워드가 포함된 모든 상품 이름들을 찾을 수 있습니다.

 

 

4. ProductController.java

검색을 하려면 상품 이름을 전달해야 하므로 변경 사항이 있습니다. 빨간색 부분을 추가하면 됩니다.

 


package com.example.product;

@Controller

public class ProductController {

   @Autowired

   ProductDAO productDao;

   @RequestMapping("/")

   public String home() {

       return "redirect:/list";

   }

   @RequestMapping("/list")

   public ModelAndView list(@RequestParam(defaultValue="") String product_name, ModelAndView mav) {

       mav.setViewName("list");

       mav.addObject("list", productDao.list(product_name));

       mav.addObject("product_name", product_name);

       return mav;

   }

}


 

[해설]

 

list.jsp 페이지의 form에 입력한 상품이름이 list() method로 넘어오게 됩니다.

 


   @RequestMapping("/list")

   public ModelAndView list(@RequestParam(defaultValue="") String product_name, ModelAndView mav) {


 

@RequestParam 어노테이션이 붙은 변수는 get 방식 또는 post 방식으로 전달된 값들을 저장하는 용도의 변수입니다.  defaultValue는 전달된 값이 없을 경우 기본값으로 사용할 값입니다.




mav.addObject("list", productDao.list(product_name));


 

그 상품이름을 다시 dao에 전달합니다.

 




       mav.addObject("product_name", product_name);


 

product_name 변수에 list.jsp 페이지에서 입력한 검색 키워드를 다시 저장합니다.  웹프로그래밍에서는 다른 주소로 이동하게 되면 모든 값들이 지워지게 되므로 이런 식으로 저장을 한 후 다시 보내야 합니다.

 

 

5. 상품 검색 실행 결과 확인

상품명에 상품이름을 입력하고 [조회] 버튼을 누르면 해당되는 상품목록을 검색하여 화면에 출력합니다.




Scroll to Top