
폼 데이터 (Form Data) : HTML의
<form>태그에 실려 전송되는 데이터
- 웹 브라우저에서 내용을 입력하고 전송을 눌러서 해당 데이터를 서버로 전송
전송된 데이터 -> 서버의 컨트롤러가 DTO (Data Transfer Object) 객체로 받음
DTO로 받은 데이터 -> DB (Database)에 저장됨.
뷰 페이지에 입력 폼을 만든다.
<CSS를 적용한 코드>
{{>layouts/header}}
<form class="container">
<div class="mb-3">
<label class="form-label">제목</label>
<input type="text" class="form-control" name="title">
</div>
<div class="mb-3">
<label class="form-label">내용</label>
<textarea class="form-control" rows="3" name="content"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{{>layouts/footer}}
<결과>

src -> main -> java -> com.example.firstproject ->controller 패키지에 java class로 새로운 컨트롤러를 생성한다. (ArticleController)
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller //컨트롤러임을 선언
public class ArticleController {
@GetMapping("/articles/new") // URL요청 접수
public String newArticleForm() {
return "/articles/new"; //article 경로에 있는 new 폼을 보여줌
웹 페이지의 폼에서 제목과 내용을 입력하고 submit을 눌렀을 때, 어디로 어떻게 전송할지 정하는 부분
<form>태그의 속성에 action (어디에) method (어떻게) 를 추가<form class="container" action="/aritcles/creat" method="post">
뷰 템플릿 페이지에서 데이터를 어디로, 어떻게 보낼지 설정했으니, 서버의 컨트롤러가 전송된 폼 데이터를 받도록 설정해야 함.
@PostMapping("/articles/create")
public String creatArticle() {
return "";
}
컨트롤러가 폼 데이터를 받을 때에는 DTO에 담아 받기 때문에 DTO 생성해야 함.

전송 받은 데이터를 컨트롤러에서 DTO에 담아야 함.
@PostMapping("/articles/create")
public String creatArticle(ArticleForm form) { //폼 데이터를 DTO로 받기
System.out.println(form.toString());
return "";
DTO의 필드에 값이 들어가기 위해 뷰 페이지의 입력 폼과 연결해줘야 함
<input type="text" class="form-control" name="title"> //DTO의 title 필드와 연결
<textarea class="form-control" rows="3" name="content"> //DTO의 content 필드와 연결
데이터베이스 (DB, Database)
- 데이터를 저장하는 창고
- DB는 자바 언어를 사용하지 않고 SQL 언어를 사용
- JPA 도구를 사용해서 자바 언어로 DB에게 명령을 내릴 수 있음.
JPA의 핵심 도구
- 엔티티 (Entity) : 자바 객체가 DB를 이해 할 수 있게 만든 것
- 리파지터리 (Repository) : 엔티티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
즉, DTO를 엔티티로 변환 -> 리파지터리를 이용해서 엔티티를 DB에 저장
com.example.firstproject -> entity 디렉터리 만들고 Article 클래스 생성
package com.example.firstproject.entity;
import jakarta.persistence.Column; //@Column 선언 시 자동 생성
import jakarta.persistence.Entity; //@Entity 선언 시 자동 생성
import jakarta.persistence.GeneratedValue; //@GeneratedValue 선언 시 자동 생성
import jakarta.persistence.Id; //@Id 선언 시 자동 생성
@Entity // 이 클래스가 엔티티임을 선언
public class Article {
@Id //해당 필드가 대푯값임을 선언
@GeneratedValue //대푯값을 자동으로 생성
private Long id;
@Column
private String title;
@Column
private String content;
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
dto -> ArticleForm에 toEntity() 메서드를 추가
public Article toEntity() {
return new Article(null, title, content);
//Article 엔터티 생성자의 매개변수의 양식과 맞게 입력
}
@PostMapping("/articles/creat")
public String createArticle(ArticleForm form) { //폼 데이터를 DTO로 받기
System.out.println(form.toString()); //DTO에 폼 데이터가 잘 담겼는지 확인
// 1.DTO를 엔터티로 변환
Article article = form.toEntity();
//form 객체의 toEntity() 메서드를 호출
//-> 그 반환 값을 Article 타입의 article 엔티티에 저장
System.out.println(article.toString());
return "";
}
com.example.firstproject -> new Package -> "repository" 패키지 추가
repository 패키지에 new Java Class -> Interface로 "ArticleRepository" 생성
extends CrudRepository<엔티티 클래스 타입, 대푯값 타입> 추가 (인터페이스 상속)
CrudRepository : JPA에서 제공하는 인터페이스
상속을 통해 엔터티 생성, 조회, 추가, 삭제 가능 / 2개의 제네릭 요소를 받음
import com.example.firstproject.entity.Article;
import org.springframework.data.repository.CrudRepository;
public interface ArticleRepository extends CrudRepository<Article, Long> {
}
스프링부트에서는 객체를 만들지 않아도 @Autowired 어노테이션을 이용해서 스프링부트가 미리 생성해 놓은 객체를 연결할 수 있음
private ArticleRepository articleRepository;
@Controller
public class ArticleController {
@Autowired //스프링 부트가 미리 생성해 놓은 리파지터리 객체 주입
private ArticleRepository articleRepository; // articleRepository 객체 선언
@GetMapping("/articles/new")
public String newArticleForm() {
return "/articles/new";
}
@PostMapping("/articles/creat")
public String createArticle(ArticleForm form) { //폼 데이터를 DTO로 받기
System.out.println(form.toString()); //DTO에 폼 데이터가 잘 담겼는지 확인
// 1.DTO를 엔터티로 변환
Article article = form.toEntity();
System.out.println(article.toString());
// 2.리파지터리로 엔터티를 DB에 저장
Article saved = articleRepository.save(article); //article 엔터티를 saved 객체에 반환
System.out.println(saved.toString());
return "";
}
}
articleRepository.save(article) 부분에서 articleRepository는 @Autowired 어노테이션 부분에서 ArticleRepository 타입으로 만든 객체이고, 이를 통해 save 메서드 호출.
save 메서드는 CrudRepository가 제공하는 기능이고, ArticleRepository는 이를 상속받았기 때문에 save 메서드 사용 가능.
save메서드의 매개변수는 entity인데, 앞서 DTO를 엔터티를 변환할 때 form 객체를 엔티티로 만드는 toEntity()메서드로 엔터티로 만들어서 Article 타입의 aritcle에 저장했기 때문에
save(article)이 가능


실습 최종 정리
1. 뷰 템플릿 페이지 - 입력 폼 만들기 (form, input 태그)
2. 컨트롤러 만들기 (@GetMapping, 뷰 페이지 반환 메서드)
3. 폼 데이터 전송하기 (action, method 속성)
4. 컨트롤러에서 폼 데이터 받기 (@PostMapping, 메서드)
5. DTO 만들기 (폼 데이터를 받을 그릇)
6. 폼 데이터를 DTO에 담기 (컨트롤러에서 폼 데이터를 매개변수로)
7. 입력 폼과 DTO 필드 연결 (name="필드값")
8. DTO를 엔티티로 변환 (entity 디렉터리 만들어서 클래스 생성 / DTO에 toEntity메서드 생성
9. 리파지터리로 엔티티를 DB에 저장 (repository 디렉터리 만들고 인터페이스 생성, CrudRepository 상속 / 컨트롤러에서 객체 주입)