만들어 놓은 Entity는 테이블이고 이를 사용하기 위해서는 Repository 가 필요하다
인터페이스 생성
package com.mysite.sbb;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer>{
}
QuestionRepository는 리포지터리로 만들기 위해 JpaRepository 인터페이스를 상속했다.
JpaRepository를 상속할 때는 제네릭스 타입으로 <Question, Integer> 처럼 리포지터리의 대상이 되는 엔티티의 타입(Question)과 해당 엔티티의 PK의 속성 타입(Integer)을 지정해야 한다. 이것은 JpaRepository를 생성하기 위한 규칙이다.
입력 테스트하기
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 qRepo;
@Test
void contextLoads() {
Question q1 = new Question();
q1.setSubject("sbb가 무엇인가요?");
q1.setContent("sbb에 대해서 알고 싶습니다.");
q1.setCreateDate(LocalDateTime.now());
this.qRepo.save(q1);//첫 번째 질문 저장
Question q2 = new Question();
q2.setSubject("스프링부트 모델 질문입니다.");
q2.setContent("id는 자동으로 생성되나요?");
q2.setCreateDate(LocalDateTime.now());
this.qRepo.save(q2);//두 번째 질문 저장
}
}
pom.xml
JUnit테스트를 진행하기 전에 실행하기 전에
sbb서버는 일단 끄고 해야지 오류안남
서버 진행중에 테스트를 하면 오류남
성공적으로 테스트 완료되면 왼쪽 바가 초록색으로 변하고,
오류가 있으면 빨간색으로 변하면서 콘솔에 오류 출력함
h2-console에서 select 문을 사용해서 Question 테이블 전체 확인해 보면
정상적으로 저장된 것이 확인된다.
조회 테스트
Question테이블에 있는 내용을 조회하는 테스트를 하려고 한다.
package com.mysite.sbb;
import java.time.LocalDateTime;
import java.util.List;
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 qRepo;
@Test
void contextLoads() {
// 조회 테스트
List<Question> all = this.qRepo.findAll();//모든 질문을 다 가져옴
for (Question q : all) {
System.out.println(q.getSubject());
}
}
}
ID,내용, 날짜도 추가해서 테스트해봄
그럼 하나만 출력하고자 하면?
id로 찾기
Optional<Question> oq = this.qRepo.findById(1); //하나만 가져올 때?
if (oq.isPresent()) {
Question q = oq.get();// Question이 리턴
System.out.println(q.getSubject());
Optional이라는 타입으로 변경됨.
찾았을 때 아이디가 없을 경우에 null값 에러가 발생하게 됨.
null값일 경우에는 null로 처리하고
null값이 아닐 경우에만 question으로 리턴해줌
isPresent : 값을 가지고 있으면 true 반환
if문으로 oq에 안에 내용이 있을 경우에는
제목을 가져오게끔 코드 작성을 함
그리고 findById와 같이
findBySubject을 만들어서 사용도 가능함
제목으로 검색을 해서
//내용으로 조회할 때
Question q = this.qRepo.findBySubject("sbb가 무엇인가요?");
System.out.println(q.getContent());
내용을 가져와서 출력함
현재 콘솔에 어떤 sql문을 사용하여 해당 결과가 나왔는지 뜸
이런 내용은 보기가 좀 불편하므로 로그의 포맷을 변경하고자 함
아래의 내용을 추가하여 포맷을 좀 더 보기 쉽게 출력하게 만든다
spring.jpa.properties.hibernate.format_sql=true
그리고 조건에 AND를 사용해서 조회도 가능하다
QuestionRepository에서 AND조건을 가진 findBySubjectAndContent 를 추가한다.
package com.mysite.sbb;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer>{
Question findBySubject(String subject);
Question findBySubjectAndContent(String subject,String content);//제목과 내용이 같을 때
}
SbbApplicationTests 로 돌아와서 아래의 내용을 추가함
//제목과 내용으로 조회할 때
Question q = this.qRepo.findBySubjectAndContent("sbb가 무엇인가요?","sbb에 대해서 알고 싶습니다.");
assertEquals(1, q.getId());// id가 1이면 받음
포맷 변경도 잘 적용됐고, AND문도 잘 적용된게 확인된다.
https://blog.naver.com/drv982/222920396333
수정 ,삭제 테스트
Optional<Question> oq = this.qRepo.findById(1); //하나만 가져올 때?
if (oq.isPresent()) {
Question q = oq.get();// Question이 리턴
q.setSubject("수정된 제목");
this.qRepo.save(q); //수정(업데이트됨)
//save메소드 안의 입력객체가 id가 없으면 입력 있으면 수정
실제로 DB에 수정됐는지 확인하기
서버 실행 후 DB에서 검색하면
SUBJECT가 수정된 제목으로 출력됨을 알 수 있다.
삭제하기 ( id로)
//삭제하기
this.qRepo.deleteById(1); // 아이디로 삭제할 때
db확인하기
객체를 넣어서도 삭제가 가능하다
//객체로 삭제하기
Optional<Question> oq = this.qRepo.findById(1); //하나만 가져올 때?
if (oq.isPresent()) {
Question q = oq.get();// Question이 리턴
this.qRepo.delete(q); //삭제
'BACKEND > SpringBoot' 카테고리의 다른 글
패키지 도메인 별 분리하기 (0) | 2023.11.08 |
---|---|
답변 AnswerRepository 생성 및 데이터 저장 ,검색 (0) | 2023.11.08 |
JPA의 개념 및 H2데이터베이스 사용 (0) | 2023.11.07 |
스프링부트 프로젝트의 구조, port번호 설정 및 context-path 설정 (0) | 2023.11.07 |
설정 추가 +(lombok) (0) | 2023.11.07 |