Backend/Spring | Spring Boot

Spring MVC 웹 프로젝트

olli2 2022. 1. 6. 14:35

스프링 웹 프로젝트 (Spring Legacy Project)

  • 스프링 템플릿 프로젝트를 이용한 웹 프로젝트
  •  모델2 방식 (MVC) 프로젝트 생성 시 사용
  • 서버 및 여러 설정 필요
  • 실제 개발 업무에서 많이 사용

스프링 프로젝트 구조

src/main/java

  • 자바 파일(.java)이 모여있는 폴더 (백엔드 관련 소스)
  • 이 곳에 자바 클래스 생성하여 사용

src/main/resourses

  • 자바 클래스에서 사용하는 리소스 보관하는 폴더
  • 자바 코드 외 모든 자원 여기에 보관 (DB 연결을 위한 자원, 의존성 주입을 위한 xml 파일 등)

src/test

  • 테스트를 위한 자바 코드와 리소스 보관

Maven Dependencies

  • 메이븐에서 자동으로 관리해주는 라이브러리 폴더
  • pom.xml에 작성된 라이브러리들을 자동으로 다운받아 관리

src

  • Web에 관련된 자원이 담겨있는 루트 폴더

src/main/webapp

  • 프론트엔드 관련 소스

src/main/webapp/resourses

  • 웹에 필요한 다양한 자원들을 보관하는 곳
  • css, js, img 파일 등 보관

src/main/webapp/WEB-INF/views

  • JSP, HTML 파일 보관
  • 이 폴더가 루트(/)의 기준점

web.xml (src/main/webapp/WEB-INF에 위치)

  • servlet-mapping 확인, 스프링 설정 파일 위치 정의
  • 기본 요청 “/”
  • "/"로 접속(요청)하면 DispatcherServlet (프론트 컨트롤러)가 요청에 해당하는 컨트롤러 연결 -> 컨트롤러가 View 파일명 return -> ViewResolver가 컨트롤러로부터 보내온 View 이름에 맞는 View (.jsp)파일 검색 -> 처리 결과가 포함된 View를 찾아 클라이언트에게 보여줌
<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

 

"appServlet으로 등록된 DispatcherServlet에게 /로 시작하는 모든 요청을 할당하여라." 라는 의미

-> DispatcherServlet이 담당할 Http 요청 url 패턴을 지정해줘야 함


servlet-context.xml

  • 스프링 컨테이너 설정 파일
  • ViewResolver가 컨트롤러로부터 보내온 (return) View 이름에 맞는 View 파일(.jsp)파일 검색
  • bean 속성 설정
    • name="prefix" : 접두어 (경로)
    • name="seffix" : 접미어 (확장자명)
    • prefix + 컨트롤러에서 return된 View 페이지 이름 + suffix
    • /WEB-INF/views/ + return된 View 페이지 이름 + .jsp
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

프로젝트 실행 url 확인

  • Server.xml -> Context
  • 프로젝트 생성 시 패키지명 입력 : com.spring_mvc.project
  • ContextPath : /project
  • http://localhost:8080/project/
<Context docBase="spring_mvc_01" path="/project" reloadable="true" source="org.eclipse.jst.jee.server:spring_mvc_01"/>

View의 요청 경로(Path) 설정

  • 원하는 경로로 View 경로 설정 : @RequestMapping(value="요청경로")
  • 해당 요청경로로 요청("http://localhost:8080/요청경로" 접속)하면 보여지는 페이지 = 컨트롤러가 return하는 View 파일
  • 요청경로와 실제 파일 경로 (컨트롤러 return 파일명)는 일치하지 않아도 됨 (요청경로는 임의로 지정 가능)
  • http://localhost:8080/project/jsp/home에 접속하였을 때 views - jsp 폴더 - home.jsp를 화면에 출력하고자 한다면
  • @RequestMapping(value="/jsp/home")
  • return “jsp/home";

컨트롤러와 요청 처리

스프링 컨트롤러

  • bean으로 등록되어야 함 -> 클래스 생성하고 @Controller 어노테이션 붙임
  • 비즈니스 로직이 실행되기 위해 비즈니스 객체를 의존성 주입(DI) 해야 함
  • @RequestMapping 어노테이션을 사용하여 url 매핑 + 요청 처리 메소드 구현 (해당 페이지 요청 오면 처리할 내용)
  • 뷰 페이지 이름 반환 : return "jsp 파일명";
@Controller
public class 컨트롤러명 {
	@RequestMapping("/요청_url_매핑이름")
	public String 요청_처리_메소드명() {
        요청_처리_메소드_구현내용
		return "View 파일명";
	}
}

예제 1

프로젝트명 : spring_mvc_01

패키지명 : com.spring_mvc.project

컨트롤러 : NewController

뷰 : newView.jsp

NewController

package com.spring_mvc.project;

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

@Controller
public class NewController {
	// '/newView'로 요청이 들어오면 처리
	@RequestMapping("/newView")
	public String newView() { //  '/newView'로 요청 들어오면 처리될 함수. 뷰페이지 이름 반환해줘야하므로 반환형 String
		return "newView"; // 뷰 페이지 이름 반환 : newView.jsp
		// 뷰 페이지 이름 앞에 아무 것도 없다는 것은 폴더가 views 폴더라는 것 = newView가 views 폴더에 들어있다는 것
		// 만일 views 폴더 안의 jsp 폴더 안에 있다면 return "jsp/newView";가 되어야 함
	}
}

 

newView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>newView.jsp</title>
</head>
<body>
	<h3>newView.jsp 페이지 입니다</h3>
</body>
</html>

예제 2

프로젝트명 : spring_mvc_02

패키지명 : com.spring_mvc.second

컨트롤러 : NewController

뷰 : index.jsp

NewController

package com.spring_mvc.second;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

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

@Controller
public class NewController {
	@RequestMapping("/index")
	public String index(Locale locale, Model model) {
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "index";
	}
}

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
	<h3>index.jsp 페이지 입니다.</h3>
	<P>  한국 현재 시간 : ${serverTime}. </P>
	<img src="/second/resources/image/apple.png"/>
</body>
</html>