반응형
✅리포지터리
- 엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없다.
- 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 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
💡 데이터 수정하기
💡 데이터 삭제하기
반응형
'기타 > 백엔드 기초' 카테고리의 다른 글
스트링부트 | 엔티티 Entity (0) | 2023.05.02 |
---|---|
스트링부트 | 데이터베이스 (0) | 2023.05.02 |
스트링부트 | 스프링부트 프로젝트 구조 (0) | 2023.05.02 |
스트링부트 | Spring Boot Devtools, Live Reload, Lombok 사용법 및 설치 방법 (0) | 2023.05.02 |
스트링부트 | 컨트롤러 Controller (0) | 2023.05.02 |
스트링부트 | 스트링부트(String Boot)란? (0) | 2023.04.26 |
자바 Java | 접근제어자: 객체 지향 프로그래밍의 캡슐화 원칙과 예시 코드 (0) | 2023.03.07 |
자바 Java | import문 사용법과 단축키 (0) | 2023.03.07 |