KOSA Spring - DTO 객체

채정윤·2025년 4월 17일

Spring

목록 보기
9/25

Spring MVC 기본 흐름 + DTO 개념


✅ 1. DTO (Data Transfer Object)

📌 개념

  • DTO는 데이터를 담는 객체
  • 컨트롤러 <-> 뷰
  • 요청 파라미터 <-> 자바 객체
  • @Getter, @Setter, @ToString 등을 자동 생성해주는 @Data 어노테이션으로 코드 간결하게 작성 가능.

📌 코드에서:

public class SampleDto {
	private String name;
	private int age;
}
  • 클라이언트가 ?name=aaa&age=20 같은 방식으로 보낸 데이터를 자동으로 매핑해서 객체로 만들어줘.
  • ex01() 메서드에서는 SampleDto dto로 자동 바인딩돼.

💡 커맨드 객체란?

  • 클라이언트의 요청 파라미터를 DTO나 VO 객체로 자동 매핑해주는 객체야.
  • Spring이 파라미터 이름과 필드 이름을 자동으로 매칭해줘서 일일이 @RequestParam 안 써도 돼.
	@GetMapping("ex01")
	public String ex01(SampleDto dto) { // 데이터가 객체로 자동 만들어짐 -> 커맨드 객체임
		log.info("주말 빨리와라아🤩");
		log.info("dto:"+dto);
		
		return "ex01";

✅ 2. @Controller와 요청 매핑

📌 주요 어노테이션

  • @Controller: 해당 클래스가 컨트롤러임을 명시.
  • @RequestMapping("/sample/*"): 모든 경로가 /sample/로 시작해야 함.
  • @GetMapping("ex01"): GET /sample/ex01 요청을 처리.

✅ 3. @RequestParam

@GetMapping("ex02")
public String ex02(@RequestParam("name") String name,
                   @RequestParam("age") int age)
  • 개별 파라미터를 하나씩 받고 싶을 때 사용.
  • DTO 없이도 사용할 수 있지만, 파라미터가 많아지면 DTO로 묶는 게 더 깔끔해.

✅ 4. 반환값 = 뷰 이름

return "ex01";
  • ex01.jsp 뷰 페이지로 이동한다는 의미.
  • 같은 이름의 .jsp 파일이 WEB-INF/views/ex01.jsp 경로에 있어야 해 (보통 ViewResolver 설정에 따라).

✅ 5. void 리턴 시

@GetMapping({"basic"})
public void basicGet() {
	log.info("집가고 싶어용😎");
}
  • 리턴값이 없으면, 요청 경로 /sample/basic에 따라 *자동으로 /WEB-INF/views/sample/basic.jsp로 이동함.

📝 요약 정리

개념설명
DTO데이터를 담는 그릇. 요청 파라미터 → 자바 객체로 자동 매핑
커맨드 객체컨트롤러 파라미터로 DTO를 쓰면 자동 바인딩됨
@RequestParam파라미터를 하나하나 받고 싶을 때 사용
@GetMappingGET 요청을 처리하는 매핑 어노테이션
리턴값뷰 이름 (JSP 파일명)
void 리턴요청 경로명과 같은 이름의 JSP로 자동 이동

🗂️ 코드

basic.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>basic.jsp 페이지랍니당당구리</h2>
</body>
</html>

SampleDto.java

package org.zerock.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SampleDto {
	private String name;
	private int age;
}

SampleController.java

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.domain.SampleDto;

import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/sample/*") // sample경로인 애들 다 매핑
public class SampleController {

	//해당url경로가 view의 경로이다!
	@GetMapping({"basic"})
	public void basicGet() {
		log.info("집가고 싶어용😎");
	}
	
	@GetMapping("ex01")
	public String ex01(SampleDto dto) { // 데이터가 객체로 자동 만들어짐 -> 커맨드 객체임
		log.info("주말 빨리와라아🤩");
		log.info("dto:"+dto);
		
		return "ex01";
		
		//INFO : org.zerock.controller.SampleController - 집가고 싶어용😎
		//INFO : org.zerock.controller.SampleController - 주말 빨리와라아🤩
		//INFO : org.zerock.controller.SampleController - dto:SampleDto(name=aaa, age=20)
	}
	
	@GetMapping("ex02")
	public String ex02(@RequestParam("name")String name,
								   @RequestParam("age") int age) {
		log.info("이름: " + name);
		log.info("나이: " + age);
		
		return "ex02";
		
		//INFO : org.zerock.controller.SampleController - 이름: aaa
		//INFO : org.zerock.controller.SampleController - 나이: 20
		
		
		
		
		
}

0개의 댓글