[ 스프링 작업 순서 ]
▶ get방식 - 화면 보여주는 페이지
(입력화면, 수정화면, 삭제 화면 등)
1. 링크에 매핑 url 지정하기 (form 태그라면 action 일수도있음)
2. 컨트롤러에서 메서드(핸들러) 틀 잡기
- 어노테이션붙이는 것
3. 뷰페이지 리턴 ( DB작업을 하는 경우 : post 방식과 동일 )
4. 뷰페이지에서 화면 출력하는 코드 작성
▶ POST방식 - 실제적인 처리하는 페이지
( 입력처리, 수정처리, 삭제처리 등 )
1. Form 태그의 action 속성에 매핑 url 지정
2. 컨트롤러에서 메서드(핸들러) 틀 잡기
3. 컨트롤러에서
- (1) 파라미터 읽어오기
- (2) db작업
: 순서
- mapper xml 에서 쿼리문 작성
- DAO 에서 매핑구문에 해당하는 메서드 선언부 만들기 (매핑구문 실행)
- Service 인터페이스에 메서드 선언부 만들기
- ServiceImpl - 추가적 로직처리는 Service 구현체 에서 진행
- 다시 컨트롤러로 돌아가서 서비스의 메서드 호출
- (3) 모델에 결과 저장
- (4) 뷰페이지 리턴 - 리다이렉트하거느 message.jsp 로 포워드해서 메시지 보여주고 redirect 되도록 한다
▶ get/post => 일반적인 조회의 경우 (목록, 상세보기 등)
1. 링크나 Form 태그의 action 속성에 매핑 url 지정
2. 컨트롤러를 잡기
3. 컨트롤러에서 (post 방식과 동일)
- (1) 파라미터 읽어오기
- (2) db작업
: 순서
- mapper xml 에서 쿼리문 작성
- DAO 에서 매핑구문에 해당하는 메서드 선언부 만들기 (매핑구문 실행)
- Service 인터페이스에 메서드 선언부 만들기
- ServiceImpl - 추가적 로직처리는 Service 구현체 에서 진행
- 다시 컨트롤러로 돌아가서 서비스의 메서드 호출
- (3) 모델에 결과 저장
- (4) 뷰페이지 리턴 후 뷰페이지 (jsp) 에서 화면 출력하는 코드작성
※ 신상품, 인기상품, MD 추천 상품별로 선별하여 LIST 에 뿌리기
- index 에는 productCatalog 가 include ,
productCatalog 에는 productEvent 가 include 되어있음
productEvent 에서 작업할꺼임

▶ Controller
▷ annotaion
1. @Controller
2. @RequestMapping - 상위 폴더 매핑
3. @RequiredArgsConstructor - 생성자 주입
view 로 vo나 list 같은 파라미터를 보내기 위해서
ModelMap 이나 Model 을 사용한다.
Model은 interface이고
ModelMap 은 class 인것 외에 사용하는데 차이점은 없으니 골라쓰면됨
String, int 같은 파라미터를 받기 위해 @RequestParam 어노테이션을 사용
@Controller
@RequestMapping("/shop/product")
@RequiredArgsConstructor
public class ProductController {
private static final Logger logger
= LoggerFactory.getLogger(ProductController.class);
private final ProductService productService;
@RequestMapping("/productEvent")
public String productEvent_get(ModelMap model,
@RequestParam String eventName) {
logger.info("이벤트 상품 eventName={}",eventName);
- 틀 잡고 db 작업을 하기 위해 xml 로 감
▶ xml
1. 틀잡기
- namespace 를 DAO fullname으로 지정
<?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="com.ez.herb.product.model.ProductDAO">
2. 쿼리문 작성
<select id="selectProductByEvent" parameterType ="string"
resultType="productVo">
select * from productEventView
where eventname =#{eventName}
</select>
- 여기서 #{eventName} 은 productCatalog.jsp 에서
c:param 으로 보낸 eventName 파라미터를 받은것임
productCatalog.jsp
<!-- 신상품 include -->
<c:import url="/shop/product/productEvent" >
<c:param name="eventName" value="NEW"></c:param>
</c:import>
<p class="pdEvent">
<img src="${pageContext.request.contextPath }/images/dotLong3.JPG"
align="absmiddle">
<span class="spEvent">인기상품</span>
</p>
<!-- 인기상품 include -->
<c:import url="/shop/product/productEvent" >
<c:param name="eventName" value="BEST"></c:param>
</c:import>
= eventCatolog => productEvent => controller => xml 루트를 타고 value 값이
xml #{} 안으로 들어옴
▶ DAO (interface)
▷ annotaion
- @Mapper
DAO 에서는 추가적인 로직 처리 없이 메서드만 만든다.
이때 메서드의 이름은 XML 뭐리문의 id 와 일치해야 함
@Mapper
public interface ProductDAO {
public List<ProductVO> selectProductByEvent(String eventName);
public List<ProductVO> selectProductByCategory(int categoryNo);
}
▶ Service (interface)
public interface ProductService {
public List<ProductVO> selectProductByEvent(String eventName);
public List<ProductVO> selectProductByCategory(int categoryNo);
}
▶ ServiceImple
- 서비스 구현체
▷ annotaion
- 1. @Service
- 2. @Autowired
- 3. @Override
logger 객체를 생성하고, 메서드에 추가적인 로직작업은 여기서 한다
@Service
public class ProductServiceImpl implements ProductService{
private static final Logger logger
= LoggerFactory.getLogger(ProductServiceImpl.class);
@Autowired
private ProductDAO productDao;
@Override
public List<ProductVO> selectProductByEvent(String eventName) {
return productDao.selectProductByEvent(eventName);
}
이렇게 ServiceImple 에서 로직처리까지 완료했으면 ! 다시
Controller 로 돌아가서 db 작업을 완료해준다
▶ Controller
List<ProductVO> list = productService.selectProductByEvent(eventName);
logger.info("이벤트 상품 결과, list.size ={}", list.size());
model.addAttribute("list",list);
return "/shop/product/productEvent";
//http://localhost:9091/herb/shop/product/productEvent?eventName=NEW
}
Service 에서 만들어둔메서드 selectProductByEvent 에 받아온 파라미터 eventName 을 넣어서
결과를 list 로 받아 이것을 또 model 에 넣어 "list" 라는 이름으로 productEvent.jsp (뷰페이지) 로 보낸다.
▶ productEvent.jsp
items = "${list }"
이때 중괄호 안의 list 는 Controller 에서 model 에 담아 보낼때 설정한 이름과 일치해야한다
list 를 vo 로 하나씩 꺼내서 배치해주자
<c:forEach var="vo" items="${list}">
<!-- 반복문 시작 -->
<div class="divPd">
<a href
="<c:url value ='/shop/product/productDetail?=productNo=${vo.productNo }'/>">
<img src ="<c:url value ='/pd_images/${vo.imageURL}'/>">
</a>
<br>
${vo.productName }<br>
<fmt:formatNumber value ="${vo.sellPrice }" pattern ="#,###"/>
</div>
<!-- 반복끝 -->
</c:forEach>
fmt : <%@ taglib prefix="fmt" uri ="http://java.sun.com/jsp/jstl/fmt" %>
※ 카테고리를 추가하면 생성되기

inc / top 에서 nav 만 따로 빼서(한페이지에서 다 하면 복잡하니까) categoryList.jsp 라는 view 페이지를 만들어
여기서 작업할꺼다

기존 top 에 있던 카테고리 nav 에 주석을 달아서 빼고

categoryList 라는 view 페이지로 카테고리만을 위한 작업공간 만들어준다
CategoryVO, CategoryDAO (i), CategoryService (i), CategoryServiceImpl, CategoryController, Category.xml 생성
▶ Controller
- @RequestMapping ( / ~ ) : 절대경로 (webapp 기준)
@RequestMapping ( ~ / ) : 상대경로 (내 위치 기준)
@Controller
@RequiredArgsConstructor
public class CategoryController {
private static final Logger logger
= LoggerFactory.getLogger(CategoryController.class);
private final CategoryService categoryService;
@RequestMapping("/inc/categoryList")
public String categoryList(Model model) {
logger.info("");
▶ xml
- 쿼리문에 파라미터가 필요없으니 ParameterType 넣지 않음
<?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="com.ez.herb.category.model.CategoryDAO">
<select id ="selectCategory" resultType ="categoryVo">
select * from category
</select>
</mapper>
▶ CategoryDAO
@Mapper
public interface CategoryDAO {
public List<CategoryVO> selectCategory();
}
▶ CategoryService
public interface CategoryService {
public List<CategoryVO> selectCategory();
}
▶ CategoryServiceImpl
@Service
public class CategoryServiceImpl implements CategoryService{
private static final Logger logger
= LoggerFactory.getLogger(CategoryServiceImpl.class);
@Autowired
private CategoryDAO categoryDao;
@Override
public List<CategoryVO> selectCategory() {
return categoryDao.selectCategory();
}
}
▶ Controller
- db 작업 마무리 + 결과를 mode 에 담아서 view 로 리턴
@Controller
@RequiredArgsConstructor
public class CategoryController {
private static final Logger logger
= LoggerFactory.getLogger(CategoryController.class);
private final CategoryService categoryService;
@RequestMapping("/inc/categoryList")
public String categoryList(Model model) {
logger.info("");
List<CategoryVO> list = categoryService.selectCategory();
logger.info("카테고리명 list.size={}",list.size());
model.addAttribute("categoryList",list);
return "/inc/categoryList";
}
}
▶ categoryList.jsp (뷰페이지)
- view 페이지로 보낼 때 "?" 뒤에 파라미터 쓸때 엔터치면 띄어쓰기로 인식되어 에러발생하기때문에
띄어쓰기 절대금지
<c:forEach var="vo" items="${categoryList }">
<dd>
<a
href="<c:url value='/shop/product/productByCategory?categoryNo=${vo.categoryNo }&categoryName=${vo.categoryName }'/>">
${vo.categoryName }</a>
</dd>
</c:forEach>
이렇게
db에서 카테고리 명을 읽어와 view 에 뿌리는 작업을 끝냈다.
카테고리를 클릭하면 해당 카테고리에 해당하는 상품의 list 만 보여주는 view 를 생성해보자 !
▽
※ 클릭하면 해당 카테고리별 상품목록확인
categoryList.jsp 에서 a 태그 get 방식으로
다음과 같이 파라미터를 productByCategory.jsp 로 보냄
<a href="<c:url value='/shop/product/productByCategory?categoryNo=${vo.categoryNo }
&categoryName=${vo.categoryName }'/>">
${vo.categoryName }
</a>
▶ Controller
@RequestMapping("/productByCategory")
public String productByCategory_get(ModelMap model,
@RequestParam int categoryNo, @RequestParam String categoryName) {
logger.info("카테고리 파라미터categoryName ={}, categoryNo={}",categoryName, categoryNo);
▶ mapper xml
<select id ="selectProductByCategory" parameterType="int"
resultType ="productVo">
select * from products
where categoryno =#{categoryNo}
</select>
▶ DAO interface
@Mapper
public interface ProductDAO {
public List<ProductVO> selectProductByEvent(String eventName);
public List<ProductVO> selectProductByCategory(int categoryNo);
}
▶ Service interface
public interface ProductService {
public List<ProductVO> selectProductByEvent(String eventName);
public List<ProductVO> selectProductByCategory(int categoryNo);
}
▶ServiceImpl
@Override
public List<ProductVO> selectProductByCategory(int categoryNo) {
return productDao.selectProductByCategory(categoryNo);
}
▶ Controller
@RequestMapping("/productByCategory")
public String productByCategory_get(ModelMap model,
@RequestParam int categoryNo, @RequestParam String categoryName) {
logger.info("카테고리 파라미터categoryName ={}, categoryNo={}",categoryName, categoryNo);
List<ProductVO> list = productService.selectProductByCategory(categoryNo);
logger.info("카테고리별 상품결과, list.size={}",list.size());
model.addAttribute("list",list);
return "/shop/product/productByCategory";
}
이때 중요한거 !!
- categoryList.jsp 에서 @RequestParam 어노테이션으로 받아온 파라미터는 보내지지 않았다. 이건 어떻게
productByCategory 에서 확인 할 수 있을까 ? ▽
▶ productByCategory.jsp
param. 을 사용해서 받아오면 된다 !!
${param.categoryName }
<div style="width: 780px; text-align: center;">
<H2>${param.categoryName }</H2>
<c:forEach var="vo" items="${list}">
<!-- 반복문 시작 -->
<div class="divPd">
<a href
="<c:url value ='/shop/product/productDetail?=productNo=${vo.productNo }'/>">
<img src ="<c:url value ='/pd_images/${vo.imageURL}'/>">
</a>
<br>
${vo.productName }<br>
<fmt:formatNumber value ="${vo.sellPrice }" pattern ="#,###"/>
</div>
<!-- 반복끝 -->
</c:forEach>
</div>
'Spring' 카테고리의 다른 글
| [Spring] 주문하기 / 장바구니에 담기 / 장바구니 목록 보여주기 (0) | 2022.06.15 |
|---|---|
| [Spring] 게시판 예제 / 이벤트 상품별로 분류하기 / 선택한 체크박스만삭제하기 (0) | 2022.06.14 |
| [Spring] 파일업로드 / 다운로드 (0) | 2022.06.02 |
| [Spring] spring boot 스프링부트 (0) | 2022.05.31 |
| [Spring] mybatis (0) | 2022.05.30 |