[Spring Boot] JPA를 활용한 데이터 생성 및 저장

coldrice99·2024년 8월 28일
0

이번 시간에는 Spring Boot와 JPA를 활용하여 폼 데이터를 데이터베이스(DB)로 저장하는 과정을 실습하였다. 이전에는 브라우저에서 폼 데이터를 받아오는 방법을 연습하였고, 이번에는 그 데이터를 실제 데이터베이스에 저장하는 방법을 학습하였다.


1. JPA 소개

JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호작용할 수 있게 해주는 API이다. JPA는 자바 객체를 DB가 이해할 수 있는 형식으로 변환해줄 뿐만 아니라 데이터 관리에 편리한 여러 기능을 제공한다. JPA의 핵심 도구로는 EntityRepository가 있다.

  • Entity: 자바 객체를 DB가 이해할 수 있게 규격화된 데이터이다.
  • Repository: 엔티티를 데이터베이스에 전달하고 처리하는 역할을 한다.

이번 실습에서는 DTO를 Entity로 변환하고, 이 엔티티를 Repository를 통해 DB에 저장하는 과정을 진행하였다.


2. DTO를 엔티티로 변환하기

먼저, 컨트롤러에서 폼 데이터를 받아 DTO를 Entity로 변환하였다.

파일 위치: src/main/java/com/example/firstproject/controller/ArticleController.java

@Controller
public class ArticleController {
    @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 "";
    }
}

사용된 어노테이션 설명

  • @Controller:
    • 이 클래스가 Spring MVC의 컨트롤러임을 나타낸다. HTTP 요청을 받아 처리하고, 뷰에 데이터를 전달하는 역할을 한다.
  • @PostMapping:
    • 특정 URL에 POST 요청이 들어왔을 때 해당 메서드를 실행하도록 매핑한다. 이 경우, /articles/create URL로 들어온 POST 요청을 처리한다.

3. 엔티티 작성하기

다음으로, Article이라는 이름의 엔티티를 작성하였다. 이 엔티티는 데이터베이스 테이블과 매핑되며, id, title, content 필드를 포함한다.

파일 위치: src/main/java/com/example/firstproject/entity/Article.java

@Entity
public class Article {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String title;

    @Column
    private String content;

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

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

사용된 어노테이션 설명

  • @Entity:

    • 이 클래스가 JPA 엔티티임을 나타낸다. 데이터베이스의 테이블과 매핑되며, 이 클래스의 인스턴스는 테이블의 행(row)에 해당한다.
  • @Id:

    • 이 필드가 엔티티의 식별자(primary key)임을 나타낸다.
  • @GeneratedValue:

    • 식별자의 값을 자동으로 생성해주는 전략을 지정한다. 기본적으로 데이터베이스에서 자동 증가하는 값을 사용한다.
  • @Column:

    • 이 필드가 데이터베이스의 컬럼(column)에 매핑됨을 나타낸다. 명시하지 않아도 필드는 기본적으로 컬럼으로 매핑된다.

4. 변환 메소드 추가

DTO 클래스에 Entity로 변환하는 메소드를 추가하였다. 이 메소드는 DTO에서 받은 데이터를 기반으로 엔티티 객체를 생성한다.

파일 위치: src/main/java/com/example/firstproject/dto/ArticleForm.java

public class ArticleForm {
    // 기존 코드 생략...

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

5. 리포지토리를 통한 엔티티 저장하기

컨트롤러에서 리포지토리를 사용하여 엔티티를 데이터베이스에 저장하는 코드를 작성하였다.

파일 위치: src/main/java/com/example/firstproject/controller/ArticleController.java

@Controller
public class ArticleController {
    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 "";
    }
}

6. 리포지토리 작성

리포지토리를 작성하여 데이터베이스와의 상호작용을 처리하였다. CrudRepository를 상속받아 기본적인 CRUD 작업을 지원한다.

파일 위치: src/main/java/com/example/firstproject/repository/ArticleRepository.java

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

public interface ArticleRepository extends CrudRepository<Article, Long> {
}

사용된 어노테이션 설명

  • @Repository:
    • Spring에서 데이터 접근 계층을 담당하는 컴포넌트임을 나타낸다. 하지만 CrudRepository를 상속받으면 이 어노테이션을 명시하지 않아도 된다. Spring Data JPA가 자동으로 리포지토리로 인식하고 빈으로 등록한다.

7. 의존성 주입 (DI)

컨트롤러에서 리포지토리 객체를 사용할 수 있도록 의존성 주입(DI)을 설정하였다. Spring Boot가 미리 생성해 놓은 리포지토리 객체를 주입받아 사용한다.

파일 위치: src/main/java/com/example/firstproject/controller/ArticleController.java

@Controller
public class ArticleController {
    @Autowired // 스프링 부트가 미리 생성해놓은 리파지터리 객체를 가져옴(DI)
    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 "";
    }
}

사용된 어노테이션 설명

  • @Autowired:
    • 스프링 프레임워크의 의존성 주입(DI) 기능을 통해, 필요한 빈(Bean)을 자동으로 주입받는다. 이 어노테이션 덕분에 개발자가 직접 객체를 생성할 필요 없이 스프링이 미리 생성해 놓은 빈을 주입받을 수 있다.

8. 데이터 저장 흐름 확인

마지막으로, 데이터가 DTO에서 엔티티로 변환되고, 리포지토리를 통해 데이터베이스에 저장되는 전체 흐름을 확인하였다.

파일 위치: src/main/java/com/example/firstproject/controller/ArticleController.java

@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 "";
    }
}

사용된 어노테이션 설명

  • @GetMapping:
    • 특정 URL에 GET 요청이 들어왔을 때 해당 메서드를 실행하도록 매핑한다. 이 경우, /articles/new URL로 들어온 GET 요청을 처리한다.

결과

데이터를 입력하고 저장 버튼을 누른 후, 데이터베이스에 데이터가 저장되는 과정을 확인할 수 있었다. 아래 이미지는 폼에 데이터를 입력한 화면과, 저장된 결과를 출력한 화면이다.

1. 데이터 입력 화면

2. 저장된 결과 화면


이로써 Spring Boot와 JPA를 활용하여 폼 데이터를 데이터베이스에 저장하는 과정을 마무리하였다. 이번 실습을 통해 Spring Boot의 JPA 기능을 활용하여 데이터베이스와 상호작용하는 기본적인 방법을 익힐 수 있었다.


https://github.com/coldrice99/Spring-boot-study.git


profile
서두르지 않으나 쉬지 않고

0개의 댓글