Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

DTO를 데이터베이스에 저장하기 본문

Spring/게시판 만들기

DTO를 데이터베이스에 저장하기

빌드이너프 2023. 9. 10. 17:35

스프링 부트 프로젝트 생성시 추가한 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