본문 바로가기
기타/백엔드 기초

스트링부트 | 리포지터리

by YUNI Heo 2023. 5. 2.
반응형

 

✅리포지터리

  • 엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없다. 
  • 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리가 필요하다.

  • 리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스이다. 
  • 데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요하다.
  • 이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다.

 

💡 QuestionRepository 인터페이스 생성

  • QuestionRepository는 리포지터리로 만들기 위해 JpaRepository 인터페이스를 상속했다. 
  • JpaRepository를 상속할 때는 제네릭스 타입으로 <Question, Integer> 처럼 리포지터리의 대상이 되는 엔티티의 타입(Question)과 해당 엔티티의 PK의 속성 타입(Integer)을 지정해야 한다. 
  • 이것은 JpaRepository를 생성하기 위한 규칙이다.
  • Question 엔티티의 PK(Primary Key) 속성인 id의 타입은 Integer 이다.

package com.mysite.sbb;

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

public interface QuestionRepository extends JpaRepository<Question, Integer> {

}

 

💡 AnswerRepository 인터페이스 생성

package com.mysite.sbb;

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

public interface QuestionRepository extends JpaRepository<Question, Integer> {

}

 

💡 스프링부트 테스트 프레임워크

작성한 리포지터리를 테스트하기 위해서 JUnit 기반의 스프링부트의 테스트 프레임워크를 사용한다.

JUnit은 테스트코드를 작성하고 작성한 테스트코드를 실행하기 위해 사용하는 자바의 테스트 프레임워크이다.


  • @SpringBootTest 애너테이션은 SbbApplicationTests 클래스가 스프링부트 테스트 클래스임을 의미한다.
  • @Autowired 애너테이션은 스프링의 DI 기능으로 questionRepository 객체를 스프링이 자동으로 생성해 준다.
    • 객체를 주입하기 위해 사용하는 스프링의 애너테이션이다. 
    • 객체를 주입하는 방식에는 @Autowired 외에 Setter 또는 생성자를 사용하는 방식이 있다. 
    • 순환참조 문제와 같은 이유로 @Autowired 보다는 생성자를 통한 객체 주입방식이 권장된다. 
    • 하지만 테스트 코드의 경우에는 생성자를 통한 객체의 주입이 불가능하므로 테스트 코드 작성시만 @Autowired를 사용하고 실제 코드 작성시에는 생성자를 통한 객체 주입방식을 사용하겠다. 
    • DI(Dependency Injection) - 스프링이 객체를 대신 생성하여 주입한다.
  • @Test 애너테이션은 testJpa 메서드가 테스트 메서드임을 나타낸다.
    • 위 클래스를 JUnit으로 실행하면 @Test 애너테이션이 붙은 메서드가 실행된다.

  • testJpa 메서드의 내용을 잠시 살펴보자. 
    • testJpa 메서드는 q1, q2 라는 Question 엔티티 객체를 생성하고 
    • QuestionRepository를 이용하여 그 값을 데이터베이스에 저장하는 코드이다.
package com.mysite.sbb;

import java.time.LocalDateTime;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
class SbbApplicationTests {

    @Autowired
    private QuestionRepository questionRepository;

    @Test
    void testJpa() {        
        Question q1 = new Question();
        q1.setSubject("sbb가 무엇인가요?");
        q1.setContent("sbb에 대해서 알고 싶습니다.");
        q1.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q1);  // 첫번째 질문 저장

        Question q2 = new Question();
        q2.setSubject("스프링부트 모델 질문입니다.");
        q2.setContent("id는 자동으로 생성되나요?");
        q2.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q2);  // 두번째 질문 저장
    }
}

  • 로컬서버를 시작하고 H2 콘솔에 접속하여 다음 쿼리문을 실행해 보자.
SELECT * FROM QUESTION

  • 우리가 저장한 Question 객체의 값이 데이터베이스에 저장된 것을 확인한 수 있다.
  • id는 Question 엔티티의 기본 키(Primary Key)이다. 
    • id는 앞에서 엔티티를 생성할 때 설정했던대로 데이터를 생성할 때 속성값이 자동으로 1씩 증가하는 것을 확인할 수 있다.
    • Question 엔티티의 id는 @GeneratedValue 설정을 했다.

 

💡 데이터 조회하기

findAll은 데이터를 조회할때 사용하는 메서드이다.

findById

findBySubject

findBySubjectAndContent

findBySubjectLike

 

💡 데이터 수정하기

 

💡 데이터 삭제하기

반응형