본문 바로가기
프로젝트/아롬프로젝트(1)

DTO란? / DTO의 매핑방법(getter&setter)

by haeyoon 2024. 7. 15.

 

1. 폼데이터를 DTO로 받아 

2. 엔티티로 변환

3. 리파지터리를 이용해 DB에 저장

 

 

[문제점]

로컬에서 데이터를 넣어도 Articleform의 title과 content값이 항상 null로 들어온다

 

 

* controller > ArticleController

package com.example.firstproject.controller;

import com.example.firstproject.dto.ArticleForm;
//import com.example.firstproject.entity.Article;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class ArticleController {
    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/articles/new")
    public String newArticleForm(){
        return "articles/new";
    }

    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form){

        System.out.println(form.toString());
        return "";
    }
}

 

* resources > templates > articles > new.mustache

{{>layouts/header}}

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

{{>layouts/footer}}

 

[기존 코드]

*dto > ArticleForm

package com.example.firstproject.dto;


import com.example.firstproject.entity.Article;

public class ArticleForm {
    private String title;
    private String content;

    public ArticleForm(String title, String content) {
        this.title = title;
        this.content = content;
    }

    @Override
    public String toString() {
        return "ArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    public Article toEntitiy() {
        return new Article(null, title, content);
    }
}

 

[수정된 코드]

package com.example.firstproject.dto;

import com.example.firstproject.entity.Article;

public class ArticleForm {
    private String title;
    private String content;

    public ArticleForm(){} //기본생성자

    //getter, setter
    public String gettitle() {
        return title;
    }

    public void settitle(String title) {
        this.title = title;
    }

    public String getcontent() {
        return content;
    }

    public void setcontent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "ArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    public Article toEntitiy() {
        return new Article(null, title, content);
    }
}

 

바뀐 점

생성자(constructure)를 삭제하고, 기본생성자를 생성한뒤 getter, setter 메서드 생성

 

원리: ObjectMapper가 JSON Field와 Java Field를 어떻게 매핑하는지 알아야 합니다.

 

 

- 스프링이 어떻게 Dto를 JSON으로 맵핑하는지?

스프링은 바로 Jackson 라이브러리의 ObjectMapper를 사용하여 JSON으로 맵핑한다

 

 

기본적으로 Jackson은 Json 필드의 이름을 Java 객체의 getter 및 setter 메서드와 일치시켜 JSON 객체 필드를 Java 객체의 필드에 매핑시킵니다.

 

DTO에 getter와 setter의 이름을 통해 필드를 매핑시킨다는 사실을 알았습니다.

성공!

 

'프로젝트 > 아롬프로젝트(1)' 카테고리의 다른 글

[IntelliJ] Github 터미널 사용법  (0) 2024.07.22