test:
value: hell world!
age: 10
yml파일은 위와 같은 형식으로 작성해야 한다.
package com.ohgiraffers.chap01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Chap01AutoConfigurationLectureSourceApplication {
public static void main(String[] args) {
SpringApplication.run(Chap01AutoConfigurationLectureSourceApplication.class, args);
}
}
@Configuration
public class SpringConfiguration {
@Value("${test.value}")
public String testValue;
@Value("${test.age}")
public String testAge;
/* 설명. @Value는 시스템 환경변수도 불러올 수 있다. */
@Value("${username}")
public String userName;
@Bean
public Object propertReadTest() {
System.out.println("testValue: " + testValue);
System.out.println("testAge: " + testAge);
System.out.println("userName: " + userName);
return new Object();
}
}
스프링은 리다이렉트되더라도 화면의 재료를 유지할 수 있다 내부적으로 request를 사용하기 떄문이다.
앞으로 나올 코드들은 HTTP 요청을 컨트롤러에서 처리하는 방법을 배우기 위한 예제이다.

@RequestMapping(value="/menu/regist", method= RequestMethod.GET)
public String registMenu(Model model) {
model.addAttribute("message", "POST 방식의 메뉴 수정용 핸들러 메소드 호출함...");
return "mappingResult";
}
/menu/regist라는 URL에 GET 요청이 들어오면 이 메서드가 실행된다.
Model model을 사용하여 View(HTML)에 데이터를 전달한다.
return "mappingResult";는
"mappingResult"라는 뷰 파일(html)을 응답으로 보내겠다는 뜻이다.
RequestMapping에 method를 따로 지정하는 대신
아예 처음부터 PostMapping 이나 GetMapping을 쓸 수 있다.
@PostMapping("/menu/modify")
public String modifyMenu(Model model) {
model.addAttribute("message", "POST 방식의 메뉴 수정용 핸들러 메소드 호출함...");
return "mappingResult";
}
/menu/modify라는 URL에 POST 요청이 들어오면 registMenu메소드가 실행된다.
Model을 이용해 메시지를 전달하고, "mappingResult" 뷰를 반환.
POST 요청은 일반적으로 데이터를 서버에 변경·저장할 때 사용된다.
@GetMapping("/menu/regist")
public String registMenu(Model model) {
model.addAttribute("message", "신규 메뉴 등록용 핸들러 메소드 호출함...");
return "mappingResult";
}
위와 같은 원리지만, /menu/delete에 대한 GET 요청을 처리합니다.
즉, 클라이언트가 특정 URL로 GET, POST 등의 요청을 보낼 때, 이를 컨트롤러에서 어떻게 매핑하고 처리하는지를 배우는 코드다!
@RequestMapping, @GetMapping, @PostMapping는 핸들러 메서드를 만드는 annotation이고 이들이 붙은 메서드가 핸들러 메서드이다!
// 예시 : 📌 POST 요청을 처리하는 핸들러 메서드
@PostMapping("/menu/delete")
public String postDeleteMenu(Model model) {
model.addAttribute("message", "POST 방식의 메뉴 삭제용 핸들러 메소드 호출함...");
return "mappingResult";
}
}
이 핸들러 메소드를 활용하여 특정 URL을 처리한다.
이 경우 요청경로를 반환한다.
@GetMapping("/regist")
public void regist(){
}
이렇게 void인경우, 요청경로인 /regist를 그대로 반환한다.
@GetMapping("/regist")
public String regist() {
return "/first/regist";
}
이 경우와 같다고 볼 수 있다.
Model과 Session은 다르지만,
@SessionAttributes를 이용하면 모델에 저장된 값을 세션에 자동으로 저장하도록 할 수 있다.
이 어노테이션은 id라는 이름으로 Model에 담긴 값을 HttpSession에 자동으로 저장해줍니다. 또한, 세션에 값을 넣고 빼는 데 사용됩니다
@Controller
@RequestMapping("/first")
//클래스 내의 모든 메소드가 /first로 시작하는 URL을 처리
@SessionAttributes("id")
//id라는 이름으로 Model의 값을 HttpSession에저장
public class FirstController {
}
HttpServletRequest를 통해 요청 파라미터를 받을 수 있다!
HttpServletRequest에서 값을 꺼내와서 model에 전달해준다!
@PostMapping("regist")
public String registMenu(HttpServletRequest request, Model model) {
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
int categoryCode = Integer.parseInt(request.getParameter("categoryCode"));
/* 설명. 비즈니스 로직 이후 DB에 insert를 성공하고 돌아왔다는 가정 */
String message = name + "을(를) 신규 메뉴 목록의 " + categoryCode + "번 카테고리에 "
+ price + "원으로 등록하였습니다!!";
model.addAttribute("message", message);
return "first/messagePrinter";
}
그런데, 위와 똑같은 기능을 하더라도
더 간단하게 @RequestParam을 이용하여 작성할 수 도 있다.
request의 parameter로 넘어오는 값들의 key값과 일치하는 변수명을 작성하고
@RequestParam을 적용하면 알아서 값을 꺼내고,
(해당 매개변수의 자료형에 맞게)형변환도 해준다.
request parameter의 키 값과 다른 매개변수명을 사용하고 싶을 때 request parameter의 키 값을 작성한다.
@RequestParam(name="modifyPrice", defaultValue = "0")
사용자의 입력값이 없거나 아니면 request의 parameter 키 값과 일치하지 않는 매개변수 사용시 매개변수가 가질 기본 default 값을 작성한다.
넘어온 parameter의 키값과 핸들러 메소드의 매개변수 이름이 같으면 @RequestParam를 생략 가능
@PostMapping("modify1")
public String modify1(Model model,@RequestParam(name="name", defaultValue = "디폴트") String modifyName, int modifyPrice) {
// modifyPrice : 넘어온 parameter의 키값과 핸들러 메소드의 매개변수 이름이 같으면 생략 가능
/* 설명. 넘어온 데이터들로 update를 하고 성공했다는 가정 */
String message = modifyName + "메뉴의 가격을 " + modifyPrice + "로 변경하였습니다.";
model.addAttribute("message", message);
return "first/messagePrinter";
}
//Map으로 받는 경우 HttpServletRequest처럼 다시 key값으로 각각 꺼내고 형변환도 따로 해줘야 한다.
@PostMapping("modify2")
public String modify2(Model model, @RequestParam Map<String, String> parameterMap) {
String modifyName = parameterMap.get("name");
int modifyPrice = Integer.parseInt(parameterMap.get("modifyPrice"));
String message = modifyName + "메뉴의 가격을 " + modifyPrice + "로 변경하였습니다.";
model.addAttribute("message", message);
return "first/messagePrinter";
}
핸들러 메소드에 우리가 작성한 클래스(bean말고)를
매개변수로 작성하면 스프링이 객체를 만들어 주고(기본 생성자) setter로 값도 주입해 준다.
@PostMapping("search")
public String searchMenu(@ModelAttribute(name="menu") MenuDTO menu) {
System.out.println("menu = " + menu);
return "first/searchResult";
}
이러한 클래스의 객체를 '커맨드 객체'라고 부른다. (커맨드 객체는 기본생성자와 setter가 필수)
이후에 이 @ModelAttribute를 사용하면!
@ModelAttribute 어노테이션을 활용하면
커맨드 객체를 모델에 attribute로 담아주며
이후 view의 재료로 사용.
@ModelAttribute는 MenuDTO 객체를 자동으로 생성하고, 그 객체에 요청 파라미터 값을 바인딩한다.
세션에 정보를 저장하기위해 setAttribute를 사용한다.
@GetMapping("login")
public void login(){}
@PostMapping("login")
public String sessionTest1(String id, String pwd, HttpSession session) {
System.out.println("id = " + id);
System.out.println("pwd = " + pwd);
/* 설명. 로그인 성공을 가정(회원 조회 이후) HttpSession에 로그인 성공한 회원 정보 저장 */
session.setAttribute("id", id);
session.setAttribute("pwd", pwd);
return "first/loginResult";
}
또한 첨에 헷갈렸던 것은 왜 GetMapping과 PostMapping을 같은 url경로에 써도 되는지 이해가 안갔었는데, 생각해보면 Get은 url경로가 바뀌지 않기 때문에 get요청으로 로그인폼으로 화면이 바뀐다고 하더라도 url은 그대로이기 때문에 get과 post둘다 사용하여 로그인할 수 있다!
: Model에 담은 'id' 값을 HttpSession에 저장
/* 설명. Model에 담은 값 중에 일부를 HttpSession에 자동으로 담도록 어노테이션 활용 */
@PostMapping("login2")
public String sessionTest2(Model model, String id) {
model.addAttribute("id", id);
return "first/loginResult";
}
HttpSession을 사용한 경우에는, session을 무효화처리한다.
@GetMapping("logout1")
public String logoutTest1(HttpSession session) {
session.invalidate();// 세션을 무효화하여 로그아웃 처리
return "first/loginResult";
}
SessionStatus를 사용한경우에는 , setComplete()를 사용한다.
@GetMapping("logout2")
public String logoutTest2(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "first/loginResult";
}
@PostMapping("body")
public void body(@RequestBody String body,
@RequestHeader("content-type") String contentType,
@CookieValue(value="JSESSIONID") String sessionId) {
// 요청 본문, 헤더, 쿠키 값들을 출력
}
@RequestBody는 요청 본문(body)을 Java 객체로 바인딩하는 데 사용.
@RequestHeader는 요청 헤더에서 특정 값을 추출.
@CookieValue는 클라이언트가 보낸 쿠키에서 값 추출