08_Spring_240401(월)_55일차(1)_Spring Boot - 기본 연습

soowagger·2024년 4월 1일

8_Spring

목록 보기
2/38

1. 요청 + forward 테스트(a 태그 GET방식)

// * 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)
	}
}

2. 정적 자원(js, css, image) 연결 테스트

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

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>

3. 서버로 파라미터 제출 테스트

param/main, test1, test2 컨트롤러

// 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";
	}

}

param-main.html

<!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값으로 디버깅 되는 결과 확인

📌 디버깅

application.properties

# 로그 레벨 지정
logging.level.edu.kh.demo=debug

#TRACE : 가장 상세한 로그 레벨로, 상세한 정보를 기록
#DEBUG : 디버깅에 유용한 정보를 기록(값 추적)
#INFO  : 일반적인 정보 메시지 기록
#WARN  : 경고 메시지를 기록
#ERROR : 오류 메시지를 기록, 심각한 문제 발생 시 사용
profile

0개의 댓글