Spring

[Spring] 스프링 작업 순서 / 나를 위한 기초 다지기

sian han 2022. 6. 10. 00:49

[ 스프링 작업 순서 ]

 

 

▶ 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>