본문 바로가기
포토그램

[Chapter 2] 스프링부트 Cortroller

by yukuda 2024. 2. 22.
728x90

10. 기본 동작방식 이해하기

컨트롤러란? (FrontContreller와 Dispatcher)

1) 요청을 할 때마다 Java 파일이 호출된다.

2) 요청의 종류가 3개이면 3개의 Java 파일이 필요하다.

3) 하나의 Java 파일에서 모든 요청을 받는 FrontController 사용.

4) 너무 많은 요청이 한곳으로 모이는 것을 방지하기 위해 도메인 별로 분기

5) 분기의 일은 Dispatcher가 해준다. (ServletDispatcher, RequestDispatcher)

 

서블릿: 자바로 웹을 할 수 있는 기술

도메인: 남자, 여자 (범주를 주는 기술)

 

 

11. http 4가지 요청 방식

클라이언트가 웹서버에 요청!!

웹서버는 DB에 SELECT, INSERT, UPDATE, DELETE 요청을 해서 응답!!

 

(1) GET(동사) - 데이터 요청

(2) POST(동사) - 데이터 전송

(3) PUT(동사) - 데이터 갱신

(4) DELETE(동사) - 데이터 삭제

 

spring boot devetool 라이브러리: 저장하는 순간 리로드

spring boot 라이브러리: @RestController 같은 라이브러리

com.cos.controller.demo.web.HttpController.java

package com.cos.controller.demo.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

//@Controller // File을 응답하는 컨트롤러 (클라이언트가 브라우저면 .html 파일을)
@RestController // Data를 응답하는 컨트롤러 (클라이언트가 핸드폰이면 data)
public class HttpController {

	// http://localhost:8080/get
	@GetMapping("/get")
	public String get() {
		return "<h1>get요청됨</h1>";
	}
	
	// http://localhost:8080/post
	@PostMapping("/post")
	public String post() {
		return "post요청됨";
	}
	
	// http://localhost:8080/put
	@PutMapping("/put")
	public String put() {
		return "put요청됨";
	}
	
	// http://localhost:8080/delete
	@DeleteMapping("/delete")
	public String delete() {
		return "delete요청됨";
	}
}

웹 브라우저는 get만 가능 그래서 postman 사용

 

12. 쿼리스트링, 주소변수매핑

http 쿼리 스트링(querystring), 주소 변수 매핑(path variable)

1) 구체적인 데이터 요청시에 쿼리스트링이나 주소변수매핑이 필요하다.

2) 스프링부트에서는 주소변수매핑을 주로 사용한다. 훨씬 편리하다.

?type=양념 → 쿼리스트링

/양념 → 주소 변수 매핑

com.cos.controller.demo.web.QueryPathController.java

package com.cos.controller.demo.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class QueryPathController {

	@GetMapping("/chicken")
	public String chickenQuery(String type) {
		return type+" 배달갑니다.(쿼리스트링)";
	}
	
	@GetMapping("/chicken/{type}")
	public String chickenPath(@PathVariable String type) {
		return type+" 배달갑니다.(주소 변수 매핑)";
	}
	
}

웬만하면 주소 변수 매핑으로(간편하니깐)

 

13. http body 데이터 전송하기

  • http header의 Content-Type 이해

 

  • 스프링부트는 기본적으로 x-www-form-urlencoded 타입을 파싱(분석)해준다.
  • x-www-form-urlencoded
  • text/plain
  • application/json

com.cos.controller.demo.web.HeepBodyController.java

package com.cos.controller.demo.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.cos.controller.demo.web.domain.User;

@RestController
public class HttpBodyController {
		
	private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);

	@PostMapping("/body1")
	public String xwwwformmurlencoded(String username) {
		log.info(username);
		return "key=value 전송옴";
	}
	
	@PostMapping("/body2")
	public String plaintext(@RequestBody String data) { // 평문: 안녕
		log.info(data);
		return "plain/text 전송옴";
	}
	
	@PostMapping("/body3")
	public String applicationjson(@RequestBody String data) { 
		log.info(data);
		return "json 전송옴";
	}
	
	@PostMapping("/body4")
	public String applicationjsonToObject(@RequestBody User user) { 
		log.info(user.getUsername());
		return "json 전송옴";
	}
}

 

 

com.cos.controller.demo.web.domain.User.java

package com.cos.controller.demo.web.domain;

public class User {
	private String username;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
	
}

 

14. JSON 응답하기

http 요청을 json으로 응답하기

 

com.cos.controller.demo.web.HttpResponseJsonController.java

package com.cos.controller.demo.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cos.controller.demo.web.domain.User;

@RestController
public class HttpResponseJsonController {

	@GetMapping("/resp/json")
	public String respJson() {
		return "{\"username\":\"cos\"}";
	}
	
	@GetMapping("/resp/json/object")
	public String respJsonObject() {
		User user = new User();
		user.setUsername("홍길동");
		
		String data = "{\"username\":\""+user.getUsername()+"\"}"; // 내가 Json으로 만든것은 미친짓
		return data;
	}
	
	@GetMapping("/resp/json/javaobject")
	public User respJsonJavaObject() {
		User user = new User();
		user.setUsername("홍길동");
		
		return user; // 1. MessageConverter가 자동으로 JavaObject를 Json(구:xml)으로 변경해서 통신을 통해 응답을 해준다.
						   // 2. @RestController 일때만 MessageConverter가 작동한다.
	}
}

 

15. HTML 응답

http 요청을 file로 응답하기

1) .txt 파일 응답하기 (기본경로는 resources/static)

2) 스프링부트가 지원하는 .mustache 파일 응답하기

3) 스프링부트가 버린 .jsp 파일 응답하기

 

.jsp와 .mustache 파일은 템플릿 엔진을 가지고 있다.

템플릿 엔진이란 html 파일에 java 코드를 쓸 수 있는 친구들이다.

 

pom.xml 추가 (mvnrepository.com)

<!--
		https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mustache -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-mustache</artifactId>
		</dependency>

b.mustache 추가

static → other → b.html → b.mustache로 확장자 수정 → templates로 옮김

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is mustache</h1>
</body>
</html>

 

이제 jsp 차례(jasper)

pow.xml에 mustache 주석, jsp 추가

<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>tomcat-jasper</artifactId>
	<version>11.0.0-M16</version>
</dependency>

src/main/webapp/WEB-INF/views/c.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is JSP</h1>
</body>
</html>

src/main/resources/application.yml으로 수정

spring:
  mvc:
	view:
	  prefix: /WEB-INF/views/
	  suffix: .jsp

com.cos.controller.demo.web.java

package com.cos.controller.demo.web;

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

@Controller // 파일을 리턴할 것이기 때문
public class HttpRespController {
	
	@GetMapping("/txt")
	public String txt() {
		return "a.txt"; // 프레임워크 사용 (틀이 이미 정해져 있음)-일반 정적 파일들은 resources/static 폴더 내부에 두면 디폴트 경로이다.
		
	}
	
	@GetMapping("/mus")
	public String mus() {
		return "b"; // 머스태치 템플릿 엔진 라이브러리 등록 완료-templates 폴더 안에 .mustache을 나두면 확장자 없이 파일명만 적으면
					// 자동으로 찾아감.
	}

	@GetMapping("/jsp")
	public String jsp() {
		return "c"; // jsp 엔진 사용: src/main/webapp 폴더가 디폴트 경로!!
					// /WEB-INF/views/c.jsp (ViewResolver)
	}
	
	
}

 

16. JSP파일에 Java 코드 사용해보기

  • java 코드 사용
  • model 사용

JavaToJspController.java

package com.cos.controller.demo.web;

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

import com.cos.controller.demo.web.domain.User;

@Controller
public class JavaToJspController {

	@GetMapping("/jsp/java")
	public String jspToJava() {
		return "d";
	}
	
	@GetMapping("/jsp/java/model")
	public String jspToJavaToMedel(Model model) { // 함수의 파라미터에 Model을 선언하고
		
		User user = new User();
		user.setUsername("ssar");
		model.addAttribute("username", user.getUsername()); // addAttribute 함수로 전달만 하면 됨
		
		return "e";
	}
	
}

d.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is d.</h1>
<%
	int num = 10;
%>
<h3> num의 값은 <%=num %></h3>
</body>
</html>

e.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This is e</h1>
<h3>${username}</h3>
</body>
</html>

17. HTTP 요청 재분배하기(redirection)

  • http 상태코드 300번대
  • 다른 주소로 요청을 분배한다.

HttpRedirectionController.java

package com.cos.controller.demo.web;

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

@Controller
public class HttpRedirectionController {

	@GetMapping("/home")
	public String home() {
		// 1만줄 코드 가정
		return "home";
	}
	
	@GetMapping("/away")
	public String away() {
		// 다른코드
		return "redirect:/home"; // 리다이렉션이 된다. (@Controller)
		
	}
}

 

 

 

'포토그램' 카테고리의 다른 글

[Chapter 5] 프로필 페이지  (0) 2024.02.22
[Chapter 4] 구독하기  (0) 2024.02.22
[Chapter 3 Part 2] 포토그램 인증  (0) 2024.02.22
[Chapter 3 Part 1] 포토그램 인증  (0) 2024.02.22
[Chapter 1] 환경설정  (0) 2024.02.22