* 지난 주 훈련내역
1) Quartz 완료
2) 이클립스에 스프링 설치
3) Maven 기반 스프링 MVC 프로젝트 생성 연습 (10회이상)
4) 스프링 MVC 프로젝트의 기본 설정에 대한 이해
=> pom.xml, web.xml, log4j2.xml, root-context.xml, servlet-context.xml
5) 스프링 기본 설정 완료 및 설정 테스트 수행완료
가. HikariCP 데이터소스 빈 설정 (root-context.xml)
나. MyBatis Pooled 데이터소스 빈 설정 (root-context.xml)
다. MyBatis SqlSessionFactory 빈 설정 (root-context.xml)
라. web.xml에 스프링 설정 추가(DispatcherServlet에 예외 발생 초기화 파라미터 추가 및 CharacterEncodingFilter 추가)
6) MyBatis - Spring 연동 라이브러리 설정 및 연동방법 실습완료
가. SqlSessionFactory 빈 주입 방법
나. 주입 받은 SqlSessionFactory 빈을 통한 MyBatis Mapper XML 및 Mapper Interface 사용방법 실습
특히 MyBatis Mapper Interface의 '자동실행규칙'의 이해 및 실습완료
* 이번 주 훈련내역 (스프링 MVC에 대한 중요개념 이해 및 실습주간)
1) 스프링 프레임워크의 양대 기둥인 DI와 AOP에서 DI에 대한 이해 및 실습 완료
2) 스프링 MVC 컨트롤러 작성방법 이해 및 실습 완료
=> 특히 request Mapping Table 작성법 및 이해/실습 => 그 다음 Final Project 가이드 기반
3) 스프링 MVC 예외처리 메커니즘 이해 및 실습완료
4) 스프링 MVC 파일 업로드 이해 및 실습 완료
* 이것이 자바다 1권 API 이 부분 제발 좀 보세요오~!
---
MVC 패턴에서 스프링 컨트롤러 만드는 10 ~ 15개의 예제를 해보자
MVC 패턴 = Model 2 Architetcure => 스프링으로 구현할 대상!!!
그렇다면 Model 1 Architectured은 뭐지?
* Model 1 Architecture :
한 개의 Request를 한 개의 Servlet이나 Jsp가 모두 처리해서 응답, 전송하는 설계방식
ex)
public class XXXServlet extends HttpServlet {
protected ... service (req, res) {
// 1~4까지의 단계의 흐름을 제어 => Controller
// 1. 전송 파라미터 수집
// 2. 요청식별
// 3. 핵심 비지니스 로직 처리 => Model
// 4. 발생 데이터 이용해 화면제작 => View
}
} // end class
하나의 Servlet/Jsp 에서 다 처리하는 이런 방식은 효율성이 떨어진다!
역할을 나눠서 Controller 따로, Model 따로, View 따로 빼서 만들어보자
* Model 2 Architecture (MVC 패턴) :
한 개의 요청이 들어왔을 때,
1) Controller (요청 ~ 응답이 나가기까지의 전체 처리 흐름을 제어하는 역할)
2) Model (핵심 비지니스 로직을 수행하고 그 수행결과 데이터를 발생하는 역할)
3) View (2의 Model을 이용해서 출력화면을 만드는 역할)
위와 같이 MVC 패턴에 따라 나눠도 안 쓰면 도루묵! => MVC 패턴을 무조건 따르도록 강제!
어떻게 강제할까? => Spring MVC Framework 사용
---


-> 우리는 XML 방식으로 한다! (자바 방식은 지금 하기엔 어렵다)
웹 프로젝트의 구조
스프링을 실행하는 존재
ApplicationContext => WebApplicationContext
같이 연동되는 방식으로 동작하기 때문에 설정을 분리해도 통합해서 사용가능
---
스프링 MVC의 기본 사상
서블릿 기반이긴 하지만 한 단계 더 추상화된 수준의 개발 지향
서블릿 API없이도 개발이 가능한 수준

---
모델2 방식과 스프링 MVC

Model 은 스프링이 제공
Controller는 우리가 만든다 10~15가지 방식
View는 JSP
---
스프링 MVC의 기본 흐름

하얀 박스가 우리가 만드는 부분
---
Controller
HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능 (Controller는 POJO임)
@Controller
해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
<component-scan>과 같이 활용
@RequestMapping
특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리
---
chap06
// 기본적으로 Spring Beans Container에 등록될 클래스는 자바빈즈 규약을 지키는 자바빈즈 클래스이다.
@Log4j2
@NoArgsConstructor
// Base URI 선언
@RequestMapping("/board/") // => 상세 URI : { "/doA","/doB", "/doC", "/iambabo" }
@Controller // 현재의 클래스의 역할 : Controller 정의
public class SampleController {
// 컨트롤러에 선언되는 메소드 => 컨트롤러의 핸들러 메소드라고 부름
// 무엇을 핸들링 하는가? => 특정 request를 처리한다는(handling) 의미
// 1) 어떤 전송방식(HTTP Method)과 2) 어떤 Request URI를 가지고 들어온 Request를 처리하겠다라는 의미
// 위의 2가지 정보를 설정하는 어노테이션이 @RequestMapping임
@RequestMapping(
path = { "/doA","/doB", "/doC", "/iambabo" }, // Base URI와 조합된 /board/doA가 최종 URI
method = { RequestMethod.GET, RequestMethod.POST } // method 속성 생략시 모든 전송방식을 의미
)
public void doA() {
log.trace("doA() invoked.");
} // doA
} // end class
SampleController.java
// 기본적으로 Spring Beans Container에 등록될 클래스는 자바빈즈 규약을 지키는 자바빈즈 클래스이다.
@Log4j2
@NoArgsConstructor
@RequestMapping("/board/") // Base URI
@Controller // 현재의 클래스의 역할 : Controller 정의
public class SampleController2 {
// 1. @RequestMapping or @RequestMapping("")
@RequestMapping("") // Request URI == Base URI + Detail URI => "/board/*" + "" => /board/
// @RequestMapping // 상동
public void basic() {
log.trace("basic() invoked.");
// Return 타입이 void일 때 반환되는 뷰의 이름은 Request URI
} // basic
// 2. @RequestMapping(path, method)
@RequestMapping(
path = { "/basicGet" }, // 값이 하나면 배열 기호인 중괄호 삭제 가능
method = { RequestMethod.GET } // 값이 하나면 배열 기호인 중괄호 삭제 가능
)
public void basicGet() {
log.trace("basicGet() invoked.");
// Return 타입이 void일 때 반환되는 뷰의 이름은 Request URI
} // basicGet
// 3. @RequestMapping(path, method)
@RequestMapping(
path = "/basicGetPost",
method = { RequestMethod.GET, RequestMethod.POST }) // Get방식, Post방식 둘다 가능!
public void basicGetPost() {
log.trace("basicGetPost() invoked.");
} // basicGetPost
// 4. @GetMapping(path)
// @RequestMapping (path = "/basicOnlyGet", method=RequestMethod.GET )
@GetMapping("/basicOnlyGet") // 이 어노테이션은 위와 동일함
public void basicOnlyGet() {
log.trace("basicOnlyGet() invoked.");
} // basicOnlyGet
// 5. @PostMapping(path)
// @RequestMapping (path = "/basicOnlyPost", method=RequestMethod.POST )
@PostMapping("/basicOnlyPost") // 이 어노테이션은 위와 동일함
public void basicOnlyPost() {
log.trace("basicOnlyPost() invoked.");
} // basicOnlyPost
// 6. @GetMapping(path) with DTO parameter
// 컨트롤러의 핸들러는 아래의 역할 및 값을 반환 :
// 1) 역할 : 요청을 위임받아 처리
// 2) 뷰의 이름을 봔환
// 3) 역할에 따라 요청을 위임처리한 결과 Model(비지니스 데이터)을 생성 및 View로 전송
@GetMapping("/ex01")
public String ex01() {
log.trace("ex01() invoked.");
// servlet-context.xml에서 설정한 View Resolver Configuration에 의해
// Prefix + ViewName + Suffix = /WEB-INF/views/ + ex01 + .jsp = /WEB-INF/views/ex01.jsp
return "ex01"; // MVC 패턴에서 View의 이름
} // ex01
} // end class
SampleController2.java
<html>
<head>
<title>ex01</title>
</head>
<body>
<h1>/WEB-INF/views/ex01.jsp</h1>
<hr>
</body>
</html>
WEB-INF/views/ex01.jsp
WEB-INF/views/board.jsp
WEB-INF/views/board/basicGet.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
이거는 안 써도 된다! 왜?!
web.xml에
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>utf8</page-encoding>
<include-prelude>/WEB-INF/views/include.jsp</include-prelude>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
<default-content-type>text/html; charset=utf8</default-content-type>
</jsp-property-group>
</jsp-config>
이거 설정해놨기 때문
'국비학원' 카테고리의 다른 글
| [국비지원] KH 정보교육원 100일차 (0) | 2022.08.19 |
|---|---|
| [국비지원] KH 정보교육원 99일차 (0) | 2022.08.18 |
| [국비지원] KH 정보교육원 97일차 (0) | 2022.08.16 |
| [국비지원] KH 정보교육원 96일차 (0) | 2022.08.12 |
| [국비지원] KH 정보교육원 95일차 (0) | 2022.08.11 |