[Spring Boot] 데이터 생성 with JPA
Updated:
JPA란?
JPA(Java Persistence API)
- 현재 자바 진영의 ORM 기술 표준으로 인터페이스의 모음
ORM (Object-relational mapping) Object-relational mapping 객체 관계 매핑 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑해준다. ORM은 객체와 RDB 두 기둥 위에 있는 기술
JPA를 활용해 데이터 저장하기
목표 : JAP를 활용하여, DB에 데이터를 생성하기
DB(DataBase) : 데이터를 관리하는 창고
Server (Java) -JPA-> Database(SQL)
JPA : DB가 Java를 이해할 수 있게 해줌, 데이터 관리에 편리한 여러 기능 제공(Entity, Repository)
Entity : Java객체(DTO)를 DB가 이해할 수 있도록 규격화된 데이터
DTO를 Entity로 변환 -> Repository를 통해 DB에 저장
실습
처리 흐름 개요
- Dto를 Entity로 변환
- Repository에게 Entity를 DB 안에 저장하게 함
Entity로 변환
ArticleController.java의 createArticle 메소드에 아래 코드 추가
// 1. Dto를 Entity로 변환
Article article = form.toEntity();
-> Article 클래스와 toEntity() 메소드 생성해주기
- Entity 작성
entity 패키지에 Article 클래스 생성
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가 해당 객체를 인식 가능
- 변환 메소드 추가
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가 없어 인식을 못해 에러가 남
- 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 "";
}
}
데이터 저장 확인
서버를 실행해 확인
- 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