// * Java 객체 : new 연산자에 의해 Heap 영역에
// 클래스에 작성된 내용대로 생성된 것
// -> instance : 개발자가 만들고 관리하는 객체
// Bean : Spring Container(Spring)가 만들고 관리하는 객체
@Controller // 요청/응답을 제어할 컨트롤러 역할 명시 + Bean으로 등록(== 객체로 생성해서 스프링이 관리)
public class TestController {
// 기존 Servlet : 클래스 단위로 하나의 요청만 처리 가능
// Spring : 메서드 단위로 요청 처리 가능
// @RequestMapping("요청주소")
// - 요청 주소를 처리할 메서드를 매핑하는 어노테이션
// 1) 메서드에 작성
// - 요청주소와 메서드를 매핑
// - GET/POST 가리지 않고 매핑 (속성을 통해 지정은 가능)
// @RequestMapping(value="test", method=RequestMethod.GET)
// 2) 클래스에 작성
// - 공통 주소를 매핑
// ex) /todo/insert, /todo/select, /todo/update
/* @RequestMapping("todo")
* @Controller
* public class TodoController {
@RequestMapping("insert") // /todo/insert 매핑
public String insert() {}
@RequestMapping("select") // /todo/select 매핑
public String select() {}
@RequestMapping("update") // /todo/update 매핑
public String update() {}
}
*/
/* ************************************ */
// Spring Boot Controller에서
// 특수한 경우를 제외하고
// 매핑 주소 제일 앞에 "/"를 작성 안함
/* ************************************ */
@RequestMapping("test") // /test 요청 시 처리할 메서드 매핑(GET/POST 가리지 않고)
public String testMethod() {
System.out.println("/test 요청 받음");
/* Controller 메서드의 반환형이 String인 이유
* - 메서드에서 반환되는 문자열이
* forward할 html 파일 경로가 되기 때문!
*/
/* Thymeleaf : JSP 대신 사용하는 템플릿 엔진
*
* *classpath: == src/main/resources
* 접두사 : classpath:/templates/
* 접미사 : .html
*/
// src/main/resources/templates/test.html
return "test"; // forward(접두사 + 반환값 + 접미사 경로의 html로 forward)
}
}


💡 classpath: == src/main/resources
✅ classpath:/templates 접두사 // .html 접미사 제외 ❗
💡 static 폴더 기준으로 파일 경로 작성
// Bean : 스프링이 만들고 관리하는 객체
@Controller // 요청 / 응답 제어 역할인 Controller 임을 명시 + Bean 등록
public class ExampleController {
/* 요청 주소 매핑하는 방법
*
* 1) @RequestMapping("주소")
*
* 2) @GetMapping("주소") : GET (조회 R) 방식 요청 매핑
*
* @PostMapping("주소") : POST (삽입 C) 방식 요청 매핑
*
* @PutMapping("주소") : PUT (수정 U) 방식 요청 매핑
*
* @DeleteMapping("주소") : DELETE (삭제 D) 방식 요청 매핑
*
*/
@GetMapping("example") // /example GET 방식 요청 매핑
public String exampleMethod() {
// forward 하려는 html 파일 경로 작성
// 단, ViewResolver가 제공하는
// Thymeleaf 접두사, 접미사 제외하고 작성
// 접두사 : classpath:/templates/
// 접미사 : .html
return "example"; // src/main/resources/templates/example.html
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>정적 자원(js, css, image) 연결</title>
<!-- static 폴더 기준으로 css 파일 경로 작성 -->
<link rel="stylesheet" href="/css/ex.css">
</head>
<body>
<div class="container">
<h1>정적 자원(js, css, image) 연결</h1>
<!-- static 폴더 기준으로 image 파일 경로 작성 -->
<img src="/images/cats/cat1.jpg">
<img src="/images/cats/cat2.jpg">
<img src="/images/cats/cat3.jpg">
<img src="/images/cats/cat4.jpg">
<img src="/images/cats/cat5.jpg">
<button id="btn">JS 연결 테스트</button>
</div>
<!-- static 폴더 기준으로 js 파일 경로 작성 -->
<script src="/js/ex.js"></script>
</body>
</html>


// Bean : 스프링이 만들고 관리하는 객체
@Controller // 요청 / 응답 제어 역할 명시 + Bean 등록
@RequestMapping("param") // /param으로 시작하는 모든 요청을 현재 컨트롤러로 매핑
@Slf4j // log를 이용한 메시지 출력 시 사용 (Lombok 제공)
public class ParameterController {
@GetMapping("main") // /param/main GET 방식 요청 매핑
public String paramMain() {
// classpath: src/main/resources
// 접두사 : classpath:/templates/
// 접미사 : .html
return "param/param-main"; // src/main/resources/templates/param/param-main.html
}
/* 1. HttpServletRequest.getParameter("key") 이용 방법
*
* * HttpServletRequest
* - 요청 클라이언트 정보, 제출된 파라미터 등을 저장한 객체
* - 클라이언트 요청 시 생성
*
*
* * ArgumentResolver(전달 인자 해결사)
* - Spring의 Controller 메서드 작성 시
* 매개변수에 원하는 객체를 작성하면
* 존재하는 객체를 바인딩 또는 없으면 생성해서 바인딩
*
*/
@PostMapping("test1") // /param/test1 POST 방식 요청 매핑
public String paramTest1(HttpServletRequest req) {
String inputName = req.getParameter("inputName");
String inputAddress = req.getParameter("inputAddress");
int inputAge = Integer.parseInt(req.getParameter("inputAge"));
// 프론트 단에서 넘어온 파라미터는 모두 String 형태이기 때문에 형변환
// debug : 코드 오류 해결
// - 코드 오류 없는데 정상 수행이 안될 때
// - 값이 잘못된 경우 -> 값 추적
log.debug("inputName : " + inputName);
log.debug("inputAddress : " + inputAddress);
log.debug("inputAge : " + inputAge);
// * 앞으로 println은 쓰지 말고 로그를 찍어서 값 확인하자! *
/* Spring에서 Redirect(재요청) 하는 방법
*
* - Controller 메서드 반환 값에
* "redirect:요청주소"; 작성
*/
return "redirect:/param/main";
}
/* 2. @RequestParam 어노테이션을 이용 - 낱개 파라미터 얻어오기
* - request 객체를 이용한 파라미터 전달 어노테이션
* - 매개변수 앞에 해당 어노테이션을 작성하면, 매개변수에 값이 주입됨
* - 주입되는 데이터는 매개변수의 타입에 맞게 형변환/파싱이 자동으로 수행됨
*
* [기본 작성법]
* @RequestParam("key") 자료형 매개변수명
*
* [속성 추가 작성법]
* @RequestParam(value="name", required=false, defaultValue="1")
*
* value : 전달 받은 input 태그의 name 속성값
*
* required : 입력된 name 속성값 파라미터 필수 여부 지정(기본값 true)
* -> required = true인 파라미터가 존재하지 않는다면 400 Bad Request 에러 발생
*
* defaultValue : 파라미터 중 일치하는 name 속성 값이 없을 경우에 대입할 값 지정.
* --> required=false인 경우 사용
*
*/
@PostMapping("test2")
public String paramTest2(@RequestParam("title") String title,
@RequestParam("writer") String writer,
@RequestParam("price") int price,
@RequestParam(value="publisher", required=false, defaultValue="ABC출판사") String publisher
) {
log.debug("title : " + title);
log.debug("writer : " + writer);
log.debug("price : " + price);
log.debug("publisher : " + publisher);
return "redirect:/param/main";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>서버로 파라미터 제출</title>
</head>
<body>
<h1>서버로 파라미터 제출</h1>
<h3>1. HttpServletRequest.getParameter("key") 이용</h3>
<form action="/param/test1" method="post">
이름 : <input type="text" name="inputName"> <br>
나이 : <input type="number" name="inputAge"> <br>
주소 : <input type="text" name="inputAddress"> <br>
<button>제출하기</button>
</form>
<hr>
<h3>
2. @RequestParam 어노테이션을 이용
- 낱개(단수) 파라미터 컨트롤러에서 얻어오는 방법
</h3>
<form action="/param/test2" method="post">
책 제목 : <input type="text" name="title"> <br>
작성자 : <input type="text" name="writer"> <br>
가격 : <input type="number" name="price"> <br>
출판사 : <input type="text" name="publisher"> <br>
<button>제출하기</button>
</form>
</body>
</html>


입력값이 없는 @RequestParam("publisher") String publisher 매개변수 추가 후 디버그 테스트
log.debug("publisher : " + publisher); 결과

→ required = true인 파라미터가 존재하지 않는다면 400 Bad Request 에러 발생
@RequestParam(value="publisher", required=false)

@RequestParam(value="publisher", required=false, defaultValue="ABC출판사")

출판사 input 추가 후 값 테스트


→ 값을 작성하였다면 작성한 값으로, 작성하지 않았다면 defaultValue값으로 디버깅 되는 결과 확인
# 로그 레벨 지정
logging.level.edu.kh.demo=debug
#TRACE : 가장 상세한 로그 레벨로, 상세한 정보를 기록
#DEBUG : 디버깅에 유용한 정보를 기록(값 추적)
#INFO : 일반적인 정보 메시지 기록
#WARN : 경고 메시지를 기록
#ERROR : 오류 메시지를 기록, 심각한 문제 발생 시 사용