JPA Repository (select delete create)

devyunie·2024년 8월 27일

SpringBoot

목록 보기
12/13
post-thumbnail

Repository 레이어?

  • 데이터 베이스 작업을 수행하는 영역

데이터 접근 계층

  • 상황에 따라 영속(Persistence) 계층이라고도 한다.
  • 데이터베이스에 접근해야 하는 작업을 수행한다.

비즈니스 로직에서 데이터베이스에 접근하여 데이터베이스 작업을 담당하고, 결과를 Service 계층에 반환한다.


JPA Interface

  • JPA 기반 Repository를 구현하는 데 사용되는 주요 인터페이스이다.
  • PagingAndSortingRepository 및 CrudRepository인터페이스를 확장하고, 추가적으로 JPA 관련 기능들을 제공한다.
  • Repository를 생성할 때 필수로 상속 받아 작성해준다.

JpaRepository 인터페이스의 주요 기능

기본 CRUD 연산

  • 저장, 검색, 업데이트 및 삭제 기능을 포함하여 일반적인 데이터 액세스 작업을 수행할 수 있는 메서드를 제공합니다.

페이징 및 정렬

  • 페이징 및 정렬 기능을 지원하여 대량 데이터 집합을 관리할 수 있는 메서드를 제공한다.

JPA 관련 추가 기능

  • 엔티티 관리자, 플러시 모드, 트랜잭션 등과 같은 JPA 관련 설정 및 기능에 대한 액세스를 제공한다.

Repository 영역

JpaRepository 인터페이스 상속 방법

  • 특정 Entity에서 사용할 Repository 인터페이스를 생성하고 JpaRepository를 상속받는다.
public interface SampleTable1Repository extends JpaRepository<T,ID>{

JpaRepository Interface 설명

JpaRepository<T,ID>

  • JPA 기반의 Repository를 구현하는 주요 인터페이스
  • 기본 CRUD 기능 및 정렬 기능 등을 포함
  • JPA 기반의 Repository를 생성할 땐 필수로 상속해야함

<T,ID>
JpaRepository의 제네릭 타입

  • 매개타입 T : 해당 Repository가 어떤 Entity의 Repository인지 지정
  • 매개타입 ID : 해당 Repository가 사용하는 Entity의 기본키를 지정

@Repository

  • 해당 클래스를 Spring Bean으로 등록하는 어노테이션
  • @Component랑 동일한 역할을 한다.

‼️ interface에 @Repository를 적용한 이유

  • JPA를 사용하면 JpaRepository 인터페이스를 상속받은 인터페이스는 JPA가 구현체를 자동으로 생성

전체소스

경로: base > Repository > SampleTable1Repository.java

@Repository
public interface SampleTable1Repository
extends JpaRepository<SampleTable1Entity, String>{

}

Entity

전체 소스

경로: base > entity > SampleTable1Entity.java

Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name="sample_table_1")
@Table(name="sample_table_1")
public class SampleTable1Entity {

    @Id
    @Column(name="sample_id", nullable=false, unique=true, updatable=false, length=10)
    private String sampleId;
    
    @Column(name="sample_column", nullable=false)
    private Integer sampleColumn;
}

DTO 영역

전체소스

경로: base > dto > PostSample1RequestDto.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PostSample1RequestDto {

	//유효성 검사
	@NotBlank
	@Length(max=10)
	private String SampleId;
	
	@NotNull
	private Integer sampleColumn;

}

Controller 영역

전체소스

경로: base > controller > SampleController.java
POST http://127.0.0.1:4000/sample
->성공(201) 반환 / 실패(500) 반환

@RestController
@RequestMapping("/sample")
@RequiredArgsConstructor
public class SampleController {

    private final SampleService sampleService;
    
    @PostMapping("")
    public ResponseEntity<String> postSample1 (
        @RequestBody @Valid PostSample1RequestDto requestBody
    ) {
        ResponseEntity<String> response = sampleService.postSample1(requestBody);
        return response;
    }

    @DeleteMapping("/{sampleId}")
    public ResponseEntity<String> deleteSample1 (
        @PathVariable("sampleId") String sampleId
    ) {
        ResponseEntity<String> response = sampleService.deleteSample1(sampleId);
        return response;
    }

    @GetMapping("")
    public ResponseEntity<String> queryMethod() {
        ResponseEntity<String> response = sampleService.queryString();
        return response;
    }

Service 영역

Interface 생성

경로: base > service > SampleService.java

public interface SampleService {
    
    ResponseEntity<String> postSample1(PostSample1RequestDto dto);
    ResponseEntity<String> deleteSample1(String sampleId);
}

Interface 구현

SELECT (SQL : SELECT)

  1. repository를 이용하여 조회 (findAll, findById)
 SampleTable1Entity existEntity = sampleTable1Repository.findById(sampleId).get();
  1. Repository를 이용하여 조회 (existById)
boolean isExisted = sampleTable1Repository.existsById(sampleId);
if(isExisted) return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("이미 존재하는 기본키 입니다.");

CREATE (SQL : INSERT)

  1. Entity 클래스의 인스턴스 생성
String sampleId = dto.getSampleId();
Integer sampleColumn = dto.getSampleColumn();
	
SampleTable1Entity entity = new SampleTable1Entity(sampleId, sampleColumn);
  1. 생성한 인스턴스를 repository를 이용하여 저장

save() 메서드: 저장

  • 만약에 Primary Key가 동일한 레코드가 존재하지 않으면 레코드 생성
  • 동일한 레코드가 존재하면 수정을 합니다. (덮어쓰기)
sampleTable1Repository.save(entity);	

DELETE (SQL : DELETE)

  1. repository를 이용하여 ID(PK)에 해당하는 레코드 삭제
  • 해당하는 레코드가 존재하지 않아도 에러가 발생하지 않음
 sampleTable1Repository.deleteById(sampleId);
  1. repository를 이용하여 Entity에 해당하는 레코드 삭제
  • 해당하는 레코드가 존재하지 않을때 수행 불가능
SampleTable1Entity entity = sampleTable1Repository.findById(sampleId).get();
sampleTable1Repository.delete(entity);

전체소스

경로: base > service > implement > SampleServiceImplement.java

@Service
@RequiredArgsConstructor
public class SampleServiceImplement implements SampleService{

	private final SampleTable1Repository sampleTable1Repository;
	
    @Override
    public ResponseEntity<String> postSample1(PostSample1RequestDto dto) {
    
	String sampleId = dto.getSampleId();
	Integer sampleColumn = dto.getSampleColumn();
	
	// SampleTable1Entity existEntity = sampleTable1Repository.findById(sampleId).get();

	boolean isExisted = sampleTable1Repository.existsById(sampleId);
	if(isExisted) return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("이미 존재하는 기본키 입니다.");

	SampleTable1Entity entity = new SampleTable1Entity(sampleId, sampleColumn);
	
	sampleTable1Repository.save(entity);
	
	return ResponseEntity.status(HttpStatus.CREATED).body("성공");
	}
    
    @Override
    public ResponseEntity<String> deleteSample1(String sampleId) {
        
        sampleTable1Repository.deleteById(sampleId);

        SampleTable1Entity entity = sampleTable1Repository.findById(sampleId).get();
        sampleTable1Repository.delete(entity);

        return ResponseEntity.status(HttpStatus.OK).body("성공");

    }
}

0개의 댓글