JAVA

스프링부트 배우기 전에 알아야할 기본 지식

@RestController와 @Controller

의존성 주입(DI)을 할 수 없는 어노테이션(Annotation)으로 디스패쳐 서블릿에서 관리하는 영역이다. 디스패쳐 서블릿이 사용자로부터 URI요청을 받아 파싱하여 엔드포인트를 추출해 이를 IoC 컨트롤러에서 @RestController와 @Controller를 찾아 메서드를 호출한다.

@RestController : 데이터를 리턴한다.

@Controller : 파일을 리턴한다. (viewResolver가 관여한다)

  1. http://localhost:8080/home 호출한다.
  2. 디스패쳐 서블릿이 ‘/home’ 파싱한다.
  3. IoC 컨테이너에 @RestController, @Controoler로 생성된 객체만 찾는다
  4. 메서드를호출시킨다.

의존성 주입(DI : Dependency Injection)
생성자(Constructor)가 IoC 컨테이너에 접근하는 것, 생성자에 타입이 있을 경우 Ioc 컨테이너에서 타입을 찾아낸다. 의존성 주입을 할 수 없다는 말은 즉 개발자가 접근할 수 없다는 것과 같다.

파싱(Parsing)
어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것을 말한다.

엔드포인트
단어의 뜻 그대로 끝점을 의미한다. 현재 우리가 사용하는 대부분의 전자기기들은 네트워크에 연결되어 있는데, 이 네트워크로 연결되어 있는 최종 장치가 엔드포인트가 된다

viewResolver

스프링 프레임워크에 포함되어 있는 클래스로 @Controller 를 읽어서src/main/resources/templates(prefix)와 .mustache(suffix) 사이에 templates에서 만든 .mustache 파일을 자동 호출해준다.

예제 프로젝트 보기

spring

FrontController.java 파일
package com.cos.viewapp.web;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

//RestController 데이터를 리턴한다.
//Controller 파일을 리턴한다.

@Controller
public class FrontController {
		
		//http://localhost:8080/home 
		//디스패쳐 서블릿이 /home 파싱
		//IoC 컨테이너에 @RestController, @Controoler로 생성된 객체만 찾는다.
		//메서드를 호출 시킨다.
		
		@GetMapping("/home")
		public String home(Model model) { //request == model 
			//ViewResolver 클래스 
			//src/main/resources/templates(prefix)
			//home <- 사이에 넣어준다.
			//.mustache(suffix)
			
			String name = "최다혜";
			model.addAttribute("name", name);
			
			List<Board> boards = new ArrayList<>();
			boards.add(new Board(1,"제목1"));
			boards.add(new Board(2,"제목3"));
			
			model.addAttribute("boards",boards);
			
			return "home"; //RequestDispatcher가 자동 작성 (home.mustache가 아니라 home이라고 주소창에 적힘)
	}
	

}

 

Board.java 파일
package com.cos.viewapp.web;

public class Board {
	
	//Field
	private int id;
	private String title;
	
	//Constructor
	public Board(int id, String title) {
		super();
		this.id = id;
		this.title = title;
	}

	//Getter and Setter
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}
	
	
	
}

 

home.mustache 파일
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>home.mustache File</h1>
{{name}}
<hr/>
{{#boards}}
<h3>{{id}}</h3>    
<h3>{{title}}</h3>
{{/boards}}
</body>
</html>

//파일 만들때 html 파일로 만들었다가 확장자를 .mustache로 변경함

 

템플릿 엔진(Template Engine)

템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어(또는 소프트웨어 컴포넌트)를 말한다. 즉, html에 다른 언어 코드(Java, C#…)를 합성할 수 있다. 템플릿 엔진의 종류로는 jsp, Mmustache(머스태치), Thymleaf(타임리프) 등이 있다.

 

결과화면
result

<form> 전송 방식

http의 전송방식에는 Get, Post, Put, Delete 네 가지가 있는데 <form> 태그에서는 Get 방식과 Post 방식의 Method를 제공한다. 각각 DB에서의 select, insert, update, delete와 같은 기능을 한다.

Method DB
Get select
Post insert
Put update
Delete delete

? 뒤에 오는 부분을 쿼리스트링(Query String)이라고 부르는데 Get 방에서는 이 부분이 구체적이어야 한다. 그 이유는 Get 방식으로 전달할 수 있는 데이터 크기가 256byte로 제한되어 있기 때문이다. 하지만 예외로 로그인은 Get 방식 요청이 필요한 기능이지만 전송되는 데이터를 감추기 위해 Post 방식을 사용한다.

insert와 update에서는 BufferedWriter가 필요하다.

마인타입(Mine Type)

마인타입(Mine Type)이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘으로 개발자가 객체의 역직열화를 하는 경우 확인해야할 중요한 부분이다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

직열화
객체의 데이터를 연속적인 데이터로 변형하여 스트림(Stream)을 통해 데이터를 읽도록 하는 것을 의미한다.

역직열화
직열화된 파일 등을 역으로 직열화 하여 다시 객체의 형태로 만드는 것을 의미한다. 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원한다.

클라이언트가 보내는 데이터 타입과 서버가 받는 데이터 타입이 달라도 받을 수 있습니다. 하지만 서버에서 데이터를 받을때 개발자가 별도로 타입을 정해서 파싱을 하는 경우, 데이터 타입이 변화에 대처할 수 없어 프로그램이 돌아가지 않게 됩니다. 그러므로 개발자가 파싱을 할 경우에는 컨텐트 타입을 확인해야 차후 문제가 생기지 않습니다.
최신글