본문 바로가기
자바/스프링 부트

[Spring boot] 05. 스프링 부트 JPA(Java Persistance API)로 데이터 생성하기

by drCode 2021. 6. 2.
728x90
반응형

안녕하세요

 

이번 포스팅은 JPA로 데이터 생성하기를 해보도록 하겠습니다.

 

우선 그전에

 

JPA는 무엇일까요?

 

JPA란,  Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 

 

JPA는 기술 명세 역할을 하는 것 같네요

 

(1) DTO -> Entity

이제 DB에 데이터를 넣으려면 화면에서 서버를 통해서 DB로 전달해야겠죠?

 

DB에 전달하기 위해서는 DTO로 넘어온 데이터를

 

DB의 특정 테이블의 속성들을 가진 Entity로 변환을 해주어야합니다.

 

SampleArticleController.java

@Controller
public class SampleArticleController {

    @GetMapping("/sampleArticle/article")
    public String newArticleForm() {

        return "sampleArticle/sampleArticle";
    }

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

        // 1. DTO를 변환! Entity!
        SampleArticle sa =  form.toEntity();

        // 2. Repository에게 Entity를 EB안에 저장하게 함!

        return "";
    }
}

 

createArticle 메서드에 보면 

 

SampleArticle sa = form.toEntity(); 가 쓰인 것을 볼 수 있다.

 

그런데 기존에는 SampleArticle 이란 클래스를 정의한 적도 없고, form 객체인 SampleArticleForm 클래스에 toEntity라는메서드도 없다.

 

이번에는 SampleArticle이라는 클래스를 선언해 줄 것이다.

 

SampleArticle이라는 클래스를 선언하기 전,

 

src > main > java > com.프로젝트.패키지에 entity라는 패키지를 하나 만들어준다.

 

그리고 SampleArticle이라는 클래스를 만든다.

 

SampleArticle.java

package com.example.fisrtProject.entity;

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

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

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

    @Column
    private String content;

    public SampleArticle() {}

    public SampleArticle(Long id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    @Override
    public String toString() {
        return "SampleArticle{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

 

 

여기서 보면 주의깊게 봐야할 것이 있다.

 

어노테이션인데, Entity, Column, Id 가 있는 것을 알 수 있다.

 

- 1. Entity : DB가 해당 객체를 인식할 수 있게 해주는 어노테이션이다. 

- 2. Column : 클래스 내의 필드를 컬럼으로 인식할 수 있게 해주는 어노테이션

- 3. Id : 테이블로 따지면 각각의 행들을 식별할 수 있게 해주는 id 어노테이션

 

 

기본생성자 없을 시 에러 발생

 

 

여기서 기본생성자가 없으면 에러가 난다.

 

JPA 엔티티는 영속성을 이용하는데
기존 엔티티 어노테이션이 붙은 객체를 생성을 해놓고
영속성 컨텍스트에서 비교를 하는식으로 로직이 진행되는데
기본 생성자가 없어서 에러가 나는 형식이다.

 

그래서 기본 생성자를 사용하지 않더라도 선언을 해주어야 한다.

 

이제 다시 SampleArticleController에서 dto의 toEntity() 메서드를 구현해보도록 하자.

 

 

SampleArticleForm.java

package com.example.fisrtProject.dto;

import com.example.fisrtProject.entity.SampleArticle;

public class SampleArticleForm {

    private String title;
    private String content;

    public SampleArticleForm(String title, String content) {
        this.title = title;
        this.content = content;
    }

    @Override
    public String toString() {
        return "SampleArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

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

 

toEntity 메소드의 반환형은  SampleArticle이어야 할 것이다.

 return 값으로 매개변수 생성자를 return 해주면 된다.

 

(2) Repository 작성

 

src > main > java > 프로젝트명에 repository라는 패키지를 생성하고,

 

 

SampleArticleRepository.java 인터페이스를 만든다.

 

 

SampleArticleRepository.java 

package com.example.fisrtProject.repository;

import com.example.fisrtProject.entity.SampleArticle;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface SampleArticleRepository extends CrudRepository<SampleArticle,Long> {

}

 

다음과 같이 작성하는 데, 

CrudRepository<전달할 엔티티, 엔티티를 구분하는 id>를 상속받아야 한다.

 

CrudRepository를 상속받으면 인터페이스에 구현하지 않아도 상속받은 메서드들을 사용할 수 있다.

 

SampleArticleController.java

package com.example.fisrtProject.controller;

import com.example.fisrtProject.dto.SampleArticleForm;
import com.example.fisrtProject.entity.SampleArticle;
import com.example.fisrtProject.repository.SampleArticleRepository;
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 SampleArticleController {

    @Autowired // 스프링 부트가 미리 생성해 놓은 객체를 가져다가 자동으로 연결
    private SampleArticleRepository saRepository;

    @GetMapping("/sampleArticle/article")
    public String newArticleForm() {

        return "sampleArticle/sampleArticle";
    }

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

        // 1. DTO를 변환! Entity!
        SampleArticle sa =  form.toEntity();

        // 2. Repository에게 Entity를  DB안에 저장하게 함!
        SampleArticle saved = saRepository.save(sa);

        return "";
    }
}

 

@Autowired
private SampleArticleRepository saRepository;

 

 

@Autowired를 사용하면 부트가 미리 생성해 놓은 객체를 가져다가 자동으로 연ㄱㄹ해준다

 

SampleArticle saved = saRepository.save(sa); 를 사용함으로써

CrudRepository에 구현된 save를 사용할 수 있다.

 

이제 내용을 입력해서  Submit을 눌러 서버에 전송하고,

 

DB에 정상적으로 데이터가 입력이 되는지 확인해보겠다.

 

 

먼저 출력문을 넣어주고

 

실행 결과를 보면

 

첫번째 출력은 화면에서 서버로 넘어왔을 때 입력받은 데이터들을 보여주고,

 

두번째 출력은 엔터티로 변환한 형태이다. id는 null이다

 

세번째 출력은 id값에 1이 들어가있다.

 

DB에 들어가서 자동으로 id값을 넣어준 것이다.

 

DB에 정상적으로 값이 들어간 것이 확인됐다.

728x90
반응형

댓글