반응형

 

모델을 통한 데이터 전달

 

 

  • 예시1

 

MemberController.java

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class MemberController {
	
	// DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	MemberService memberService;
	
	//요청URI : /read01
	//Model 객체를 통해서 다양한 데이터를 뷰(View)에 전달
	@GetMapping("/read01")
	public String read01(Model model) {
		model.addAttribute("userId", "hongkd");
		model.addAttribute("password", "1234");
		model.addAttribute("email", "aaa@ccc.com");
		model.addAttribute("userName", "홍길동");
		model.addAttribute("birthDay", "1989-09-07");
		
		// /views/read01.jsp
		return "read01";
	}
}

 

 

read01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h3>Result</h3>
<p>userId : ${userId}</p> 
<p>password : ${password}</p> 
<p>email : ${email}</p> 
<p>userName : ${userName}</p> 
<p>birthDay : ${birthDay}</p>

 

결과 화면1

 

 

 

  • 예시2

 

Member.java

package kr.or.ddit.vo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

//POJO가 약해짐
@Data
public class Member {
	private String userId;
	private String userName = "hongkd";
	private String password = "1234";
	@DateTimeFormat(pattern="yyyy-MM-dd") private Date regDate;
	private int coin;
	private String gender;
	private String email;
	private String birthDay;
	private String nationality;
	private String cars;
	private String[] carArray;
	private ArrayList<String> carList;
	private String hobby;
	private String[] hobbyArray;
	private ArrayList<String> hobbyList;
	private String developer;
	private boolean foreigner;
	private String introduction;
	private Date dateOfBirth;
	
	// 중첩된(nested) 자바빈즈
	// MEMBER : ADDRESS = 1 : 1
	private Address address;
	
	// MEMBER : CARD = 1 : N
	private List<Card> cardList;
	
	//스프링프레임워크에서 제공하는 MultipartFile 파일객체타입
	private MultipartFile picture;
	
	//<input type="file" name="pictures" multiple>
	// 위의 input과 name 값이 변수명과 같아야 함
	private MultipartFile[] pictures;
}

 

 

MemberController.java

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class MemberController {
	
	// DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	MemberService memberService;
	
	//요청URI : /read02
	//Model 객체에 자바빈즈 클래스 객체를 값으로만 전달할 때는 뷰에서 참조할 이름을 클래스명의 앞글자를 소문자로 변환하여 처리함
	@GetMapping("/read02")
	public String read02(Model model) {
		Member member = new Member();
		
		member.setUserId("hongkd");
		member.setPassword("1234");
		member.setEmail("aaa@ccc.com");
		member.setUserName("홍길동");
		member.setBirthDay("1989-09-07");
		
		Calendar cal = Calendar.getInstance();
		cal.set(1988, 10, 7);
		member.setDateOfBirth(cal.getTime());
		
		log.info("member : " + member);
		
		model.addAttribute("member",member);
		
		// forwarding : /views/read02.jsp
		return "read02";
	}
}

 

 

read02.jsp

=> model.addAttribute("member",member); 로 저장한 member의 값을 jsp에서 꺼내올 수 있음

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<p>${member}</p>
<p>userId : ${member.userId}</p>
<p>userName : ${member.userName}</p>

 

결과 화면2

 

 

 

  • String[]와 List<String> 비교 => 다를 것 없음

 

MemberController.java

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class MemberController {
	
	// DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	MemberService memberService;
	
	@GetMapping("/read04")
	public String read04(Model model) {
		String[] carArray = {"saab", "audi"};
		
		List<String> carList = new ArrayList<String>();
		carList.add("saab");
		carList.add("audi");
		
		
		String[] hobbyArray = {"Music", "Movie"};
		
		List<String> hobbyList = new ArrayList<String>();
		hobbyList.add("Music");
		hobbyList.add("Movie");
		
		model.addAttribute("carArray", carArray);
		model.addAttribute("carList", carList);
		
		model.addAttribute("hobbyArray", hobbyArray);
		model.addAttribute("hobbyList", hobbyList);
		
		// /views/read04.jsp 포워딩
		return "read04";
	}
}

 

 

read04.jsp

 

stat.index : 0부터 시작
stat.count : 1부터 시작

 

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h4>hobbyArray</h4>
<!-- hobbyArray : {"Music", "Movie"} -->
<!-- items에는 컨트롤러에 있는 이름 그대로 집어 넣음 -->
<c:forEach var="hobby" items="${hobbyArray}" varStatus="stat">
	<p>${stat.index} : ${hobby}</p>
</c:forEach>
<hr />

<h4>hobbyList</h4>
<!-- hobbyList : List<String> -->
<!-- hobbyList.add("Music");	hobbyList.add("Movie"); -->
<c:forEach var="hobby" items="${hobbyList}" varStatus="stat">
	<p>${stat.count} : ${hobby}</p>
</c:forEach>

 

결과 화면3

 

 

 

  • 중첩된 자바빈즈

 

MemberController.java

 

값이 들어간 구조

 

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class MemberController {
	
	// DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	MemberService memberService;
	
	@GetMapping("/read05")
	public String read05(Model model){
	
		Member member = new Member();
		
			// member 안에 있는 값임
			Address address = new Address();
			address.setPostCode("080908");
			address.setLocation("seoul");
		
		member.setAddress(address);
		
			List<Card> cardList = new ArrayList<Card>();
		
			Card card1 = new Card();
			card1.setNo("123456");
			card1.setValidMonth("05/24");
			
			cardList.add(card1);
			
			Card card2 = new Card();
			card2.setNo("11111");
			card2.setValidMonth("06/24");
			
			cardList.add(card2);
			
		member.setCardList(cardList);
		Calendar cal = Calendar.getInstance();
		cal.set(2000, 05, 07);
		member.setDateOfBirth(cal.getTime());

		model.addAttribute("member", member);
		
		return "read05";
	}
}

 

 

read05.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<p>${member}</p>

<!--  --MEMBER : ADDRESS = 1 : 1 (association)
   -- member.address.userId(자바빈객체.중첩된 자바빈객체.프로퍼티)
   address = Address(userId = null , posetCode = 080908 
         , location = seoul),
      -->
<!--  model.addAttribute("member", --> 
<p>member.address.postCode
	: ${member.address.postCode}
</p>
<p>member.address.location
	: ${member.address.location}
</p>
<hr />

<!-- List<Card> cardList -->
<h4>member.cardList</h4>
<c:forEach var="card" items="${member.cardList}" varStatus="stat">
	<p>${card.no} : ${card.validMonth}</p>
</c:forEach>

 

결과 화면4

 

 

 

  • 쿼리 조인 예시1

 

LprodController.java

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import kr.or.ddit.service.LprodService;
import kr.or.ddit.vo.LprodVO;
import kr.or.ddit.vo.ProductVO;
import lombok.extern.slf4j.Slf4j;

/*
Controller 어노테이션
스프링 프레임워크에게 "이 클래스는 웹 브라우저의 요청(request)를
받아들이는 컨트롤러야" 라고 알려주는 것임.
스프링은 servlet-context.xml의 context:component-scan의 설정에 의해
이 클래스를 자바빈 객체로 등록(메모리에 바인딩).
*/
//스프링 프레임워크에게 "이 클래스는 컨트롤러야"라고 알려주자
@Slf4j
@RequestMapping("/lprod")
@Controller
public class LprodController {
	
	//DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	LprodService lprodService;
	
	/*
	요청URI : /lprod/detail?lprodGu=P101
	요청파라미터 : lprodGu=P101
	요청방식 : get
	
	리턴타입 : ModelAndView
	View : lprod > detail.jsp
	
	detail(ModelAndView mav) => 스프링이 mav객체를 자동 생성
	*/
	@RequestMapping(value="/detail", method=RequestMethod.GET)
	public ModelAndView detail(LprodVO lprodVO, ModelAndView mav){
		log.info("detail 도착");

		//Model
	    // lprod_SQL.xml 의 namespace인 lprod내의 id값인 detail에 접근하여
	    // SELECT LPROD_ID, LPROD_GU, LPROD_NM
	    // FROM     LPROD
	    // WHERE  LPROD_GU = 'P101'
	    // 을 처리한 후 다음이 콘솔에 출력되도록 해보자
		
		log.info("detail->lprodVO : " + lprodVO);
		lprodVO = this.lprodService.detail(lprodVO);
		log.info("lprodVO : " + lprodVO);
		
		mav.addObject("lprodVO",lprodVO);
		
		// forwarding : jsp
		mav.setViewName("lprod/detail");
		
		return mav;
	}
}

 

 

LprodVO.java

package kr.or.ddit.vo;

import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

//POJO(Plain Old Java Object)에 위배
@Data
public class LprodVO {
	private int lprodId;
	private String lprodGu;
	private String lprodNm;
	
	//상품분류코드	: 상품		= 1 : N
	//LPROD		:PRODUCT	= 1 : N
	private List<ProductVO> productVOList;
	
	
	private MultipartFile[] pictures;
}

 

 

detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
<script type="text/javascript" src="/resources/js/jquery.min.js"></script>
</head>
<body>
	<h1>상품분류 상세</h1>
	<!-- 
	요청URI : /lprod/updatePost
	요청파라미터 : {lprodId=14,lprodGu=P501, lprodNm=분식류}
	요청방식 : post
 	-->
 	<h3>상품 분류 정보</h3>
 	<div id="divForm">
		<form id="frm" action="/lprod/updatePost" method="post">
			<p>
				<input type="number" name="lprodId" value="${lprodVO.lprodId}"
					readonly class="formdata" placeholder="상품분류 아이디(ex. 14)" />
			</p>
			<p>
				<input type="text" name="lprodGu" value="${lprodVO.lprodGu}" readonly
					class="formdata" placeholder="상품분류 코드(ex. P501)" required />
			</p>
			<p>
				<input type="text" name="lprodNm" value="${lprodVO.lprodNm}" readonly
					class="formdata" placeholder="상품분류 명(ex. 분식류)" />
			</p>
	
			<!-- ///// 일반모드 시작 ///// -->
			<p id="p1">
				<input type="button" id="edit" value="수정" /> <input type="button"
					id="delete" value="삭제" /> <input type="button" id="list" value="목록" />
			</p>
			<!-- ///// 일반모드 끝 ///// -->
			<!-- ///// 수정모드 시작 ///// -->
			<p id="p2" style="display: none">
				<input type="button" id="confirm" value="확인" /> <input type="button"
					id="cancel" value="취소" />
			</p>
			<!-- ///// 수정모드 끝 ///// -->
		</form>
	</div>
	
	<h3>상품 정보</h3>
	<!-- mav.addObject("lprodVO",lprodVO); -->
<%-- 	<p>${lprodVO.productVOList}</p> --%>
	<table border="1">
		<thead>
			<th>상품 아이디</th><th>상품 명</th><th>상품 가격</th>
		</thead>
		<tbody>
			<!-- lprodVO.productVOList : List<ProductVO> -->
			<c:forEach var="productVO" items="${lprodVO.productVOList}" varStatus="">
				<tr>
					<th>${productVO.productId}</th>
					<th>${productVO.pname}</th>
					<th>${productVO.unitPrice}</th>
				</tr>
			</c:forEach>
		</tbody>
	</table>
</body>
</html>

 

 

lprod_SQL.xml

 

join을 했을 때 resultMap사용
resultMap의 이름으로 resultMap 생성 후 id 같은 이름으로 기입

lprodVO에서 1:N으로 사용했기에 collection 을 사용 (collection의 property의 이름은 vo에 있는 이름과 같아야 함)
resultMap을 사용하여 이름을 정의
resultMap 생성 후 id를 정의한 것으로 기입하여 사용

작업 시 주의해야 할 것1

 

작업 시 주의해야 할 것2

 

<?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="lprod">
	<!-- LPROD : 1 -->
	<!-- DB영역과 Java의 영역을 서로 매핑하는 역할을 함 -->
	<resultMap type="lprodVO" id="lprodMap">
		<result property="lprodId" column="LPROD_ID"/>
		<result property="lprodGu" column="LPROD_GU"/>
		<result property="lprodNm" column="LPROD_NM"/>
		<!-- 1:N이기에 collection 사용 -->
		<collection property="productVOList" resultMap="productMap"></collection>
	</resultMap>
	
	<!-- PRODUCT : N -->
	<resultMap type="productVO" id="productMap">
		<result property="productId" column="PRODUCT_ID"/>
		<result property="pname" column="PNAME"/>
		<result property="unitPrice" column="UNIT_PRICE"/>
		<result property="description" column="DESCRIPTION"/>
		<result property="manufacturer" column="MANUFACTURER"/>
		<result property="category" column="CATEGORY"/>
		<result property="unitsInStock" column="UNITS_IN_STOCK"/>
		<result property="condition" column="CONDITION"/>
		<result property="filename" column="FILENAME"/>
		<result property="quantity" column="QUANTITY"/>
	</resultMap>
	
	<!-- PRODUCT : N -->
	<!-- join을 했기에 resultMap을 사용 -->
	<select id="detail" parameterType="lprodVO" resultMap="lprodMap">
		SELECT A.LPROD_ID, A.LPROD_GU, A.LPROD_NM,
		    B.PRODUCT_ID, B.PNAME, B.UNIT_PRICE, B.DESCRIPTION, B.MANUFACTURER,
		    B.CATEGORY, B.UNITS_IN_STOCK, B.CONDITION, B.FILENAME, B.QUANTITY
		FROM     LPROD A LEFT OUTER JOIN PRODUCT B ON(A.LPROD_GU = SUBSTR(B.PRODUCT_ID,1,4))
		WHERE  A.LPROD_GU = #{lprodGu}
	</select>
</mapper>

 

결과 화면5-1 : 상품 정보와 매핑 되어있는 경우

 

결과 화면5-2 : 상품 정보와 매핑 되어있는 경우

 

 

 

  • 쿼리 조인 예시2

EmployeeVO.java

package kr.or.ddit.vo;

import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

@Data
public class EmployeeVO {
	private String empNo;
	private String empName;
	private String empAddress;
	private String empTelno;
	private int empSalary;
	private String filename;
	
	private List<LicenseVO> licenseVOList;
	
	//EMPLOYEE : 증명사진 = 1 : 1
	private MultipartFile uploadFile;
}

 

 

EmployeeController.java

package kr.or.ddit.controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.sun.org.apache.xpath.internal.operations.Mod;

import kr.or.ddit.service.EmployeeService;
import kr.or.ddit.vo.EmployeeVO;
import lombok.extern.slf4j.Slf4j;

// 스프링 프레임워크에게 컨트롤러임을 알려줌
// 스프링이 빈(bean,객체)으로 등록하여 관리
@Controller
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {
	
	// 의존성 주입(Dependency Injection)
	@Autowired
	EmployeeVO myEmpVO;
	
	@Autowired
	EmployeeService employeeService;
	
	@RequestMapping(value="/detail", method=RequestMethod.GET)
	public ModelAndView detail(EmployeeVO employeeVO, ModelAndView mav) {
		log.info("list->detail : " + employeeVO);
		
		employeeVO = this.employeeService.detail(employeeVO);
		mav.addObject("employeeVO", employeeVO);
		
		mav.setViewName("employee/detail");
		
		return mav;
	}
}

 

 

employee_SQL.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="employee">
	<!-- EMPLOYEE : 1 -->
	<resultMap type="employeeVO" id="employeeMap">
		<result property="empNo" column="EMP_NO"/>
		<result property="empName" column="EMP_NAME"/>
		<result property="empAddress" column="EMP_ADDRESS"/>
		<result property="empTelno" column="EMP_TELNO"/>
		<result property="empSalary" column="EMP_SALARY"/>
		<result property="filename" column="FILENAME"/>
		<collection property="licenseVOList" resultMap="licenseMap"></collection>
	</resultMap>
	
	<!-- LICENSE : N -->
	<resultMap type="licenseVO" id="licenseMap">
		<result property="empNo" column="EMP_NO"/>
		<result property="licNo" column="LIC_NO"/>
		<result property="licNm" column="LIC_NM"/>
		<result property="licDt" column="LIC_DT"/>
	</resultMap>
	
	<!-- 조인 조건인 P.K = F.K이므로 F.K는 쿼리에서 제외 => 공동된 이름은 삭제-->
	<select id="detail" parameterType="employeeVO" resultMap="employeeMap">
		SELECT A.EMP_NO, A.EMP_NAME, A.EMP_ADDRESS, A.EMP_TELNO, A.EMP_SALARY, A.FILENAME,
		   B.LIC_NO, B.LIC_NM, B.LIC_DT
		FROM EMPLOYEE A LEFT OUTER JOIN LICENSE B ON(A.EMP_NO = B.EMP_NO)
		WHERE A.EMP_NO = #{empNo}
	</select>
</mapper>

 

결과 화면6-1

 

결과 화면6-2

 

 

반응형