[Spring Boot] 데이터 생성 with JPA

Updated:

JPA란?

JPA(Java Persistence API)

  • 현재 자바 진영의 ORM 기술 표준으로 인터페이스의 모음

ORM (Object-relational mapping) Object-relational mapping 객체 관계 매핑 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑해준다. ORM은 객체와 RDB 두 기둥 위에 있는 기술

JPA 설명 참고

JPA를 활용해 데이터 저장하기

목표 : JAP를 활용하여, DB에 데이터를 생성하기

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

Server (Java) -JPA-> Database(SQL)

JPA : DB가 Java를 이해할 수 있게 해줌, 데이터 관리에 편리한 여러 기능 제공(Entity, Repository)

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

DTO를 Entity로 변환 -> Repository를 통해 DB에 저장

3

실습

처리 흐름 개요

  1. Dto를 Entity로 변환
  2. Repository에게 Entity를 DB 안에 저장하게 함


Entity로 변환

ArticleController.java의 createArticle 메소드에 아래 코드 추가

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

-> Article 클래스와 toEntity() 메소드 생성해주기

  1. Entity 작성

entity 패키지에 Article 클래스 생성

4

Article.java에 아래 코드 작성

생성자, toString() 메소드도 생성

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

    @Id // 대표값을 지정, like 주민번호
    @GeneratedValue // 1, 2, 3, ... 자동 생성 어노테이션
    private Long id;

    @Column
    private String title;

    @Column
    private String content;
}

@Entity : Article 클래스 위에 어노테이션 해줘야 DB가 해당 객체를 인식 가능

  1. 변환 메소드 추가

ArticleForm.java 파일에 toEntity 메소드 추가

public Article toEntity() {
    return new Article(null, title, content);
}


데이터 저장하기

ArticleController.java 에서 articleRepository, saved 정의

private ArticleRepository articleRepository;


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

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

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

    return "";
}

ArticleRepository가 없어 인식을 못해 에러가 남

  1. Repository 작성
  • com.example.firstProject 경로에 repository 패키지 생성
  • repository 패키지 안에 ArticleRepository 인터페이스 생성
public interface ArticleRepository extends CrudRepository<관리대상 entity, 관리대상 entity의 대표값의 타입> {

}

JPA 에서 제공하는 Repository 인터페이스 활용 CrudRepository를 상속 받아 제공하는 기능들을 그대로 사용할 수 있다.

ArticleRepository.java

<>의 첫번째 인자로는 관리할 대상 Entity를 넣어줌 = Article 이전에 Article.java에서 @Id로 대표값을 지정했기 때문에 id의 자료형인 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

스프링부트가 자체적으로 생성해주기 때문에 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 // spring boot가 미리 생성해놓은 객체를 가져다가 자동 연결
    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 "";
    }
}


데이터 저장 확인

서버를 실행해 확인

5

6

  • title=’가가’, content=’11111’이 DTO로 담겨졌다.
    ArticleForm{title='가가', content='11111'}
    
  • Article Entity로 변환됐다.
    Article{id=null, title='가가', content='11111'}
    
  • Article Entity를 Repository에 저장하게 했더니 saved로 반환 되었다.
  • id 값이 자동으로 1로
    Article{id=1, title='가가', content='11111'}
    

참고

스프링 강의

Leave a comment