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>