본문 바로가기
[study]이론정리/Spring Boot

Spring MVC - Model 생성

by yoon9i 2024. 7. 2.

* 아키텍쳐

              요청처리(@RequestParam, @RequestHeader, @CookieValue)
  웹브라이저 ----------------------> Controller
                                        |
                                        |
            <---------------------    hello( /WEB-INF/views/hello.jsp)


7> Model 생성방법
- 이전 서블릿/jsp 는 scope 에 setAttribute(key,value) 로 저장하고 jsp 에서 보여줌.

  scope 종류에 따라서 저장하고 

    request.setAttribute(key,value);
    session.setAttribute(key,value);
    application.setAttribute(key,value);

  나중에 jsp 에 보여줌.
  jsp 에서 보여주는 방법은

    EL: ${key}

  위 방식으로 jsp 에 보여준다.


* Spring 에서 JSTL 사용방법

<1> 의존성 설정

  <dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency> 
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>

<2> jsp 에서 taglib 등록

  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


방법1: HttpServletRequest 이용

  @GetMapping("/m1")
public String m1(HttpServletRequest request) {
System.out.println("m1");
request.setAttribute("m1", "홍길동");
request.setAttribute("m1_dto", new LoginDTO("홍길동", "1234"));

List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
  new LoginDTO("홍길동2", "9999"));

request.setAttribute("m1_list", list);

return "m1";
}

 

방법2: Model 이용

  @GetMapping("/m2")
public String m2(Model m) { // 자동으로 new Model() 해서 주입됨.
    // 기본적으로 request scope 에 저장됨.
System.out.println("m2");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));

List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
  new LoginDTO("홍길동2", "9999"));

m.addAttribute("m1_list", list);

return "m1";
}

방법3: ModelMap 이용

@GetMapping("/m3")
public String m3(ModelMap m) { // 자동으로 new ModelMap() 해서 주입됨.
    // 기본적으로 request scope 에 저장됨.
System.out.println("m3");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));

List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
  new LoginDTO("홍길동2", "9999"));

m.addAttribute("m1_list", list);

return "m1";
}

방법4: Map 이용

@GetMapping("/m4")
public String m4(Map<String, Object> m) { // 자동으로 new Model() 해서 주입됨.
    // 기본적으로 request scope 에 저장됨.
System.out.println("m4");
m.put("m1", "홍길동");
m.put("m1_dto", new LoginDTO("홍길동", "1234"));

List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
  new LoginDTO("홍길동2", "9999"));

m.put("m1_list", list);

return "m1";
}

package com.exam.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import com.exam.dto.LoginDTO;

@Controller
public class MainController {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@GetMapping("/m1")
	public String m1(HttpServletRequest request) {
		System.out.println("m1");
		request.setAttribute("m1", "홍길동");
		request.setAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
		
		List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
										  new LoginDTO("홍길동2", "9999"));
		
		request.setAttribute("m1_list", list);
		
		return "m1";
	}
	
	@GetMapping("/m2")
	public String m2(Model m) { // 자동으로 new Model() 해서 주입됨.
		System.out.println("m2");
		m.addAttribute("m1", "홍길동");
		m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
		
		List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
										  new LoginDTO("홍길동2", "9999"));
		
		m.addAttribute("m1_list", list);
		
		return "m1";
	}
	
	@GetMapping("/m3")
	public String m3(ModelMap m) { // 자동으로 new ModelMap() 해서 주입됨.
		System.out.println("m3");
		m.addAttribute("m1", "홍길동");
		m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
		
		List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
										  new LoginDTO("홍길동2", "9999"));
		
		m.addAttribute("m1_list", list);
		
		return "m1";
	}
	
	@GetMapping("/m4")
	public String m4(Map<String, Object> m) { // 자동으로 new Model() 해서 주입됨.
		System.out.println("m4");
		m.put("m1", "홍길동");
		m.put("m1_dto", new LoginDTO("홍길동", "1234"));
		
		List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
										  new LoginDTO("홍길동2", "9999"));
		
		m.put("m1_list", list);
		
		return "m1";
	}
 }
package com.exam.dto;

public class LoginDTO {
	
	String userid;
	String passwd;
	
	public LoginDTO() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public LoginDTO(String userid, String passwd) {
		super();
		this.userid = userid;
		this.passwd = passwd;
	}
	
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	
	@Override
	public String toString() {
		return "LoginDTO [userid=" + userid + ", passwd=" + passwd + "]";
	}
	
	
}
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m1.jsp</h2>
	m1: ${m1}<br>
	m1_dto: ${m1_dto}<br>
	m1_list:
	<c:forEach var="dto" items="${m1_list}">
		${dto}<br>
	</c:forEach>
</body>
</html>
# application.properties
logging.level.org.springframework=info

# tomcat port 번호 변경
server.port=8090

# context 명 변경
server.servlet.context-path=/app

# jsp의 경로와 확장자 지정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp


spring.mvc.pathmatch.matching-strategy=ant-path-matcher
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-devtools</artifactId>
		</dependency>
	<dependency>
		<groupId>org.apache.tomcat.embed</groupId>
		<artifactId>tomcat-embed-jasper</artifactId>
		<scope>provided</scope>
	</dependency> 
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>jstl</artifactId>
	</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

방법5: 자동으로 key 사용해서 저장

  @GetMapping("/m5")
public String m5(LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// request.setAttribute(key, value)
// 즉, 내부적으로 request.setAttribute(loginDTO, dto);
// 자동으로 빈 이름(첫글자는 소문자)으로 key 로 설정됨.

dto.setUserid("이순신");
dto.setPasswd("9876");

return "m5";
}

방법6: 명시적으로 key 사용해서 저장(*)

  @GetMapping("/m6")
public String m6(@ModelAttribute("dto_model") LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.

dto.setUserid("이순신");
dto.setPasswd("9876");

return "m6";
}

방법7:

  @GetMapping("/m7")
public String m7(@ModelAttribute("list_model") ArrayList<LoginDTO> list) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.

list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));

return "m7";
}

==> 방법7 까지가 메서드의 파라미터로 지정해서 Model 를 생성함.
    그러면 리턴타입의 String 은 View 정보가 되는것이다.(jsp정보)
==> 메서드의 파라미터로 지정해서 Model 를 생성함.
    모델은 파라미터에서 선언해서 만들거나 리턴타입으로 만든다.
==> 방법8 부터는 메서드의 리턴타입으로 Model 를 생성함.
==> View 정보는 어떻게 얻을까?  요청맵핑값을 view 정보로 사용한다. 

package com.exam.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import com.exam.dto.LoginDTO;

@Controller
public class MainController {
	
	Logger logger = LoggerFactory.getLogger(getClass());
		
	@GetMapping("/m5")
	public String m5(LoginDTO dto) {
		// LoginDTO 가 Model 이 됨.
		// request.setAttribute(key, value)
		// 즉, 내부적으로 request.setAttribute(loginDTO, dto);
		// 자동으로 빈 이름(첫글자는 소문자)으로 key 로 설정됨.
		
		dto.setUserid("이순신");
		dto.setPasswd("9876");
		
		return "m5";
	}
	
	@GetMapping("/m6")
	public String m6(@ModelAttribute("dto_model") LoginDTO dto) {
		// LoginDTO 가 Model 이 됨.
		// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
		// key 값 설정은 @ModelAttribute("key값") 사용.
		
		dto.setUserid("이순신");
		dto.setPasswd("9876");
		
		return "m6";
	}
	
	@GetMapping("/m7")
	public String m7(@ModelAttribute("list_model") ArrayList<LoginDTO> list) {
		// LoginDTO 가 Model 이 됨.
		// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
		// key 값 설정은 @ModelAttribute("key값") 사용.
		
		list.add(new LoginDTO("홍길동", "1234"));
		list.add(new LoginDTO("이순신", "9876"));
		
		return "m7";
	}
		
}
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m5.jsp</h2>
	${loginDTO}
</body>
</html>
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m6.jsp</h2>
	${dto_model}
</body>
</html>
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m7.jsp</h2>
	<c:forEach var="dto" items="${list_model}">
		${dto}<br>
	</c:forEach>
</body>
</html>

 

방법8: 자동으로 key 사용해서 저장

  @GetMapping("/m8") // /WEB-INF/views/m8.jsp 찾음
public LoginDTO m8() { // 리턴타입인 LoginDTO 가 Model 이다. 

return new LoginDTO("유관순", "1234");
}

방법9: 명시적으로 key 사용해서 저장

  @GetMapping("/m9") // /WEB-INF/views/m9.jsp
public @ModelAttribute("dto_model") LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다. 

return new LoginDTO("유관순", "1234");
}

  @GetMapping("/m9") // /WEB-INF/views/m9.jsp
  @ModelAttribute("dto_model")
public LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다. 

return new LoginDTO("유관순", "1234");
}

방법10:

  @GetMapping("/m10") // /WEB-INF/views/m10.jsp
public @ModelAttribute("list_model") ArrayList<LoginDTO> m10() { // 리턴타입인 LoginDTO 가 Model 이다.

ArrayList<LoginDTO> list = new ArrayList<>();

list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));

return list;
}

==> 방법8 에서 방법10 까지는 Model 과 View 정보가 분리되어서 설정했음.
==> 아래의 방법부터는 Model 과 View 정보를 한번에 설정 가능.

 

package com.exam.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import com.exam.dto.LoginDTO;

@Controller
public class MainController2 {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@GetMapping("/m8") // /WEB-INF/views/m8.jsp
	public LoginDTO m8() { // 리턴타입인 LoginDTO 가 Model 이다. 
		
		return new LoginDTO("유관순", "1234");
	}
	
	// -------------------------------------------
	 
	@GetMapping("/m9") // /WEB-INF/views/m9.jsp
	public @ModelAttribute("dto_model") LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다. 
		
		return new LoginDTO("유관순", "1234");
	}
	
	@GetMapping("/m9a") // /WEB-INF/views/m9.jsp
	@ModelAttribute("dto_model")
	public LoginDTO m9a() { // 리턴타입인 LoginDTO 가 Model 이다. 
		
		return new LoginDTO("유관순", "1234");
	}
	// @ModelAttribute 를 밖에 사용해도 상관없다.
	
	// -------------------------------------------
	
	@GetMapping("/m10") // /WEB-INF/views/m10.jsp
	public @ModelAttribute("list_model") ArrayList<LoginDTO> m10() { // 리턴타입인 LoginDTO 가 Model 이다.
		
		ArrayList<LoginDTO> list = new ArrayList<>();
		
		list.add(new LoginDTO("홍길동", "1234"));
		list.add(new LoginDTO("이순신", "9876"));
		
		return list;
	}
		
}
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m8.jsp</h2>
	${loginDTO}
	
</body>
</html>
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m9.jsp</h2>
	${dto_model}
	
</body>
</html>
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m10.jsp</h2>
	<c:forEach var="dto" items="${list_model}">
		${dto}<br>
	</c:forEach>
</body>
</html>

 

방법11:

@GetMapping("/m11") 
public ModelAndView m11() {

ModelAndView mav = new ModelAndView();
// 뷰정보
mav.setViewName("m11"); // /WEB-INF/views/m11.jsp

// 모델정보
mav.addObject("m11", "홍길동");
mav.addObject("m11_dto", new LoginDTO("홍길동", "1234"));

List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
   new LoginDTO("홍길동2", "9999"));
mav.addObject("m11_list", list);

return mav;
}

==> 모델이 없을때는?

// Model 은 없고 View 는 m12.jsp 가 된다.
@GetMapping("/m12") 
public void m12() {

}

 

package com.exam.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;

import com.exam.dto.LoginDTO;

@Controller
public class MainController3 {
	
	Logger logger = LoggerFactory.getLogger(getClass());
		
	@GetMapping("/m11") 
	public ModelAndView m11() {
		
		ModelAndView mav = new ModelAndView();
		// 뷰정보
		mav.setViewName("m11"); // /WEB-INF/views/m11.jsp
		
		// 모델정보
		mav.addObject("m11", "홍길동");
		mav.addObject("m11_dto", new LoginDTO("홍길동", "1234"));
		
		List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
				  							new LoginDTO("홍길동2", "9999"));
		mav.addObject("m11_list", list);
		
		return mav;
	}
	
	// ------------------------------------------------------
	
	// Model 은 없고 View 는 m12.jsp 가 된다.
	@GetMapping("/m12") 
	public void m12() {
		
	}
	
		
}
<%@ page 
         contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"        
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>m11.jsp</h2>
	m11: ${m11}<br>
	m11_dto: ${m11_dto}<br>
	m11_list:
	<c:forEach var="dto" items="${m11_list}">
		${dto}<br>
	</c:forEach>
</body>
</html>