본문 바로가기
Back/Spring

Day17_#7_IntelliJ 스프링부트 JPA로 DB에 데이터 생성

by uxia 2023. 6. 1.
Mission
사용자에게 입력받은 데이터를 JPA를 통해 DB에 저장

 

 

Day12에서 브라우저에 인풋창을 생성해 사용자에게 데이터를 입력받고

Controller에서 확인해봤는데

이번엔 입력받은 데이터를 DB에 저장해보려고 한다.

 

DB는 데이터베이스로, 데이터를 관리하는 창고다.

엑셀처럼 생겼는데 엑셀보다 더 편리하고 정확하게 데이터를 관리할 수 있다.

 

나는 Java를 사용하여 코드를 입력하는데,

DB는 SQL 언어를 사용하기 때문에 Java를 이해하지 못한다.

한국인이랑 인도인이랑 언어 소통이 안되는 느낌이랄까.

 

여기서 Java와 DB의 통역가 역할을 해주는 것이 JPA다.

통역가 역할에 더해 데이터 관리에 편리한 여러 기능들도 제공한다.

 

그 중 핵심 기능 Entity와 Repository가 있는데,

Entity는 Java 객체를 DB가 이해할 수 있게 잘 규격화된 데이터인데

Entity는 Repository라는 일꾼을 통해 DB에 전달되고 처리된다고 한다.

 


 

나는 Day5에서 H2 Database와 Spring Data JPA를 설치해줘서

DB나 JPA 설치 없이 바로 진행하면 된다.

 


 

저번에 하던 ArticleController에 이어

DTO를 Entity로 변환하고,

Entity를 Repository를 통해 DB에 저장하는 코드를 작성한다.

 

우선 Form 데이터를 Entity로 변환하는 코드이다.

Article article = form.toEntity();

에러가 났는데

Article이라는 Class가 존재하지 않고,

Entity라는 메소드가 존재하지 않아서 발생한 에러다.

 

Create class 'Article'을 해주고

자동으로 뜨는 .Controller가 아닌 .entity로 생성해준다.

 

기본 패키지에 entity라는 디렉토리가 만들어졌고

그 안에 Article Class가 추가됐다.

 

package com.example.xia_firstproject.entity;

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

@Entity // @Entity를 붙여줘야 DB가 해당 객체를 인식할 수 있음
public class Article {
	
    @Id // 주민등록번호와 같은 역할을 하는 대표값을 지정
    @GeneratiedValue
    private Long id;

    @Column
    private String title;

    @Column
    private String content;

}

코드는 DTO 만들 때와 유사하다.

 

title과 content를 받고,

DB에서 인식을 할 수 있도록 Entity라는 어노테이션을 선언해야한다.

 

그리고 title과 content도 DB에서 이해할 수 있게

Column 어노테이션을 붙여줘야된다.

 

그리고 마지막으로 대표값을 하나 넣어줘야하는데,

사람으로 따지면 주민등록번호 같은 느낌이다.

 

 

여기까지 Entity Class를 선언하는 과정이었고,

이제 Entity를 만들기 위해 생성자를 추가해야한다.

 

우클릭 → Generate → Constructor → 세 개 드래그 → OK

 

같은 방식으로 toString() 매소드까지 추가해준다.

 

다시 ArticleController에 가면 Article 에러가 사라진 걸 확인할 수 있다.

 


 

이제 두 번째 에러인 toEntity() 를 해결해줘야하는데,

DTO인 form에서 Entity로 변환하는 메소드를 추가해주면 된다.

 

Create method 'toEntity' in 'ArticleForm'을 클릭하면

ArticleForm DTO Class로 이동된다.

 

여기서 추가로 toEntity 메소드를 만들어주면 된다.

 

앞서 추가한 생성자가 id, title, content를 입력받고있어

그대로 추가해주면 된다.

 

다시 ArticleController로 가보면 에러가 사라져있다.

 


 

이제 Repository를 통해 DB에 저장할 차례다.

Repository가 있다는 가정 하에 코드를 작성한다.

Article saved = articleRepository.save(article);

articleRepository가 article 데이터를 save하는 메소드를 호출하도록 한다. 

 

articleRepository가 없기 때문에 에러가 나는데,

articleRepository를 사용하기 위해

Field에 선언해준다.

 

private ArticleRepository articleRepository;

또 오류가 난다.

ArticleRepository가 없기 때문.

만들어줘야된다.

 

기본 패키지에 New → Package → .repository 패키지 생성

 

repository 디렉토리에 ArticleRepository 이름의 Interface를 만들어준다.

 

repository를 직접 구현할 수도 있지만,

JPA에서 제공하는 Repository Interface를 활용해서

쉽게 만들 수 있다.

 

CrudRepository 라는 인터페이스를 extends로 상속받아

CrudRepository가 제공하는 기능들을

정의 없이 그대로 사용할 수 있다.

 

CrudRepository 옆에 <>를 넣고 그 안에

두 개의 Parameters를 넣어줘야한다.

 

관리 대상 NTT로 Article을 넣어주고,

관리대상 NTT에서 대표값의 타입인 Long을 넣어준다.

package com.example.xia_firstproject.repository;

import com.example.xia_firstproject.entity.Article;
import org.springframework.data.repository.CrudRepository;

public interface ArticleRepository extends CrudRepository<Article, Long> {

}

 

이렇게 하면 CRUD 동작을 추가 구현 없이 사용할 수 있게 된다.

 

CRUD 동작에 대한 코드를 보고싶으면

Cmd 누른 상태로 CrudRepository를 클릭해서 확인할 수 있다.

 

이제 다시 ArticleController에 들어가면

에러가 사라지고 위에 ArticleRepository가 import된 걸 확인할 수 있다.

 


 

마지막으로 articleRepository에 대한 객체를 만들어줘야하는데,

스프링부트가 자체적으로 제공하는 기능을 사용해서 만든다.

 

 


 

이제 확인을 위해 sout을 해준다.

 

브라우저를 켜고 확인해줘야하는데,

http://localhost:8080/articles/create

주소로 접속해서 값을 입력하고 제출해준다.

DTO인 ArticleForm이 Entity인 Article로 변환되고,

마지막 줄에 같은 Article, title, content지만

자동으로 id 값이 생성되면서 DB에 저장된 걸 확인할 수 있다.

 

 

굿..👏