Java

[Spring Boot] REST API 구현(1) JPA Entity, Repository 개념 및 작성 방법

cob 2022. 10. 8. 18:06
REST API
REST(Representational State Transfer) 란?
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.

REST API 란?
자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다.

 

 

JPA
JPA 란?
DB 테이블객체 사이의 매핑 처리해주는 ORM(객체와 DB 맵핑해주는 것)이란 기술의 표준이다.

 

* 개발 환경 아래 주소를 보고 참조 *
https://cocococo.tistory.com/36

* Source Code *
https://github.com/kangilbin/TodoList

 

 

 

 


1. Model 클래스( Entity ) 생성

실제 DB의 테이블과 매칭이 되는 클래스이며, Entity 클래스라고 불린다. JPA를 사용할 경우 Entity 클래스를 통해 DB 데이터를 수정한다.

 

1-1) Entity 조건

1) 테이블마다 그에 상응하는 Entity 클래스가 존재한다.
2) Entity 클래스는 클래스 그 자체가 테이블을 정의해야 한다.
3) Entity 클래스는 @NoArgsConstructor (매개변수가 없는 생성자)가 필요하다.
4) Entity 클래스는 @Data (Getter/Setter)가 필요하다.
5) 기본키를 지정해 줘야한다.

 

1-2) 로직 구현 예

import javax.persistence.Entity;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity               //엔티티 이름을 부여하고 싶다면 @Entity("TodoEntity")
@Table(name = "Todo") //테이블 이름을 지정 DB의 Todo테이블에 매핑된다는 뜻
public class TodoEntity {
	@Id
	@GeneratedValue(generator="system-uuid")
	@GenericGenerator(name="system-uuid", strategy="uuid")
	private String id; 			//이 오브젝트의 아이디
	private String userId; 		// 이 오브젝트를 생성한 사용자의 아이디
	private String title; 		// Todo 타이틀(예: 운동하기)
	private boolean done; 		//true - todo를 완료한 경우(checked) 
}
@Table(name = "Todo")로 테이블 이름을 지정하지 않으면 @Entity의 이름을 테이블 이름으로 간주한다.
@Entity에도 이름을 지정하지 않은 경우 클래스의 이름을 테이블 이름으로 간주한다.
  • @Id : 기본 키가 될 필드에 지정한다.
  • @GeneratedValue : ID를 자동으로 생성하겠다는 뜻이다.
    매개 변수 generator어떤 방식으로 ID를 생성할지 지정할 수 있다. "system-uuid"는 GenericGenerator에 정의된 generator가 아니라 나만의 generator를 사용하고 싶을 경우 이용한다. 기본 generator로는 INCREMENTAL, SEQUENCE, IDENTITY 등이 있다.
  • @GenericGenerator : generator 커스텀하여 GeneratedValue 가 참조하여 사용할 수 있다.
    uuid사용을 위해 매개변수 strategy로 “uuid”를 넘기고 이렇게 uuid를 사용하는 “system-uuid”라는 이름의 GenericGenerator를 만들었다.

 

 

 


2. Repository 클래스 생성

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.example.demo.model.TodoEntity;

@Repository
public interface TodoRespository extends JpaRepository<TodoEntity, String>{
	// ?1은 메서드의 매개변수의 순서 위치다.
	//@Query("select id, userId, title, done from Todo t where t.userId = ?1")
	List<TodoEntity> findByUserId(String userId);
}
* Repository를 구현하는 클래스가 없이도 동작하는 이유 *
스프링은 MethodInterceptor라는 AOP 인터페이스를 사용한다. MethodInterceptor는 우리가 JPA Repository의 메서드를 부를 때마다 이 메서드 콜을 가로채 간다.(Spring AOP APIs) 가로챈 메서드의 메서드 이름을 확인하고 메서드 이름을 기반으로 쿼리를 작성한다.
  • findByUserId(String userId) : 위의 설명과 같이 해당 메서드를 작성하면 스프링 데이터 JAP가 메서드 이름을 파싱해 
    select * from TodoRespository where userId = '{userId}'와 같은 쿼리를 작성해 실행한다.
    메서드 이름은 쿼리, 매개변수는 where문에 들어갈 값을 의미한다.
  • 복작한 쿼리는 @Query어노테이션을 사용해 지정할 수 있다.
* 메서드 이름 장성 방법 *
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

 

 

 

반응형