728x90
Controller
- 서블릿에서 시작 → Spring MVC는 서블릿에서부터 시작 → 기본적으로 서블릿에 대한 이해가 필요함
- 서블릿에서 HttpServletRequest, HttpServletResponse를 사용했지만
Spring MVC에서는 사용할 필요가 없음 이유는 HttpServletRequest, HttpServletResponse는 파라미터를 수집하려고 사용하는데 Spring MVC에서는 자동으로 파라미터를 수집하는 기능을 처리해줌 + 리턴 타입
※ 이러한 Spring MVC를 이용하면 자바에서 배운 상속이나 인터페이스 등의 문법에 갇혀 있지 않을 수 있게 함
어노테이션
- @Controller : 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
componet-scan과 같이 활용 - @RequestMapping : 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리
※ 과거 서블릿을 계속 만들거나 구조를 만들었어야함
스프링 4.3 이전까지는 @RequestMapping(method = "get") 방식으로 사용하였으나
스프링 4.3 이후에는 @GetMapping, @PostMapping으로 간단히 표현이 가능해
package org.zerock.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.log4j.Log4j;
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
@RequestMapping("")
public void basic() {
log.info("SampleController basic() log.info");
}
@GetMapping("/basicGet")
public void basicGet() {
log.info("SampleController basicGet() log.info");
}
}
컨트롤러의 파라미터 수집
- 스프링 MVC의 컨트롤러는 메서드의 파라미터를 자동으로 수집, 변환하는 기능을 제공
- Java Beans 규칙에 맞게 작성되어야 함
생성자가 없거나 빈 생성자
올바른 규칙으로 만들어진 Getter/Setter
package org.zerock.domain;
import lombok.Data;
@Data
public class SampleDTO {
private String name;
private int age;
}
@GetMapping("/ex01")
public void ex01(SampleDTO sampleDTO) {
log.info("SampleController ex01(SampleDTO sampleDTO) log.info : " + sampleDTO);
}


화면은 찾을 수 없지만, 실제로 데이터는 수집(console에서 확인이 가능함)
배열이나 리스트 처리
@GetMapping("/ex02List")
public String ex02List(@RequestParam("ids") ArrayList<String> ids) { // @RequestParam 명시적으로 작성 파라미터 이름이 ids인 것을 수집
log.info("SampleController ex02List() log.info ids" + ids);
return "ex02List";
}
//http://localhost:8080/sample/ex02Bean?list[0].name=ABC&list[0].age=20
@GetMapping("/ex02Bean")
public String ex02Bean(@ModelAttribute("sample") SampleDTOList list, Model model) {
log.info("SampleController ex02List() log.info list : " + list);
model.addAttribute("result","success");
return "sample/ex02Bean";
}
Model
- Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아 전달하는 역할을 하는 존재
- 모델 2 방식에서 사용하는 requestsetAttribute()와 유사한 역할
public String home(Locale locale, Model model) { // Model : 상자(데이터 전달), 화면으로 전달하고 싶다면 파라미터에 Model 추가
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
※ Model을 사용하지 않아도 데이터 수집이 됨
@GetMapping("/ex02Bean")
public String ex02Bean(SampleDTOList list/* @ModelAttribute("sample") SampleDTOList list, Model model */) {
log.info("SampleController ex02List() log.info list : " + list);
// model.addAttribute("result","success");
return "sample/ex02Bean";
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02Bean.jsp</title>
</head>
<body>
<h1>${sampleDTOList}</h1>
</body>
</html>

- 객체로 데이터를 수집하는 것은 화면까지 전달이 됨.
- 그렇다면 Model에 담아야하는 데이터는? 전달되는 파라미터가 아닌 경우
즉, 다른 곳(Service, DB)에서 발생한 데이터를 담기 위한 용기
Model에 담는 것은 전달된 데이터는 아닌데 화면에는 필요한 경우 ex) 게시판 - 목록
@ModelAttribute
- 내가 이 데이터를 명시적으로(이름으로) 화면에서 쓰겠다. 즉, 전달할 때 jsp에 이름을 바꿔서 쓰겠다.
이름을 명시적으로 해주는 역할을 함. 화면까지 전달해주는 역할
@GetMapping("/ex05")
public String ex05(SampleDTO sampleDTO, int page) {
log.info("SampleController ex02List() log.info sampleDTO : " + sampleDTO);
log.info("SampleController ex02List() log.info page : " + page);
return "sample/ex05";
}
이를
@GetMapping("/ex05")
public String ex05(SampleDTO sampleDTO, @ModelAttribute("p") int page) {
log.info("SampleController ex02List() log.info sampleDTO : " + sampleDTO);
log.info("SampleController ex02List() log.info page : " + page);
return "sample/ex05";
}
<h1>SampleDTO : ${sampleDTO}</h1>
<h1>page : ${p}</h1>
RedirectAttribute
- 화면에 한 번만 전달되는 파라미터를 처리하는 용도
- 내부적으로 HttpSession 객체에 담아서 한 번만 사용되고 폐기
// 딱 한 번만 전달
rttr.addFlashAttribute("name","ABC");
rttr.addFlashAttribute("age",20);
return "redirect:/";
리턴 타입
어노테이션 이용 방식(자바의 리플렉션 -> 전통적인 방식X)
- String: jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용 → 분기
- void : 호출하는 URL과 동일한 이름의 jsp를 의미 → 배열 요소로 가능
- VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용
- ResponseEntitiy 타입 : response할 때 http 헤더 정보와 내용을 가공하는 용도로 사용
Model : 데이터를 반환하거나 화면까지 같이 지정하는 경우 사용HttpHeaders : 응답에 내용 없이 http 헤더 메시지만 전달하는 용도로 사용
void 타입
// void 타입 : 호출 IRL과 동일한 이름의 jsp 파일
@GetMapping("/ex05")
public void ex05() {
log.info("SampleController ex05() log.info");
}

String 타입
// 상황에 따라 다른 화면을 보여줄 필요가 있을 경우 유용하게 사용
// String 타입에는 redirect, forward 키워드를 붙여 사용할 수 있음
// redirect : 리다이렉트 방식으로 처리하는 경우, forward : 포워드 방식으로 처리하는 경우
// redirect 예시) re1에서 re2로 가야함(re1을 호출하면 re2로) → 사용자를 강제로 이동 시킬 때 많이 사용하는 방식
@GetMapping("/re1")
public String re1() {
log.info("SampleController re1() log info");
return "redirect:/sample/re2";
}
@GetMapping("/re2")
public void re2() {
log.info("SampleController re2() log info");
}
주소줄에 http://localhost:8080/sample/re1 을 입력하면 http://localhost:8080/sample/re2로 이동


redirect는 2번 호출이 일어남(개발자도구에서 Network 탭을 확인)


re1을 호출
→ 서버 응답(re1은 re2로 가야함)
→ 브라우저 request, response를 한번씩 받음
→ 다른 곳으로 가야함
→ 자동으로 호출
→ re2로 이동
서블릿의 response.sendRedirect()와 같음
객체 타입
- XML이나 JSON으로 처리
- @ResponseBody 어노테이션과 같이 사용(Ajax)
ResponseEntity
- HTTP 헤더 정보와 추가적인 데이터를 전달할 때 사
파일업로드 처리
- Servlet 3.0이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가
- 별도로 commons-fuleupload 라이브러리 등을 사용
728x90
'organize > 스프링' 카테고리의 다른 글
스프링 웹 프로젝트 7 (0) | 2025.01.05 |
---|---|
스프링 웹 프로젝트 6 (0) | 2025.01.04 |
스프링 웹 프로젝트 4 (0) | 2024.12.30 |
스프링 웹 프로젝트 3 (0) | 2024.12.29 |
스프링 웹 프로젝트 2 (0) | 2024.12.28 |