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 |
---|