열심히 끝까지

디바이스 융합 자바(Java) day92 - Spring Boot 설정[MVC 패턴] 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day92 - Spring Boot 설정[MVC 패턴]

노유림 2022. 10. 25. 14:42

 

If, src 혹은 src/main/resources내부에 html 혹은 jsp를 생성할 수 없다면(생성파일이 없다면)

>> Java and Web Developer Tool 설치

1. Help -> Eclipse Marketplace

2. Search 'Java and Web'

3. 다음 tool 설치

 


 

[boot 설정]

- static : 정적 html 파일 생성

정적인 html 파일 위치

 

- src : 동적 jsp 파일 생성

동적인 jsp 파일 위치

 

★ 포트넘버가 동일하기 때문에 
    한 프로젝트할 때마다 중단하고 새로 킬 것 

 

패키징을 JAR로 하게 되면 별도의 컴파일을 필요로 하는 파일이 동작하지 않게 됨
   >> 그래서 WAR로 바꿔서 진행
          : 내장 톰캣을 진행시켜야 하기 때문에 WAR로 해야 함

>> Spring Web을 선택하게 되면 build.gradle에 
     다음 dependency가 추가됨


    >> jsp를 사용하고 싶으면 build-gradle에 다음을 더 추가해야 함

implementation 'javax.servlet:jstl'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
   
 >> 저장해도 적용이 안되기 때문에 
       파일을 우클릭 -> gradle -> Refresh Gradle Project 입력

>> application.properties에 추가
# JSP 페이지를 볼 수 있도록 설정을 추가
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
 >> 주석(#)에 한글이 있어서 저장할 때 에러 발생
        -> save in UTF-8로 누르면 됨

 

[동작 순서]
1. 프로그램 실행
2. application.properties 파일의 설정을 로드
3. 이후 사용자가 무언가 요청을 하게되면 
4. 그에 응답할 내용(jsp 파일)에 prefix 및 suffix 설정을 조합해줌

 

jsp 응답 확인하기 위한 코드 --------------

TestController------------

package com.ryo.springboot.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
	@RequestMapping("/")
	public @ResponseBody String root() { // 이 글자가 @ResponseBody를 통해 화면에 출력
		return "JSP를 SpringBoot에서 이용해보자!";
	}
	@RequestMapping("/index")
	public String index() {
		return "index"; // 실제로 호출되는 페이지의 경로는 prefix suffix 덕분에 /WEB-INF/views/index.jsp이다!
	}
	@RequestMapping("/test")
	public String test() {
		return "sub/test"; 
	}
}

index.jsp-----------------

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상세 페이지</title>
</head>
<body>

<%
	out.println("표지 페이지");
%>

</body>
</html>

test.jsp------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>테스트 페이지</title>
</head>
<body>

<%
	out.println("상세 페이지");
%>

</body>
</html>

결과-----------------------

-----------------------------------------------------

ModelAndView를 적용한 코드 

TestController--------------

package com.ryo.springboot.test;

import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TestController {
	@RequestMapping("/")
	public @ResponseBody String root() { // 이 글자가 @ResponseBody를 통해 화면에 출력
		return "MAV";
	}
	@RequestMapping("/index")
	public String index(Model model) {
		model.addAttribute("name", "apple");
		return "index"; // 실제로 호출되는 페이지의 경로는 prefix suffix 덕분에 /WEB-INF/views/index.jsp이다!
	}
	@RequestMapping("/test")
	public ModelAndView test(ModelAndView mav) {
		List<String> datas = new ArrayList<>();
		datas.add("test1");
		datas.add("test2");
		datas.add("test3");
		mav.addObject("datas", datas);
		mav.addObject("test", "테스트");
		mav.addObject("name", "banana");
		mav.setViewName("sub/test");
		return mav;
	}
}

ExModel.java------------------------

package test;

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

public class ExModel {
	// Q. 자바의 메서드 파라미터는 지역변수이다.
	//    커맨드 객체 or 모델 객체 등은 어떻게 데이터를 유지하는가?
	// A. 컨테이너가 관리하는 참조형 변수이기 때문에 가지고 다니는 것이 Heap 메모리의 주소이기 때문에
	//    데이터를 유지하고 다니는 것!
	public static void main(String[] args) { // 흐름을 유지하게 하는 컨테이너 
		Map<String, String> model = new HashMap<>();
		String path = root(model); // 커맨드 객체 or 모델 객체 -> 객체 변수, 참조형 변수
		printData(path,model);
	}
	public static String root(Map model) {
		model.put("name1", "티모");
		model.put("name2", "아리");
		return "memberListPage"; // 응답할 페이지
	}
	public static void printData(String path, Map model) {
		System.out.println("현재 페이지 : WEB-INF/views/"+path+".jsp");
		System.out.println("데이터 : "+model.get("name2"));
	}
}

Test.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>
<meta charset="UTF-8">
<title>상세 페이지</title>
</head>
<body>

${test} | ${name}
<hr>
<c:forEach var="v" items="${datas}">
	${v} <br>
</c:forEach>

</body>
</html>

결과---------

 

-------------------------------------------------------

 

커맨드 객체를 이용한 코드

TestController.java-------------------

package com.ryo.springboot.test;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
	@RequestMapping("/")
	public @ResponseBody String root() { // 이 글자가 @ResponseBody를 통해 화면에 출력
		return "커맨드 객체 사용하는 예제 : 사용자로부터 데이터를 받아올 예정";
	}
	@RequestMapping("/test1")
	public String test1(HttpServletRequest req, Model model) {
		// jsp 방식
		model.addAttribute("id",req.getParameter("id"));
		
		// 코드 가독성이 떨어져서 변수를 추가 사용했습니다.
		String name = req.getParameter("name");
		model.addAttribute("name",name);
		
		return "test1";
	}
	// 변수 많아질 수록 길어짐, test1에 비해
	// 일시적으로 값을 받아올 때 용이한 방식
	// jsp에 @(어노테이션) 추가
	@RequestMapping("/test2") 
	public String test2(@RequestParam("id")String id, @RequestParam("name")String name, Model model) {
		// 일시적으로 값을 받아올 때 용이한 방식
		// jsp에 @(어노테이션) 추가
		model.addAttribute("id", id);
		model.addAttribute("name", name);
		return "test2"; 
	}
	// 쓸 예정이 있을 것은 지우지 않고(미래를 위해 남겨둠)
	// 놔두는 강사님의 습관으로 Model을 남겨 둠
	// 
	@RequestMapping("/test3")
	public String test3(Student student, Model model) {
		return "test3"; 
	}
	// 4. path(경로) 자체에 변수를 넣는 방법
	//    받을 수 있게 꼭 작성할 것{}
	@RequestMapping("/test4/{studentId}/{studentName}") 
	public String test4(@PathVariable String studentId, @PathVariable String studentName, Model model) {
		model.addAttribute("id", studentId);
		model.addAttribute("name", studentName);
		return "test4"; 
	}
}

 

Student.java--------------------------

package com.ryo.springboot.test;

public class Student { // 커맨드 객체 역할을 수행해 줄 클래스
	private String id;
	private String name;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}

}

test1.jsp--------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>1</title>
</head>
<body>

${id} | ${name}

</body>
</html>

test2.jsp--------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>2</title>
</head>
<body>

${id} | ${name}


</body>
</html>

test3.jsp--------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>3</title>
</head>
<body>

${student.id} | ${student.name}


</body>
</html>

test4.jsp--------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>4</title>
</head>
<body>

${id} | ${name}


</body>
</html>

--------------

결과

test1-----------------

test2-----------------

test3-----------------

test4-----------------

 

 


 

Q. 자바의 메서드 파라미터는 지역변수이다.
    커맨드 객체 or 모델 객체 등은 어떻게 데이터를 유지하는가?
A. 컨테이너가 관리하는 참조형 변수이기 때문에 가지고 다니는 것이 Heap 메모리의 주소이기 때문에
    데이터를 유지하고 다니는 것!
    커맨드 객체 or 모델 객체는 메서드 파라미터가 맞지만,
    "참조형 변수"입니다. 실제 데이터(메모리)는 유지되고 있고
    이를 컨테이너가 관리해줍니다. -> IoC => Spring은 IoC와 AOP를 지원함