[Spring Boot] [1] 4. 데이터 생성 with JPA

윤경·2021년 7월 30일
1

Spring Boot

목록 보기
7/79
post-thumbnail
post-custom-banner

강의링크


데이터 생성 with JPA

이번 시간에는 받아온 데이터를 데이터 베이스에까지 저장시키는 것이 목표

DB: (DataBase) 데이터를 관리하는 창고

DB는 java를 이해하지 못한다. 데이터베이스는 SQL이라는 언어를 사용한다. 그럼 대체 어떻게 데이터베이스에게 java를 명령할 수 있을까?
➡️ JPA(라는 도구)를 이용

JPA는 java를 DB가 이해할 수 있게 해줄뿐 아니라 데이터 관리에 편리한 여러 기능까지 제공한다.
(핵심 기능: Entity, Repository)

Entity: java객체(DTO)를 DB가 이해할 수 있도록 규격화된 데이터

DTO를 Entity로 변환하고 Repository를 통해 DB에 저장시킨다.

실습

ArticleController.java에

	@PostMapping("/articles/create")
    public String createArticle(ArticleForm form) {
        System.out.println(form.toString());

        // 1. DTO를 Entity로 변환
        Article article = form.toEntity();

        // 2. Repository에게 Entity를 DB 안에 저장

        return "";
    }

이때 Article클래스와 toEntity() 메소드가 없어서 에러가 난다. 그러면 눌러서 클래스를 생성해주면 된다.

DTO를 Entity로 변환

Article 클래스 생성

위치에 controller를 지우고 entity를 적어 생성한다. 그러면 기본 디렉토리 안에 entity 디렉토리와 그 안에 Article 파일이 생성되어 있을 것이다.

Article 파일로 이동해 아래와 같은 코드를 기재

package com.example.firstproject.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity // DB가 해당 객체를 인식 가능하도록 함
public class Article {

    @Id // 대표값을 지정 (마치 주민등록번호처럼 title과 content가 달라도 구분짓도록)
    @GeneratedValue // 1, 2, 3 ... 처럼 알아서 어노테이션
    private Long id;

    @Column
    private String title;

    @Column
    private String content;
    
}

그리고 이전 포스트처럼 생성자를 만들어주어야 한다. +toString() 메소드까지. (오른쪽 클릭으로)

toEntity() 메소드 생성

클래스를 생성했던 것처럼 에러 메시지를 눌러 Article파일에 메소드를 생성시킨다.

ArticleForm.java 파일에 코드가 생성되는데 Article을 생성해 반환해주도록 아래 코드 기입

        return new Article(null, title, content);

📌 여기까지하면 Article article = form.toEntity(); 에 생겼던 에러가 모두 사라진다.

DB에 데이터 저장

다시 ArticleController.java 파일로 돌아가 주석 2번이었던 DB에 저장할 코드를 입력

	// 2. Repository에게 Entity를 DB 안에 저장
    Article saved = articleRepository.save(article);

주석 1번에서 받았던 article을 저장시키겠다는 것!
그런데 지금은 articleRepository라는 객체가 없기 때문에 다시 에러 발생

이 객체를 사용하기 위해 필드에 추가하기(아직 객체가 생성된 상태는 아님 그런데 객체를 생성할 필요는 ❌. 스프링부트가 자체적으로 생성해주기 때문. 다만 @Autowired필요. 아래 첨부한 코드에서 확인하기)
이렇게 같은 파일 public class ArticleController 안에 코드 작성

이때 Repository에 떴던 에러는 사라진다. 이제 save라는 메소드가 인식이 안될 것이다.

이제 Repository를 생성하자
➡️ controller, dto, entity 디렉토리와 같은 레벨에 repository패키지를 생성해준다.

그리고 이렇게 Interface로 ArticleRepository라는 자바 클래스를 생성해준다.

repository를 직접 만들 수도 있지만 JPA가 제공해주는 기능을 이용해 생성
그러려면 ArticleRepository파일에서 extends CrudRepository를 하여 (자동 import) 기능을 상속받기

<>를 이용해 안에 <"관리할 대상", "관리할 대상에서 대표값의 타입">을 넣어주어야 한다.
➡️ Article.java에 가보면 @Id로 대표값을 지정했었다. 이때 우리는 type을 Long으로 지정했었다.

⬇️ 헷갈리니까 코드 첨부 (ArticleRepository.java)

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의 코드

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에게 Entity를 DB 안에 저장
        Article saved = articleRepository.save(article);
        // 잘 저장 되었는지 확인
        System.out.println(saved.toString());


        return "";
    }
}

이를 가지고 잘 되었는지 결과 확인하기
서버를 재실행 시킨 다음 localhost:8080/articles/new로 이동
입력 후 submit!
확인!

결론

처음에는 title과 content가 DTO로 담겨졌으며 ➡️ 이것이 Entity로 변환되어 ➡️ 변환된 것(Article)을 Repository에 저장하도록 시켰더니 ➡️ 결과가 된 Entity가 반환되어 saved에 저장

마지막을 보면 title과 content는 똑같은데 id가 자동 생성된 것을 확인할 수 있다.


점점 내용이 복잡해지네 😶

profile
개발 바보 이사 중
post-custom-banner

0개의 댓글