본문 바로가기

수업 정리

63일차 수업 정리(Spring - MVC패턴)

**MVC(Model View Controller)패턴

    => 애플리케이션의 역할을 3가지로 분리해서 구현하는 패턴

    => Model : 비지니스 로직을 처리하고 결과를 생성하는 영역

    => View : Model이 생성한 결과를 출력하는 영역

    => Controller : Movel과 Viewe를 연결시켜주는 영역

    => Model2 : Presentation 영역의 코드와 Business Logic 영역의 코드를 분리

        - Java Web Application : Presentation Logic은 jsp파일, Business Logic은 java파일에 작성

1. 장점

    => 유지보수가 편리

 

2. 단점

    => 구현이 어려워질수 있음

 

3. Controller를 2단계로 구성하는 경우

  1) FrontController : 클라이언트의 모든 요청을 받아서 처리하려고 하는 Controller

  2) PageController : 클라이언트의 요청 1개나 아니면 하나의 서비스를 처리하기 위한 Controller

 

4. Spring 프로젝트 구조

    => 웹 브라우저나 웹 요청(request) -> Web Server(Apache) -> Web Application Server(Web Container - tomcat)

        -> Front Controller -> PageController -> Service -> DAO -> DataBase Framework -> DataBase

    => Web Server : 사용자의 요청이 오면 요청에 응답할 수 있는 View를 찾아서 리턴하는 역할

        - 단순한 HTML로 구성된 것을 요청하면 HTML을 찾아서 리턴할수 있음

    => Web Application Server : Web Server가 처리 요청시, 수행가능한 Server Application이나 로직을 호출하여 결과

        출력 후 HTML로 변환하여 WebServer에게 전달 

    => 금융업무처럼 온라인 트랜잭션 처리가 잦은 곳에서는 DataBase 앞에 별도의 MiddelWare를 추가

    => 실제 업무 처리에서는 Service를 여러 계층으로 분리

 

**Spring MVC에서 제공하는 Annotation

1. @Controller, @Service, @Repository, @Compmonet : Bean을 자동 생성해주는 Annotation

2. @Autowired, @Injection, @Resource : 외부에서 자동으로 주입받기 위한 Annotation

3. @RequestMapping

    => Controller 클래스에서 클라이언트의 요청과 호출할 메소드를 매핑해주는 Annotation

4. @RequestParam

    => 클라이언트에서 전달한 파라미터를 매핑하기 위한 Annotation

5. @RequestHeader

    => 클라이언트에서 전달한 헤더를 매핑하기 위한 Annotation

6. @PathVariable

    => 디렉토리 패턴에서 URL의 원하는 부분을 추출하기 위해 사용하는 Annotation

7. @CookieValue

    => 쿠키 정보를 매핑하기 위해 사용하는 Annotation

8. @ModelAttribute

    => View에게 데이터를 전달할 때 사용하는 Annotation

    => 공통된 데이터를 전달하기 위한 목적, 전달되는 파라미터의 이름을 변경하기 위해 사용

9. @SessionAttribute

    => Session에게 데이터를 저장하기 위한 Annotation

10. @InitBinder

    => 파라미터를 수집하여 객체로 만들고자 하는 경우 사용하는 Annotation

11. @ResponseBody

    => 리턴 타입을 HTTP 응답 메시지로 사용하는 Annotation

12. @RequestBody

    => 요청 문자열을 그대로 파라미터로 전달하는 Annotation

 

**Spring MVC의 주요 구성 요소

1. Dispatcher-Servlet : FrontController의 역할, Spring Bean Configuration 파일로 생성

2. Controller : Page Controller의 역할, POJO(다른 외부 프레임워크의 클래스를 상속받지 않은 순수 자바 객체) 클래스를 만들고 상단에 @Controller라는 어노테이션을 추가하여 생성

3. HandlerMapping : Front Controller에서 Page Controller를 선택하도록 해주는 클래스로 직접 생성할 필요가 없음(Sping이 생성)

4. ModelAndView : Controller가 처리한 결과를 저장하여 뷰를 선택하도록하는 정보와 함께 저장하는 클래스

    => 최근에는 잘 사용하지 않음

5. View Resolver: Controller가 리턴한 View이름을 가지고 실제 출력할 View 파일을 결정하는 클래스

    => Forwarding 시만 적용되고 Redirect시는 비적용

6. View : 실제 출력될 결과 화면

 

**Spring MVC Project

1. Spring MVC Project 생성

[File] - [New] - [Spring Project] - [Spring Lagacy Project]를 선택하고 [Spring MVC Project]를 선택

    => Project이름을 설정하고 기본패키지(3Level 이상)를 설정

        - 패키지 이름에서 3번째 부분이 자동으로 Context Path로 설정되고 이 프로젝트를 war 파일로 작성

        - 외부에서 열면 그때는 프로젝트 명이 Context Path로 설정

 

2. Spring MVC Project 실행

    => WAS를 설정하여 실행

 

**Spring MVC Project의 pom.xml 설정 변경

1. properties 태그에서 java버전과 Spring버전을 설정

    => properties는 하단에서 자주 사용할 문자열의 이름을 등록해놓은 태그

    => java version은 1.8이상으로 설정 : 람다와 스트림 API를 1.8버전 부터 사용가능

    => Spring version은 4버전이상으로 설정하는 것이 일반적 : Spring 4 부터 RestController를 제공

        - REST API : 동일한 서비스를 제공하는 URL은 모두 동일해야 함. 요청시 JSON이나 XML로 응답하여 클라이언트

          에서 파싱하여 뷰를 만들어내는 방식

<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
	<org.aspectj-version>1.6.10</org.aspectj-version>
	<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

 

2. repositories

    => Maven 중앙저장소가 아닌곳에서 외부 라이브러리를 다운로드 받고자 하는 경우 설정하는 태그

    => Oracle을 사용할 때만 우리는 사용

    => 기업에서는 기업별로 별도의 저장소가 만들어져 있고 그 곳을 설정

 

3. dependecies

    => 사용할 외부 라이브러리의 의존성(외부라이브러리를 다운받고 자동으로 build path에 추가)을 설정

    => node.js나 최근의 프레임워크들은 대부분 이방식을 이용하여 외부 라이브러리의 의존성을 결정

    => junit의 버전을 4.12이상으로 변경 - Spring 5.0이상에서는 junit이 4.12 이상인 경우에만 Test 가능

        - junit : 단위테스트를 지원하는 자바 라이블러리

  1) 단위테스트를 수행하려면 Spring-Test 라이브러리가 있어야 함

    => Spring-test라이브러리의 의존성을 추가

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

  2) HttpServlet 과 jsp 버전을 변경
    => HttpServlet: JavaEE에서 제공하는 URL 요청에 응답할 수 있는 Java Class, WAS 가 호출할 수 있는 클래스

    => JSP(Java Server Pages): HttpServlet 에 출력을 쉽게 할 수 있도록 만든 클래스, HTML 에 Java 코드를 스크립트 형

        태로 삽입, 작성하는 것으로 요청시 HttpServlet 클래스로 변환

<!-- Servlet -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
</dependency>
<dependency>
	<groupId>javax.servlet.jsp</groupId>
	<artifactId>javax.servlet.jsp-api</artifactId>
	<version>2.3.0</version>
</dependency>

 

4. build 태그 안의 configuration에서 source와 target 변경

<configuration>
   <source>1.8</source>
   <target>1.8</target>
   <compilerArgument>-Xlint:all</compilerArgument>
   <showWarnings>true</showWarnings>
   <showDeprecation>true</showDeprecation>
</configuration>

 

5. 실행

 

6. Project를 진행 할 때는 1~4까지는 직접 수행하지 않음

    => Spring MVC Project는 대부분 여러 개발자가 같이 진행하므로 한명이 모든 프로젝트 설정을 하고 설정에 대하여 설명한 후 동일한 설정에서 작업을 진행

 

7. 톰캣을 이용해서 실행한 경우 포트문제 때문에 실행이 안될 때

    => 오라클과 톰캣 모두 기본 설정 포트가 8080이라서 문제가 됨

        - Server 디렉토리에서 Server.xml파일을 열어서 8080외의 다른 포트로 변경

    => 포트번호가 음수로 설정된 경우

<Server port="8005" shutdown="SHUTDOWN"> 이 태그에 port 번호가 -1로 설정된 경우 8005번으로 변경

 

**Spring MVC Project의 구조

1. pom.xml(maven 설정파일)을 제일 먼저 읽어서 실행

    => 이 파일의 내용이 잘못되면 애플리케이션은 실행되지 않음

    => pom.xml을 수정하면 저장후 애플리케이션을 다시 실행하여 잘못된 부분이 있는지 확인

 

2. web.xml(Java web application 설정파일)을 읽어서 애플리케이션 설정

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
	
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

    => listener : 애플리케이션 시작, 종료될때 또는 세션이 생성, 소멸등의 이벤트 발생시 호출될 클래스를 설정

        - 이벤트 발생시 호출되는 객체를 Listener라고 함

    => spring mvc project에서 listener 설정만 있는 경우 applicationContext.xml 파일이 Listener 역할을 수행

    => context-param 태그를 이용하여 applicationContext.xml 파일의 경로를 변경 할 수 있음

        - contextConfiguration이라는 이름에 파일경로를 설정하면 됨

    => 이 파일에는 공통으로 사용할 bean에 대한 정보를 설정

<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>

    => servlet-mapping에서는 요청을 처리할 HttpServlet클래스를 설정

        - /는 .jsp를 제외한 모든 요청

    => Spring의 DispatcherServlet은 Front-Controller의 역할 수행

        - 그 안에 있는 init-param이 DispatcherServlet의 설정 내용을 가지는 파일의 경로를 설정

 

3. URL 패턴

  1) /* : 모든 요청에 해당하는 패턴, 이 패턴은 파라미터 인코딩 설정에 이용

  2) / : .jsp를 제외한 모든 요청을 처리

    => 1)과 2)로 설정시 .js, .css, .png와 같은 리소스 요청도 전부 처리하려고 함

        - 외부에 자원을 두지 않고 프로젝트 내의 자원을 사용하는 경우 이에대한 해결책을 설정해야 함

  3) *.확장자 : 특정한 확장자로 끝나는 요청을 처리, 이전에는 확장자를 do로 많이 처리

    => 공공기관이나 Naver등에서 사용중

  4) /디렉토리/ : 특정 디렉토리가 포함된 요청을 처리

    => 최근 '/서비스명/'로 작성후, 뒤에 작업내용을 설정하는 형태로 서비스를 구현하는 곳이 많음

  5) /디렉토리/요청경로 : 구체적으로 하나의 요청을 지정(거의 사용하지 않음)

 

4. Encoding Filter 설정

    => post 방식으로 전송된 파라미터는 인코딩 해서 읽어야 함

        - 미 인코딩시 한글이 깨짐

    => java web programming

        - 파라미터 읽기 전 HttpServletRequest 객체를 가지고 setCharacterEncoding("utf-8") 메소드 호출

    => spring mvc project : web.xml 파일에 Filter를 설정, 모든 요청을 처리하기 전에 위의 메소드를 호출하도록 설정

 

**Controller

    => MVC Controller : 요청을 받아 필요한 Business Logic(Service)를 호출하고 그 결과를 받아 View에 전달하는 객체

    => Java Web Programming : HttpServlet 클래스로 생성

         Spring MVC Project : POJO 클래스 제작 후, 상단에 @Controller를 추가하여 생성

        - @Controller가 추가된 클래스는 Spring 설정파일의 Base Package 안에 만들어져야 함

1. 요청 처리 방법

    => Controller 안에 메소드를 생성하고 위에 @RequestMapping(value="요청URL",method=RequestMethod.GET or

        POST)를 추가해 주면 URL 요청이 GET이나 POST로 왔을 때 메소드를 호출

    => 요청방식에 상관없이 호출할 경우 @RequestMapping("요청할 URL")의 형식으로 설정하는 것도 가능

    => 여러개의 요청을 한꺼번에 처리하고자 하면 value={URL, URL...}으로 설정

 

2. 파라미터 처리방법

    => 기존의 HttpServletRequest 클래스를 이용

        - getParameter나 getParameterValues 메소드를 호출하여 처리

        - 요청처리 메소드(HttpServletRequest request){  int num = Integer.parseInt(request.getParameter("num"));  }

    => @RequestParam을 이용

        - @RequestParam("파라미터명") 자료형 변수명

        - 자료형 변환이 자동으로 이루어짐

        - 요청처리 메소드(@RequestParam("num") int num){  }

    => Command 객체를 이용

        - 파라미터로 구성된 Class제작 후, 클래스 변수를 매개변수로 받으면 파라미터가 Command 프로퍼티에 자동대입

        - 파라미터의 이름과 프로퍼티의 이름이 같아야 함

 

3. 파라미터 처리 실습

  1) home.jsp 파일에 링크를 추가

    => 기존 home.jsp 파일을 삭제하고 재 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC 실습</title>
</head>
<body>
	<a href="">파라미터 입력</a>
</body>
</html>

 

  2) HomeController 클래스에 form요청이 Get으로 왔을 때 처리하는 메소드를 생성

//form 요청을 GET으로 전송했을 때 처리할 메소드
@RequestMapping(value="form", method=RequestMethod.GET)
public String form() {
	//단순 페이지 이동은 jsp 파일의 이름만 리턴하면 됨
	return "form";
}

 

  3) WEB-INF/views 디렉토리에 form.jsp파일을 만들고 작성

    => 웹 사이트만 만드는 경우에는 form을 만들고 전송 버튼을 만들어 전송하면 됨

        - 모든 디바이스 요청을 처리하는 서버를 만들경우 ajax로 요청해야 함

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 전송</title>
</head>
<body>
	<!-- action은 생략하면 이 페이지에 오게된 요청 : form
	method는 생략하면 get
	enctype은 file이 있을 때만 multipart/form-data를 설정 -->
	<form id="paramform" method="post">
		이름 :<input type="text" name="name" id="name"/><br/>
		전화번호 :<input type="text" name="phone" id="phone"/><br/>
		나이 :<input type="text" name="age" id="age"/><br/>
		<!-- 비권장(버튼으로 처리) -->
		<input type="submit" value="전송" />
		<!-- 권장(ajax로 처리) -->
		<input type="button" value="전송" id="ajaxbtn"/>
	</form>
</body>
</html>

 

  4) 애플리케이션을 실행해서 입력화면까지 이동하는 지 확인

 

  5) formController 클래스에 form요청을 post로 전송한 경우 처리할 메소드 작성

@RequestMapping(value="form", method=RequestMethod.POST)
//기존의 HttpServletRequest를 이용한 파라미터 처리를 위한 메소드
public String form(HttpServletRequest request) {
	String name = request.getParameter("name");
	String phone = request.getParameter("phone");
	String age = request.getParameter("age");
		
	//출력
	System.out.println("이름 : " + name);
	System.out.println("전화번호 : " + phone);
	System.out.println("나이 : " + age);
	
	return "result";
}

 

  6) 위의 요청 처리 메소드 수정

@RequestMapping(value="form", method = RequestMethod.POST)
	//@RequestParam을 이용한 파라미터 처리를 위한 메소드
	//Spring에서 파라미터 처리를 할 때 많이 사용하는 방법
	//동일한 이름의 파라미터가 여러 개 있으면 List 나 배열로 받는 것도 가능
	public String form(
			@RequestParam("name") String name,
			@RequestParam("phone") String phone,
			@RequestParam("age") int age) {
		//출력
		System.out.println("이름:" + name);
		System.out.println("전화번호:" + phone);
		System.out.println("나이:" + age);
		
		return "result";
	}

  7) command 객체를 이용하는 방법

    => name, phone, age를 저장할 수 있는 Command Class를 생성
    => 자료형과 이름을 잘 맞춰야 함

package com.pk.mvc.domain;

public class User {
	private String name;
	private String phone;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "User [name=" + name + ", phone=" + phone + ", age=" + age + "]";
	}
}

    => 요청 처리 메소드를 수정

@RequestMapping(value="form", method = RequestMethod.POST)
//Command 객체를 이용하는 방법
public String form(User user) {
	//출력
	System.out.println(user);
	return "result";
}

 

4. @PathVariable

    => 최근의 상세보기 구현에서는 파라미터를 사용하지 않는 경우가 있음

    => 디렉토리 패턴에서 사용하는데 /데이터의 형식으로 넘겨줌

    => 블로그 형 게시판에서 많이 사용

 

    => Spring의 Controller에서 마지막 부분을 읽어내고자 할때 사용하는 어노테이션이 @PathVariable

    https://ggangpae1.tistory.com/286?category=840479

    => @RequsetMapping(value="{num}")

         요청처리메소드(@PathVariable("num") int num)

    http://www.bloter.net/archives/394057

    => @RequsetMapping(value="achives/{num}")

         요청처리메소드(@PathVariable("num") int num)

 

5. PathVariable 실습

  1) home.jsp 파일에 요청을 생성

    <a href="detail/170">Path Variable</a><br/>

  2) HomeController 클래스에 위의 요청을 처리하는 메소드를 생성

@RequestMapping(value="detail/{num}", method = RequestMethod.GET)
//경로를 변수로 이용하고자 할 때 읽어내는 방법 : 최근의 블로그형 게시판에 이용
public String detail(@PathVariable("num") int num) {
	//출력
	System.out.println(num);
	return "result";
}

 

6. ModelAttribute
    => Controller 클래스 메소드에 어노테이션을 설정하고 메소드가 리턴시, 리턴되는 데이터가 모든 View에 전송

@ModelAttribute("msg")
public String result(){
	return "Hello Common String";
}

    => 이 메소드가 있는 Controller의 모든 View에게는 msg 라는 이름으로 Hello Common String이 attribute로 전달

    => Command 객체로 파라미터를 받으면 Command 객체로 받은 내용이 다음 View에게 클래스 이름의 첫글자를 소

        문자로 변경한 것으로 전송

        - 이름을 변경해서 넘기려면 Command 객체 앞에 @ModelAttribute("별명") 클래스 변수명의 형태로 받으면 됨
    => Command 객체: 파라미터들을 묶어서 전송받기 위한 클래스의 객체 Spring에서 유효성 검사 할 때 유용
    => 유효성 검사시, 서버에서 유효성 검사를 한 경우 검사 실패시 Spring에서는 Command 객체를 이용해서 해결

 

7. InitBinder

    => 메소드 위에 @InitBinder를 추가하고 데이터 형식을 설정하면 형식에 맞는 데이터가 오면 자동 변환

@InitBinder
public void initBinder(WebDataBinder binder){
	SimpleDateFormat sdf = new SimpleDateFormat("날짜 형식");
	Biner.registerCustomEditor(java.util.Date.class, new CustomDateEditor(sdf, false));
}

    => 날짜 형식의 문자열이 오면 java.util.Date 형식으로 변환

 

8. @DateTimeFormat

    => Command 객체 클래스 제작시 Date 타입이 있는 경우 Date 타입위에 @DateTimeFormat(pattern="날짜형식")으

        로 설정하면 날짜 형식의 문자열이 오면 Date 타입으로 변경

 

9. Controller 요청 처리 메소드의 매개변수

    => Java Web Application HttpServlet의 처리 메소드는 HttpServletRequest, HttpServletResponse 매개변수를 가짐

    => Spring에서는 요청처리 메소드의 매개변수를 다양한 형태로 만들수 있음

  1) HttpServletRequest, HttpServletResponse 사용 가능

  2) HttpSession 사용 가능

  3) Locale : 현재 요청에 대한 지역(국가 설정) 정보

  4) Reader, Writer : 읽고 쓰기를 스트림을 이용해서 직접 하고자 할 때 사용

  5) Map, Model, ModelMap : View 페이지에 데이터를 전송하고자 할 때 사용

  6) @RequestParam, @RequestHeader

    => 파라미터나 헤더 정보를 받고자 할 때 사용

    => @RequestHeader는 OpenAPI서버를 직접 구현하고자 할 때 사용

  7) @CookieValue

    => 쿠키값을 읽어내고자 할 때 사용

    => 보안 문제로 사용하지 않는 것을 권장했다가 최근 사용자의 요청 흐름 파악에 쿠키를 이용하는 경우가 많아짐

  8) @PathVariable

    => URL에 변수를 추가한 형태일때 변수를 읽기 위한 파라미터

  9) Errors, BindResult : 데이터 유효성 검사를 할 때 사용

  10) Command 객체

  11) @RedirectAttributes : 리다이렉트 할 때 1번만 전달되는 데이터를 생성할 때 사용

      (ex - 로그인에 성공하였습니다. 회원가입에 성공하였습니다.등 메시지 출력)

 

10. Controller의 요청 처리 메소드의 리턴 타입

  1) ModelAndView : 출력할 View이름과 출력할 데이터를 1개로 묶어주는 클래스

  2) Model, Map : 출력할 데이터만 생성해서 리턴, 뷰이름은 요청 URL로 설정

  3) String : 뷰 이름을 리턴, 출력할 데이터가 있으면 메소드의 매개변수로 Map이나 Model을 만들어서 저장

  4) View : View를 직접 만들어서 출력 - 파일 다운로드 같은 곳에서 이용

  5) void : 요청과 동일한 이름의 뷰로 출력할 때 사용 - 단순 페이지 이동에 사용

  6) VO나 DTO 또는 List : JSON출력하고자 하는 경우 사용

  7) HttpHeaders : 단순하게 헤더만 만들어서 전송하고자 할때 사용 - API 요청이 실패했을 때

  8) ResponseEntity : Http 헤더와 내용을 가공하고자 할 때 사용

    => 3, 5, 6번이 초반에는 중요

 

11. View 설정

    => 출력할 뷰는 Controller에서 리턴한 문자열과 ViewResolver 설정을 합쳐서 결정

    => 기본 이동방법은 Forwarding

    => ViewResolver 설정은 appServlet 디렉토리에 있는 spring 설정 파일에 존재

<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>

    => 시작 요청의 경우 /이외에 index.html, default.html 까지 처리해 주는 것이 일반적

    => redirect를 하고자 하는 경우 view이름앞에 redirec: 를 추가

    => redirect를 하게 되면 ViewResolver와 관계없이 동작

        - redirect를 사용할 때는 외부 도메인으로 가던가 Controller로 다시 돌아오도록 해야 함

        - redirect 할때 특정 View페이지로 직접 이동하지 않도록 해야 함

    => redirect 하는 경우는 작업을 수행한 경우이고, forwarding하는 경우는 조회를 하는 경우

    => 웹 페이지를 만드는 것이 아니라면 전부 forwarding

        - iOS, Android, WebBrowser 요청을 하나의 서버에서 하려면 뷰를 보여주는 것이 아니고 데이터를 리턴하는 경우

        - Web Browser에서는 전부 ajax로 요청하고, javascript 코드를 이용해서 페이지 이동을 해야 함

    => 웹 애플리케이션을 기획할 때

        - 하나의 서버 애플리케이션으로 모두 지원할경우 AJAX요청을 잘 이해해야 함

        - 웹 사이트, 모바일서버를 별도로 만들 경우 AJAX는 유효성 검사만 할수 있으면 됨

 

12. Controller에서 View에게 데이터 전달 : Attribute

  1) Model, Map을 요청처리 메소드의 매개변수로 만들고, 데이터 저장시 request의 attribute로 만들어 져서 전달

  2) 리턴 타입을 ModelAndView로 만들어서 데이터를 저장하고 리턴시 request의 attribute로 만들어져 전달

  3) @ModelAttribute가 붙은 데이터도 View에 전달됨

  4) Command 객체

  5) session에 저장하는 방법

    => HttpSession을 생성해서 저장

    => RedirectAttribute를 이용해서 한번만 사용하는 데이터를 생성해서 전달

 

**수업 외 정보

1. 컴파일 하는 언어의 실행과정

    => 소스코드 -> Compile(문법체크) -> 실행되기 직전의 코드(자바 : ByteCode) -> build(앱이 실행할수 있도록 각 운

       영체제의 start up 코드나 실행되기 직전의 코드를 모아서 실행가능한 프로그램으로 생성 - target version 설정) ->

        Load(메모리에 적재) -> run(실행)

 

    => 컴파일 언어의 IDE들은 대부분 코드를 수정하고 새로 만들면 자신이 컴파일하여 문법적 오류를 체크

    => Server 애플리케이션은 하나의 Computer에서 실행되기 때문에 이행하지 않으면 그다지 중요치 않음

 

2. 스크립트 언어

    => 줄단위로 번역하면서 실행

    => 문법적인 에러체크를 하지 않고 실행하면서 에러를 밝생시킴

    => JavaScript, Python, Kotlin, Swift등

 

3. Cashing

    => 재사용을 빠르게 하기 위해서 로컬에 저장해 두는 것

 

**Filter - spring에서는 Interceptor, AOP

(AOP : 관점지향 프로그래밍 - 작업의 종류에 따라 프로그래밍 분리 - 비지니스 로직처리와 공통관심 사항으로 분리)

    => 요청을 처리하기 전에 수행할 작업이나, 처리 후 수행할 작업을 설정하는 객체(실제 만드는 것은 클래스)

        - IoC(제어의 역전) : 개발자 - 클래스를 만들어 비지니스 로직만 작성, 관리작업은 프레임워크나 컨테이너가 수행

    => Filter를 가지고 작업시, 결과를 내가 원하는 자료형으로 변경하는 Filter를 만드는 것을 Wrapper라고 부름

 

**Web에서 요청을 전송하는 방식

1. GET

    => 파라미터를 URL 뒤에 붙여서 전송하는 방식

    => 보안이 취약하고 보내는 파라미터 크기에 제한이 있음

    => 요청을 전송하는 기본 방식

 

2. POST

    => 파라미터를 Header에 숨겨서 전송하는 방식

    => 보안이 우수하고 파라미터 크기에 제한이 없음

    => form에 post라고 설정하거나 ajax요청시 post라고 설정해야 함

 

**파라미터 생성

    => parameter : 웹에서 요청 전송시 서버에게 전달하는 데이터

1. URL뒤에 ?를 추가하고 파라미터명=값, 파라미터명=값...의 형태로 직접 작성 가능

    => 이 경우 무조건 GET방식으로 전송되는데 목록보기에서 상세보기를 만들때 많이 사용됨

2. form을 만들고 내부에 입력가능한 객체를 생성하여 전송하는 방법

    => 전송할 객체들을 name속성에 서버에서 이용할 이름을 생성해야 함

    => 전송방식으로 GET, POST로 설정하는 것이 가능

    => input에 file, password, textarea 태그가 있으면 반드시 전송방식은 post

    => file이 있는 경우 enctype를 multipart/form-data로 설정

 

 

면접 - Ioc, AOP, POZO