본문 바로가기

Programming/JPA

[JPA] Part.02_Hibernate를 활용한 JPA 사용(CRUD 연습)

반응형

사전 세팅

아래와 같이 3개의 파일을 생성한다. 파일 명칭은 본인이 컨트롤하는 테이블 명칭에 빗대어 작성해본다.

- Product.java : DB에 테이블과 매칭되는 클래스. Entity를 생성한다.

- ProductRepository.java : DB Layer에 접근하는 인터페이스

- ProductController.java : DB를 브라우저에서 요청하여 호출할 수 있도록 해주는 컨트롤러

Product.java

package com.example.test.domain;

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

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Product { // 객체(모델)생성
	
	@Id
	@GeneratedValue
	private Long id;
	
	@Column(length = 20, nullable = false)
	private String name;
	
	@Column(columnDefinition = "TEXT", nullable = true)
	private Integer price;
	
	private String memo;
	
	@Builder
	public Product(String name, Integer price, String memo) {
		this.name = name;
		this.price = price;
		this.memo = memo;
	}

}

ProductRepository.java

package com.example.test.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.test.domain.Product;

public interface ProductRepository extends JpaRepository<Product, Long> {

}

ProductController.java

package com.example.test.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.test.domain.Product;
import com.example.test.repository.ProductRepository;

@RestController
public class ProductController {
	
	@Autowired
	private ProductRepository productRepository;
	
	@GetMapping(value = "/create")
	public void create(Product product) {
		productRepository.save(product);
	}

}

테이블 생성_CREATE

설정 후 어플리케이션을 시작하면 DB에 자동으로 객체에 매핑되는 테이블이 생성된다.

 

MySQL Workbench에서 테이블 생성 확인

 


테이블 데이터 삽입_INSERT

URL에 파라미터를 직접 입력하여 테이블에 데이터 삽입해본다.

 

Console창에 insert 구문이 실행되었다.

 

MySQL Workbench에서 실제로 데이터가 삽입되었는지 확인해본다.

 


테이블 데이터 읽기_READ

매개변수에 해당하는 값을 DB에서 찾아서 조회하는 findById 메서드를 사용한다.

리턴값으로 Optional을 사용했는데, Optional 클래스는 Java8에 처음 등장한 API로 값이 없는 상황에서 null값을 가질 수 있는 객체를 제어한다.

 

아래 이미지와 같이 CrudRepository 클래스의 findById 메서드는 Optional을 리턴값으로 가지며, 리턴값이 없을 경우 Optional 클래스의 empty 메서드를 호출하여 빈 optional 객체를 반환한다. 

 

상기 개념을 바탕으로 데이터 단건 조회 메서드를 정의한다. 

 

URL에 파라미터를 직접 입력하여 테이블에 데이터 삽입해 이전에 삽입한 데이터를 조회해본다.

 

테이블 전체 데이터를 반환하는 메서드를 정의한다.

 

URL에 파라미터를 직접 입력하여 테이블 전체 데이터를 조회해본다.


테이블 수정_UPDATE

매개변수에 해당하는 값을 DB에서 찾아서 조회하는 findById 메서드를 사용한다.

우선 Repository 클래스에 update 관련 메서드를 정의해야 한다.

package com.example.test.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import com.example.test.domain.Product;

public interface ProductRepository extends JpaRepository<Product, Long> {
	
	@Modifying
	@Transactional
	@Query(value = "UPDATE product m SET m.name=:#{#product.name}, m.memo=:#{#product.memo}, m.price=:#{#product.price}WHERE m.id =:id", nativeQuery=true)
	void update(@Param("product")Product product, @Param("id")Long id);

}

@Modifying : @Query 어노테이션에 정의된 쿼리를 사용하려면 이 어노테이션이 필요하다. 즉 '이 쿼리는 modifying 용도로 사용됨'이라고 용도를 제한하는 느낌. 여기서 modifying 용도란 INSERT, UPDATE, DELET와 DDL 명령어를 의미.

@Transactional : 해당 메서드를 하나의 트랜잭션으로 묶어서 처리한다.

@Query : 사용자가 직접 쿼리를 작성할 경우 필요한 어노테이션.

 

Controller 클래스에서 UPDATE 메서드를 정의한다.

 

URL에 파라미터를 직접 입력하여 테이블을 수정해본다.

 

MySQL Workbench에서 수정 확인.

 


테이블 삭제_DELETE

테이블 삭제 메서드 정의

@GetMapping(value = "/delete")
public void delete(Long id) {
	productRepository.deleteById(id);
}

 

URL에 파라미터를 직접 입력하여 테이블을 삭제해본다.


출처

https://osc131.tistory.com/117

 

[Spring Boot] JPA(Hibernate) 적용

[Spring Boot] JPA(Hibernate) 적용 환경 : Spring Boot 2.6.4, MySQL 5.7, Spring-data-jpa, Lombok ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것..

osc131.tistory.com

https://blog.naver.com/mering_k/221535180407

 

[AWS, 웹 프로젝트] 5. STS+Gradle+JPA 프로젝트 - DB연결하기

STS + SpringBoot + Gradle + JPA 프로젝트 DB연결하기 + jUnit 테스트 localhost:8080으로 J...

blog.naver.com

https://mangkyu.tistory.com/

 

MangKyu's Diary

 

mangkyu.tistory.com

 

반응형

'Programming > JPA' 카테고리의 다른 글

[JPA] 엔티티 매핑  (0) 2022.04.30
[JPA] 영속성 컨텍스트  (0) 2022.04.30
[JPA] JPA 시작!  (0) 2022.04.30
[JPA] Part.01_프로젝트 기본 세팅  (0) 2021.08.09
JPA란 무엇인가  (0) 2021.08.09