organize/스프링

스프링 웹 프로젝트 5

001cloudid 2024. 12. 31. 17:41
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