[Spring Boot] #7 폼 데이터 주고 받기

gogori6565·2024년 6월 13일
0

스프링 부트 공부

목록 보기
5/20

👉 Mission. 사용자로부터 폼 데이터를 받고, 이를 컨트롤러에서 확인하시오


DTO란?

DTO(Data Transfer Object)
: 계층 간 데이터 교환을 위해 사용하는 객체이다. 여기서는 간단히 말해, '폼 데이터를 받는 객체' 정도로 말할 수 있다.

DTO는 클라이언트 요청에 포함된 데이터를 담아 서버 측에 전달하고, 서버 측의 응답 데이터를 담아 클라이언트에 전달하는 계층간 전달자 역할을 한다.

폼 데이터 주고 받기

1. 폼 작성

파일명 : templates/articles/new.mustache

{{>layouts/header}}

<form class="container" action="/articles/create" method="post">
    <div class="mb-3">
        <label class="form-label">제목</label>
        <input type="text" class="form-control">
    </div>
    <div class="mb-3">
        <label class="form-label">내용</label>
        <textarea class="form-control" rows="3"></textarea>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

{{>layouts/footer}}
  • form 태그를 던질 때는 두 가지 정보가 필요!
    • where? = 어디로 보낼 건지? ⇒ action=””
    • how? = 어떻게 보낼 건지? ⇒ method=””
      • method=”post” 의 경우 Controller에서 @PostMapping 으로 받음
      • 또한, @PostMapping(”{url}”) → {url}은 action=””에서 보낼 곳 주소와 동일

2. 폼 작성 View 반환하는 Controller 만들기

@Controller
public class ArticleController {

	//폼 작성 View 보여주기
    @GetMapping("/articles/new")
    public String newArticleForm(){
        return "articles/new";
    }

3. 폼 데이터 받을 DTO 객체 만들기

public class ArticleForm {

    private String title;
    private String content;

    //우클릭 > Generate > Constructor : 생성자
    public ArticleForm(String title, String content) {
        this.title = title;
        this.content = content;
    }

    //우클릭 > Generate > toString() : 출력해서 보기
    @Override
    public String toString() {
        return "ArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

4. 폼 데이터 받고 이를 console에 출력해보는 Controller 내 메소드

@PostMapping("/articles/create")
    public String createArticle(ArticleForm form) {
        System.out.println(form.toString());
        return "";
    }
  • 폼에서 던진 데이터가 Controller 메소드 내 ArticleForm 파라미터(DTO 객체)로 던져짐!

중요. 입력값 이름 지정해주기

입력을 받는 폼의 입력 태그들에게 DTO의 필드명과 동일한 이름(name="(필드명)")을 넣어야, 그 폼에 넘겨진 입력 데이터가 DTO에 전달이 됨!!

파일명 : templates/articles/new.mustache

<input type="text" class="form-control" name="title">
...
<textarea class="form-control" rows="3" name="content"></textarea>


왜.. DTO를 사용해서 데이터를 전달할까?

Controller는 View와 도메인 Model의 데이터를 주고 받을 때 별도의 DTO 를 주로 사용한다.

도메인 객체를 View에 직접 전달할 수 있지만, 민감한 도메인 비즈니스 기능(도메인 Model의 속성 같은)이 노출될 수 있으며 Model과 View 사이에 의존성이 생기기 때문이라고 한다!


📚정리

DTO : 계층 간 데이터 교환을 위해 사용하는 객체, 폼 데이터를 받는 객체이다.

  • form 태그를 던질 때는 두 가지 정보가 필요!
    • where? = 어디로 보낼 건지? ⇒ action=””
    • how? = 어떻게 보낼 건지? ⇒ method=””

강의 출처 : https://www.youtube.com/watch?v=_vDACE13Ubc&list=PLyebPLlVYXCiYdYaWRKgCqvnCFrLEANXt&index=1 [스프링 부트 입문 - 홍팍]

참고 사이트 :
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/ - DTO를 사용해서 데이터를 전달하는 이유에 대해 자세히 쓰여 있으니 참고!!
https://doing7.tistory.com/79 - 도메인 모델 이란?

profile
p(´∇`)q

0개의 댓글