홍팍님 강의를 참고하여 게시판을 만들어보았다
(Client->Server)
Client에서 폼 데이터가 전송 하면 Controller는 이 데이터를 객체에 담아 받는다.
이때 폼 데이터를 받는 객체를 DTO라고 한다.
(Server->DB)
먼저 서버와 디비는 서로 사용하는 언어가 다르다!
그래서 서버에서 디비로 데이터를 저장할 때 JPA를 이용하는데, JPA가 서버의 언어를 디비가 이해할 수 있게 해주고, 데이터 관리에 편리한 여러 기능을 제공해준다.
이 기능중 entity와 repository가 있는데..
entity는 서버의 언어를 디비가 이해할 수 있게 잘 규격화 된 데이터이다.
repository는 entity를 디비로 전달, 처리 해준다.
그래서 간단히 정리하자면 데이터를 저장할 때
1. dto형식으로 폼 데이터 받기
2. dto를 entity로 변환
3. repository로 저장
그럼 먼저 dto, entity, repository를 만들어 준다.
dto(TestForm)
package com.example.template.dto;
import com.example.template.entity.Article;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString
public class ArticleForm {
private Long id;
private String title;
private String content;
public Article toEntity() {
return new Article(id, title, content);
}
}
entity(Test)
package com.example.test.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
public class Test {
@Id
@GeneratedValue
private Long id;
@Column
private String title;
@Column
private String content;
}
Repository(TestRepository)
package com.example.test.Repository;
import com.example.test.entity.Test;
import org.springframework.data.repository.CrudRepository;
public interface TestRepository extends CrudRepository<Test, Long> {
}
mustache(update.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">contents</label>
<textarea class="form-control" rows="3" name="content"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<a href="/articles">Back</a>
</form>
{{>layouts/footer}}
controller(TestController.java)
//생성 페이지
@GetMapping("/articles/new")
private String newArticleForm() {
return "articles/new";
}
//저장
@PostMapping("/articles/create")
public String createArticle(TestForm form) {
log.info(form.toString());
//DTO를 Entity로 변환
Test test = form.toEntity();
//Repository에게 Entity를 DB안에 저장하게 함
Test saved = testRepository.save(test);
return "redirect:/articles";
}