49일차(1)/Spring(2) : MVC Project 초기 세팅(pom.xml) / Spring 기본 개념 익히기
- 새 프로젝트 생성시 pom.xml 설정방법
- MVC Project 의 기본 구성 익히기
- DispatcherServlet과 Controller, jsp페이지의 동작 방식
- servlet-context.xml 코드 살펴보기
- Spring Bean Container와 Bean 생성 방법
- 표준 MVC 프로젝트의 형태이다.
- Standard 프로젝트 생성 (Spring MVC project)
- 패키지명은 com.sy.standard
* MVC Project (Model View Controller Project)
(Model: 데이터 / View: jsp페이지를 가리킴 / Controller: controller페이지에서 받아서 전달함)
- 요청이 들어오면 Controller에서 받아서 jsp 페이지로 이동시켜서 응답한다.
- Controller는 예전에 사용했던 Servlet과 같은 것이라고 생각하면 된다.
- Servlet에서 로직을 모두 처리하고, 로직 수행의 결과(응답에 필요한 내용)를
request 영역에 담아서 포워드 이동시키는 것. 그러면 jsp 페이지는 응답에만 집중한다.
- jsp 페이지와 controller의 합동 작업이라고 할 수 있다.
- 스프링 MVC 프로젝트의 특징, 구조 알아두기!
- 이것은 메이븐 프로젝트이다.
- gradle/maven 중 뭘 선택해도 상관없지만, 설정하는 방식이 조금 다를 뿐이다.
- 메이븐의 특징은 pom.xml의 존재이다.
- Java Resources-Libraries 를 보면 두개의 폴더가 있는데,
1) JRE 시스템 library :설치한 자바의 라이브러리. java에서 기본으로 제공하는 라이브러리이다.
2) Maven Dependencies : 자바 외에 스프링에서 기본으로 필요한 라이브러리가 이안에 들어 있다.
- pom.xml에서 기본 세팅하기
- pom.xml 안에 들어있는 것들이 자동으로 다운로드되어서 사용할 수 있게 되어 있다.
- 예전에는 lib 폴더에 직접 집어넣었지만, Maven은 직접 다운받아서 넣을 필요가 없다.
pom에 dependency 설정만 하면 된다.
- 윈도우 환경변수에서 java, maven 설정을 했기때문에 이렇게 사용하는 것이 가능한 것!
- pom에서 다운받은 라이브러리는 사용자 설치 주소 안의 /.m2 라는 숨김 폴더 안에 들어가있다.
- pom.xml 수정하기
- Java version : 1.6 → 1.8
- Spring Version : 3.1.1 → 4.0.0 으로 수정
- 서블릿 부분은 위와같이 수정. javax를 추가해주기!
- 추가 의존 라이브러리를 전체 복사해서 붙여넣어 주기 (위치에 주의!)
<!-- 추가 의존 라이브러리 -->
<!-- MyBatis 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
<!-- Spring JDBC 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<!-- 파일업로드 처리를 위한 라이브러리 (SmartEditor 에서도 필요함)-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- json, xml 응답을 편하게 할수 있도록 도와 주는 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.0</version>
</dependency>
<!-- Aop 용 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.0</version>
</dependency>
<!-- Spring Security 관련 라이브러리 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<!-- 트렌젝션 처리를 위한 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<!-- 오라클 라이브러리 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
- MyBatis, JDBC, 오라클 등 이후 작업에 필요한 의존 라이브러리들이다.
- 해당 위치에 넣어준 것!
- 오라클도 들어가 있어서 DB를 추가로 추가하지 않아도 된다.
- 마지막으로 source, target을 1.6 → 1.8로 수정해주기
- 중간에 저장하면 오류가 발생할 수 있다. pom.xml을 전부 수정한 후에 저장하기.
- 로딩이 완료된 후 프로젝트 우클릭-Maven-Update Project 해주면 완전히 환경설정이 완료된다.
- web.xml에서 인코딩 설정 추가
<!-- post 방식 전송될때 한글 깨지지 않도록 Spring 인코딩 필터 정의하기 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- Spring 인코딩 필터 맵핑하기 -->
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- java Resources/HomeController.java 에서 쓸데없는 내용 지우고 깔끔하게
package com.sy.standard;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home";
}
}
- /views/home.jsp 삭제하고 간단하게 다시 만들기 (기본세팅)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/home.jsp</title>
</head>
<body>
<div class="container">
<h1>인덱스 페이지입니다.</h1>
</div>
</body>
</html>
- 완료하면 java는 1.8 / Spring은 4.0.0 으로 설정되어 있는 것을 볼 수 있다.
- 앞으로 xml 문서를 편집할 일이 많을 것이다.
- 앱이 로딩되어서 어떤 동작을 하는데, 누군가 미리 만들어놓은 어플리케이션을 사용한다면?
- 가져다가 xml 파일에서 용도에 맞게끔 세팅해서 쓰면 어플리케이션에서 제공해주는 어떤 기능을 잘 활용할 수 있다.
ex) TV의 해상도 조절, 사운드 조절과도 같은 것!
- 대표적인 xml문서들.
ex) server.xml, context.xml, web.xml : Tomcat 서버를 세팅해주는 것
- Tomcat 서버 안에 Spring DispatcherServlet이 사용할 준비가 되어 있다.
- DispatcherServlet이 요청을 처리할 컨트롤러를 선택한다.
(컨트롤러는 여러개 있을수있다. 어떤 컨트롤러가 무엇을 처리할지는 DispatcherServlet이 분배한다.)
- 컨트롤러가 처리한 결과를 jsp 에서 받아서 응답한다.
- DispatcherServlet에서도 xml 문서를 제공한다.
- servlet-context.xml 이 spring 핵심이 되는 파일 (spring boot에는 없다)
- 모든 요청이 처음에 DispatcherServlet 를 거치는데,
이 DispatcherServlet의 동작을 바꾸는 xml이 servlet-context.xml 이다.
- 앞으로는 이렇게 두군데에서 주로 작업을 할 것이다.
1) Java Resources (주로 java 파일 생성. dto, dao 등)
2) webapp의 WEB-INF 내부. WEB-INF 안쪽은 클라이언트에게 공개되지는 않는 파일.
- 이 안의 web.xml 에 DispatcherServlet 이 들어있다.
- appServlet이라는 이름은 마음대로 결정할 수 있다.
- 아래 <url-pattern>이 지금 / 로 되어있기 때문에, 모든 요청을 이곳에서 처리한다.
- appServlet에 필기 추가함
ex) 고용노동부 홈페이지는 .do 로 맵핑되어 있다.
- 스프링 프레임워크가 시작되는 시발점이 되는 것이 DispatcherServlet 이고,
servlet-context.xml 파일에서 이것이 어떻게 작동할지를 조정할 수 있다.★★ 꼭 기억하기!
- /standard 로 요청이 들어왔을때 응답하는 페이지 (context 경로. 최상위 페이지)
- DispatcherServlet 을 거쳐서 controller로 들어온다.
- 최상위요청 ( / ) 은 home controller의 home에서 처리하기로 되어 있어서,
요청을 처리하면서 home 메소드를 자동으로 호출하는 것이다.
- 그렇다면 DispatcherServlet 은 HomeController 가 어디에 들어 있는지는 어떻게 알았을까?
- sevlet-context.xml 안을 보면 beans 설정이 있는데. 여기서 HomeController가 이 패키지 안에 있다고 알려준 것이다.
- 이 패키지에서 직접 new를 하고 객체를 관리한다. 스프링 프레임워크의 특징!
- Spring 프레임워크는 필요한 핵심 객체를 직접 생성해서 관리한다.
- standard.cafe 와 같이 하위 패키지로 작성해두어도 알아서 그 하위패키지들도 전부 살펴본다.
** Spring Bean Container의 개념 알아두기!
- com.sy.standard 패키지와 그 하위 패키지를 scan 해서
생성할 객체를 찾아서 직접 생성하고, 그 생성된 객체의 참조값(bean)을 container에서 관리한다.
- 어떤 클래스로 객체를 생성할지 여부는 annotation을 보고 알 수 있다.
- @Controller, @Service, @Repository, @Component 등등의 어노테이션이 붙은 클래스가 있으면
해당 클래스로 객체를 생성해서 bean을 container에서 관리하는 구조이다.
- 괸리란? 필요한 시점에 메소드를 호출하기도 하고, 필요한 곳에 참조값을 직접 넣어주는 일.
- bean (객체) 이 되는 방법에는 두가지 타입이 있는데,
1) HomeController 컴포넌트의 scan을 통해서 bean이 되거나,
2) InternalResourceViewResolver 이라는 xml 파일의 bean 설정을 통해서 bean이 된다.
- 둘 다 spring bean container 안에서 관리되는 것이다.
- " / " 경로 요청이 들어오면 HomeController를 호출하므로 그 안에서 필요한 작업을 하면 된다.
- /WEB-INF/views/home.jsp 페이지로 응답을 위임시키기(forward 이동)
- home 에 접두어, 접미어가 붙으면서 페이지를 이동시킨다.
- 자동으로 이런 포워드 이동이 들어오므로 편하다.
- 예전 java web 프로젝트에서는 이렇게 포워드 이동을 시켰는데,
지금은 포워드 이동할 위치(home)만 전달해주면 알아서 이동한다. 훨씬 편리하다!
- home이 응답한 내용이 브라우저에 나오는 내용이다.
- 만약 응답에 필요한 데이터를 home.jsp에 전달하고 싶다면?
- HttpServletRequest 를 인자로 넣어주면 된다. 쓰는 것만으로도 전달된다.
- request 영역에 noticeList라는 키값으로 String을 담음
- Home.jsp로 포워드 이동시키고, jsp에서는 ${} EL을 사용해서 추출하기
- noticeList라는 키 값으로 담았으니까, 그것으로 가져와서 쓰면 되는 것! (requestScope 생략가능)
- request 영역에 어떤 타입을 어떤 키 값으로 담았는지 기억하고 있다가 jsp 페이지에서 꺼내와서 쓴다.
(여기서는 noticeList라는 키 값으로 List<String> 타입을 담은 것)
- 여기서 Home.jsp 파일에서 우클릭해서 run한다면 404가 나온다. 꼭 프로젝트 폴더에서 우클릭으로 run!
- WEB-INF 안에있는것은 클라이언트에게 응답할 수 없기 때문에 나오지 않는다. 반드시 컨트롤러를 거쳐야 한다.
- 각각의 코드의 연관성을 확인하기!
- 분홍: noticeList 로 담아서 ${ } 에서 꺼내 쓰기
- 빨강: 담은 타입이 List 타입이므로 반복문 돌아야 함
- 주황: List 안의 타입은 String이므로 tmp를 바로 출력 가능
'국비교육(22-23)' 카테고리의 다른 글
50일차(1)/Spring(4) : MyBatis 설치 / DB 데이터 불러오기 (getList) (0) | 2022.12.17 |
---|---|
49일차(2)/Spring(3) : 요청 파라미터 추출 / forward, redirect 이동 / Dependency Injection (0) | 2022.12.15 |
48일차(2)/Spring(1) : java, maven, STS 설치 및 기본 세팅 (1) | 2022.12.15 |
48일차(1)/React(14) : SPA(Single Page Application) 예제(2) (0) | 2022.12.14 |
47일차(2)/React(13) : SPA(Single Page Application) 예제 (0) | 2022.12.13 |