public List<Product> selectProduct(@Param("name") String name, @Param("category") String category);
<select id="selectProduct">
SELECT * FROM products WHERE name = #{name} AND category = #{category}
</select>
@Param이 안 써지고 오류가 나요🥲
Available parameters are [arg1, arg0, param1, param2]
@Param은 MyBatis의 Mapper 인터페이스에서 파라미터 이름을 지정할 때 사용한다.
Spring 컨트롤러에는 사용할 수 없다!
찾아보니 현재 내가 사용하고 있는 DAO에는 @Mapper 어노테이션이 붙어있는데, 거기서는 @Param을 쓸 수 있다고 한다.
컨트롤러로 받아온 값을 DAO에서 Param으로 이름을 다시 지정해주면 될 것 같다.@GetMapping("/products") public String getProducts(@RequestParam("name") String name, @RequestParam("category") String category, Model model) { List<Product> products = productService.getProducts(name, category); model.addAttribute("products", products); return "productList"; // View 이름 }
↑ 컨트롤러
@Mapper public interface ProductDAO { List<Product> selectProducts(@Param("name") String name, @Param("category") String category); }
↑ DAO
<select id="selectProducts" parameterType="map" resultType="Product"> SELECT * FROM products WHERE name = #{name} AND category = #{category} </select>
↑ xml
이런 식으로 작성하면 된다.
parameterType="map"을 사용한 이유는, 파라미터가 여러 개일 때 MyBatis가 이를 자동으로 Map 형식으로 변환해 전달하기 때문.귀찮은데 다른 방법은 없나요?😒
만약 위와 같은 방법을 사용하기 싫다면 조금 번거롭고 알아보기 불편하지만 다른 해결 방법을 하나 소개하겠다. (나는 잘 몰라서 지금껏 이걸 썼다.)
@Mapper public interface ProductDAO { List<Product> selectProducts(String name, String category); }
↑ DAO
컨트롤러는 동일하게 작성하고 DAO에 그냥 변수를 그대로 넣어버린다.<select id="selectProducts" resultType="Product"> SELECT * FROM products WHERE name = #{arg0} AND category = #{arg1} </select>
↑ xml
입력한 변수 순서대로 arg0, arg1 등을 입력한다.
이 때, 하나의 변수 안에 여러개의 값이 들었다면
#{arg0.name} 이런 식으로 사용하면 된다.
@Param 어노테이션을 통해 파라미터명을 지정해주지 않았기 때문에, 인덱스를 사용해야 한다.
이후 변수 넣는 순서가 바뀌거나 하면 또 오류가 나고, 가독성이 떨어지기 때문에 좋은 방법은 아니다.
↑ 컨트롤러
↑ DAO
Spring에서 @GetMapping으로 파라미터를 받을 때는 요청 파라미터가 자동으로 Map 형태로 전달된다.
예를 들어, 대분류, 소분류, 정렬기준 등의 여러 정보를 한번에 Get 방식으로 받아올 때, 하나하나 @RequestParam으로 지정해주지 않아도 알아서 Map에 키-값으로 들어간다.
사진에는 안보이는데, 받아올 값들은 #{productCategory} 이런 식으로 작성했다. GetMapping 시 사용한 이름을 그대로 적으면 된다.
3가지 방법 중 어떤걸 쓸까 고민이 된다면 아래를 참고하시길!
☞ 주고 받을 값이 많을 때 유용하다.
☞ 여러 개의 파라미터를 간단하게 전달하고 싶을 때 유용하다.
☞ 파라미터 개수가 가변적일 때 유용하다.
( 파라미터 수가 @Param으로 쓰기엔 많고 VO로 만들기엔 적을 때 쓰면 좋을 것 같다! )