국비교육(22-23)

49일차(1)/Spring(2) : MVC Project 초기 세팅 / Spring 기본 개념 익히기

서리/Seori 2022. 12. 15. 23:11

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를 바로 출력 가능