충분히 쌓여가는
DTO를 데이터베이스에 저장하기 본문
스프링 부트 프로젝트 생성시 추가한 Dependencies 중 H2 Database가 있다
DB는 Java 언어를 이해하지 못한다
Spring Boot는 Java 언어를 사용하지만 DB는 SQL(Structured Query Language)이라는 언어를 사용하기 때문이다
어떻게 DB에 Java로 명령을 내릴 수 있냐면 JPA를 사용하면 된다
JPA(Java Persistence API)란 Java 언어로 DB에 명령을 내리는 도구로, 데이터를 객체 지향적으로 관리할 수 있도록 해준다
JPA의 핵심 도구로 entity와 repository가 있다
entity: Java 객체를 DB가 이해할 수 있게 만든 것, 이를 기반으로 테이블이 만들어진다
repository: entity가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
1. DTO를 entity로 변환하기
ArticleController에서 DTO를 entitiy로 변환하기 위해 form 객체의 toEntity()라는 메서드를 호출해서
그 반환값을 Article 타입의 article entity에 저장한다
Article article = form.toEntity();
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ArticleController {
@GetMapping("/articles/new")
public String newArticleForm() {
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) {
System.out.println(form.toString());
// 1. DTO를 entity로 변환하기
Article article = form.toEntity();
return "";
}
}
Article 클래스 만들기
Article 클래스는 현재 메서드를 만들지 않았기 때문에
opt+enter 를 사용하여 Create class 'Aritcle'을 선택해준다
이때 기본 패키지 controller이 아닌 entity라고 수정하고 OK 를 선택한다(Controller과 Entity를 나누어 관리하기 위함)
Article 클래스 코드 작성
Article 클래스가 entity를 선언하기 위해 @Entity 어노테이션을 붙인다
title, content 필드를 선언한다(DB에서 인식할 수 있게 @Column 어노테이션을 붙인다) => 두 필드가 DB 테이블의 각 열과 연결된다
entity의 대표값을 넣는다, 대표값을 id로 선언하고 @id 어노테이션을 붙인다, @GeneratedValue 어노테이션도 붙여 대표값을 자동으로 생성하게 한다
package com.example.firstproject.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Article {
@Id
@GeneratedValue
private Long id;
@Column
private String title;
@Column
private String content;
}
Article 객체의 생성 및 초기화를 위해 생성자 추가
toString() 메서드도 추가
package com.example.firstproject.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.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 + '\'' +
'}';
}
}
toEntity() 메서드 추가
toEntity() 메서드는 DTO인 form 객체를 entity 객체로 변환하는 역할을 한다
toEntity에서 opt+enter을 한 후 Create method 'toEntity' in 'ArticleForm'을 선택
Article.java에서 id, title, content를 매개변수로 받지만,
ArticleForm의 객체에 id 정보는 없기 때문에 첫 번째 전달값은 null이다
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 toEntity() {
return new Article(null, title, content);
}
}
2. Repository를 이용해 entity를 DB에 저장하기
articleRepository.save() 메서드를 호출해 article 엔티티를 저장한다
필드 선언부에 ArticleRepository articleRepository 객체를 선언한다
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ArticleController {
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());
// 1. DTO를 entity로 변환하기
Article article = form.toEntity();
// 2. Repository로 엔티티를 DB에 저장
Article saved = articleRepository.save(article); // article 엔티티를 저장해 saved 객체에 반환
return "";
}
}
Repository 만들기
com.example.firstproject에서 새로운 Package를 생성한다(repository 로 생성)
ArticleRepository라는 interface 생성
extends Crud 중 CrudRepository<T, ID> 선택
이는 CrudRepository라는 인터페이스를 상속받는 명령
CrudRepository는 JPA에서 제공하는 인터페이스로, entity를 관리(생성C, 조회R, 수정U, 삭제D)할 수 있다
CrudRepository에 홑화살괄호(<>)를 붙이고 2개의 제네릭 요소(Article, Long)을 받을 수 있다
package com.example.firstproject.repository;
import com.example.firstproject.entity.Article;
import org.springframework.data.repository.CrudRepository;
public interface ArticleRepository extends CrudRepository<Article, Long> {
}
객체 주입하기
ArticleController.java에서 new 키워드로 인터페이스의 구현 객체를 만든적이 없는데 articleRepository 객체를 사용하였다
이는 스프링 부트가 알아서 객체를 만들기 때문으로 @Autowired 어노테이션을 붙이면 스프링 부트가 미리 생성해 놓은 객체를 가져다 연결해 준다(의존성 주입)
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
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 // 스프링 부트가 미리 생성해 놓은 repository 객체 주입(DI)
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());
// 1. DTO를 entity로 변환하기
Article article = form.toEntity();
// 2. Repository로 엔티티를 DB에 저장
Article saved = articleRepository.save(article);
return "";
}
}
서버 재시작 확인(to.String())
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
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());
// 1. DTO를 entity로 변환하기
Article article = form.toEntity();
System.out.println(article.toString());
// 2. Repository로 엔티티를 DB에 저장
Article saved = articleRepository.save(article);
System.out.println(saved.toString());
return "";
}
}
'Spring > 게시판 만들기' 카테고리의 다른 글
데이터 조회 (0) | 2023.09.11 |
---|---|
H2 DB 접속하기 (0) | 2023.09.11 |
form 데이터를 DTO로 받기 (0) | 2023.09.10 |
Template 파일 만들기 (0) | 2023.09.10 |
부스트스랩 사용 (0) | 2023.09.09 |