리포지터리 (Repository) ?
엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없다. 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리가 필요하다.
리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스이다.
데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete) 를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다.
QuestionRepository 생성
package com.myspringboot.ssh;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer>{
}
리포지터리로 만들기 위해 JpaRepository 인터페이스를 상속했다.
JpaRepository를 상속할 때는 제네릭스 타입으로 <Question(엔티티타입), Integer(속성타입)> 처럼 리포지터리의 대상이 되는 엔티티의 타입(Question)과 해당 엔티티의 PK의 속성 타입(Integer)을 지정해야 한다
AnswerRepository 생성
package com.myspringboot.ssh;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AnswerRepository extends JpaRepository<Answer, Integer>{
}
Repository를 생성했기 때문에 Question과 Answer 테이블에 데이터를 저장하거나 조회가 가능해졌다.
데이터 생성
SshApplicationTests 수정
package com.myspringboot.ssh;
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 // @SpringBootTest 애너테이션은 SbbApplicationTests 클래스가 스프링부트 테스트 클래스임을 의미
class SshApplicationTests {
@Autowired // @Autowired 애너테이션은 스프링의 DI 기능으로 questionRepository 객체를 스프링이 자동으로 생성
private QuestionRepository questionRepository;
/*
* @Test 애너테이션은 testJpa 메서드가 테스트 메서드임을 나타낸다.
* 위 클래스를 JUnit으로 실행하면 @Test 애너테이션이 붙은 메서드가 실행됨
*/
@Test
void testJpa() {
Question q1 = new Question();
q1.setSubject("스프링부트가 무엇인가요?");
q1.setContent("스프링부트에 대해서 알고 싶습니다.");
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); // 질문 저장
}
}
@Autowired
객체를 주입하기 위해 사용하는 스프링의 애너테이션이다.
객체를 주입하는 방식에는 @Autowired 외에 Setter 또는 생성자를 사용하는 방식이 있다.
순환참조 문제와 같은 이유로 @Autowired 보다는 생성자를 통한 객체 주입방식이 권장된다.
하지만 테스트 코드의 경우에는 생성자를 통한 객체의 주입이 불가능하므로 테스트 코드 작성시에만 @Autowired를 사용하고 실제 코드 작성시에는 생성자를 통한 객체 주입방식을 사용한다.
SbbApplicationTests 클래스 실행
STS 상단의 Run -> Run As -> JUnit Test 를 선택하거나 이 경로에 JUnit Test 가 보이지 않는다면 위 사진과 같이 실행버튼 오른쪽의 아랫방향 화살표를 누른 후 Run As -> JUnit Test 를 실행하면 된다.
정상적으로 실행이 되면 아래와 같이 JUnit화면이 나타나고 결과가 보여질 것이다.
(초록색이 표시되면 성공이고 빨간색이 표시되면 실패)
실제 데이터베이스에 값이 잘 들어갔는지 확인해 보기 위해 다시 로컬서버를 시작하고 H2 콘솔에 접속하여 조회
H2 콘솔 접속 경로 : 로컬서버 시작 후 http://localhost:8080/h2-console
그런데, 위의 Test 코드에서 ID값을 입력하지 않았는데, 자동으로 입력되어 있는 이유는 뭘까?
그 이유는 Question 엔티티의 id는 @Id 와 @GeneratedValue 설정을 했기 때문이다.
id 값은 Question 테이블의 기본키이며 기본키를 자동으로 생성할 때에는 @Id와 @GenerratedValue 어노테이션이 함께 사용되어야 한다.
@GeneratedValue 어노테이션에 대해서는 다음에 자세히 기록하겠다.
참조 및 출처 : https://wikidocs.net/160890
'Backend > Spring Boot' 카테고리의 다른 글
[Spring Boot] JPA Repository (3/3) (0) | 2022.08.10 |
---|---|
[Spring Boot] JPA Repository (2/3) (0) | 2022.08.08 |
[Spring Boot] Entity (엔티티) (0) | 2022.08.04 |
[Spring Boot] JPA (0) | 2022.08.04 |
[Spring Boot] 스프링부트 도구 설치 (0) | 2022.08.03 |