점프 투 스프링부트를 참고하여 학습,작성하였습니다.
1.데이터 조회
1-1.findAll 메서드
assertEquals 메서드와
List 인터페이스를 사용하기 위해 다음 2개를 import한다.
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
JUnit 테스트 메서드를 작성한다.
questionRepository의 findAll 메서드를 호출하여 모든 Question 객체를 조회한다.
그후 assertEquals로 사이즈가 2인지, 첫번째 객체가 "사과는 무엇인가요?"인지 를 검사한다.
@Test
void testFindall(){
List<Question> all = this.questionRepository.findAll();
assertEquals(2, all.size());
Question q = all.get(0);
assertEquals("사과는 무엇인가요?", q.getSubject());
}
1-2.findById 메서드
Optional은 값이 존재할 수도 있고 존재하지 않을 수도 있는 컨테이너 객체다. 이를 import 한다.
import java.util.Optional;
questionRepository의 findById(1)로 id=1인 Question 객체를 조회하여 Optional객체 oq에 넣는다.
그후 oq.isPresent()로 객체가 있음을 확인하면
실제 Question 객체에 Optional 객체를 가져오고 assertEquals를 실행한다.
@Test
void testFindId(){
Optional<Question> oq = this.questionRepository.findById(1);
if(oq.isPresent()) {
Question q = oq.get();
assertEquals("사과는 무엇인가요?", q.getSubject());
}
}
1-3.findBySubject 메서드
findBySubject메서드는 사용자 정의 메서드이다.
QuestionRepository.java에서 추가한다.
package com.example.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.model.Question;
public interface QuestionRepository extends JpaRepository<Question, Integer> {
Question findBySubject(String subject);
}
Spring Data JPA는 메서드 이름을 분석하여 JPQL(Java Persistence Query Language) 쿼리를 생성한다.
(String subject)은 매개변수로 subject 필드값을 찾는데 사용한다. 반환은 Question 타입으로 한다.
findBy: 데이터베이스에서 엔티티를 조회
Subject: 조회 기준이 되는 subject 필드
=>
SELECT q FROM Question q WHERE q.subject = ?1
Question findBySubject(String subject);
questionRepository에서 subject가 "사과는 무엇인가요?"와 일치하는 값을 조회한다.
조회한 Question 객체의 id가 1인지를 검사한다.
@Test
void testFindSubject(){
Question q = this.questionRepository.findBySubject("사과는 무엇인가요?");
assertEquals(1, q.getId());
}
1-4.findBySubjectAndContent 메서드
subject와 content를 함께 조회하는 사용자 정의 메서드를 만든다.
Spring Data JPA는 메서드 이름을 분석하여 JPQL쿼리를 생성하므로
findBy: 데이터베이스에서 엔티티를 조회
Subject: Question 엔티티의 subject 필드
And:여러 개의 조건을 결합하여 검색할 때 사용하는 키워드
Content:Question 엔티티의 content 필드
=>
select q from Question q where q.subject = ?1 and q.content = ?2
Question findBySubjectAndContent(String subject, String content);
Subject ="사과는 무엇인가요?"
Content="사과는 대체 뭘까...."
인 Question을 조회하여 Id가 1인지 검사한다.
@Test
void findSubjectAndContent(){
Question q = this.questionRepository.findBySubjectAndContent("사과는 무엇인가요?", "사과는 대체 뭘까....");
assertEquals(1, q.getId());
}
1-5.findBySubjectLike 메서드
Subject에 특정 문자열이 포함된 Question 객체를 찾는 메서드를 만든다.
특정문자열을 포함한다는 특성상 여러개가 조회될수있으므로
import java.util.List; 를통해 리스트를 사용한다.
List<Question> findBySubjectLike(String subject);
findBySubjectLike의 매개변수에는 정규표현식으로 사과%로 사과로 시작하는 문자열을 조회한다.
@Test
void findSubjectLike(){
List<Question> qList = this.questionRepository.findBySubjectLike("사과%");
Question q = qList.get(0);
assertEquals("사과는 무엇인가요?", q.getSubject());
}
2.답변 생성,조회
2-1.답변 생성
@Autowired는 스프링에서 빈(Bean)을 자동으로 주입하는 데 사용
(하나의 객체가 다른 객체를 필요로 할 때 그 객체를 제공하는 과정)
AnswerRepository 인터페이스를 주입받기 위해 @Autowired 애노테이션을 사용한다.
@SpringBootTest
class DemoApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Autowired
private AnswerRepository answerRepository;
Question객체중 Id가 2인 객체를 조회한다. 그후
Answer 객체를 생성후 Content,Question,CeateDate를 메소드를 통해 지정해준다.
save메소드를 통해 answerRepository를 저장한다.
@Test
void testCreateAnswer(){
Optional<Question> oq = this.questionRepository.findById(2);
assertTrue(oq.isPresent());
Question q = oq.get();
Answer a = new Answer();
a.setContent("방패는 방어구입니다..");
a.setQuestion(q); //Question 객체필요
a.setCreateDate(LocalDateTime.now());
this.answerRepository.save(a);
}
QUESTION 번호가 2번인 ANSWER이 만들어졌다.
2-2.답변 조회
@Test
void testFindIdAnswer(){
Optional<Answer> oa = this.answerRepository.findById(1);
assertTrue(oa.isPresent());
Answer a = oa.get();
assertEquals(2, a.getQuestion().getId());
}
3.쿼리와 관련된 JPA의 메서드
- And:여러 개의 조건을 모두 만족하는 데이터
- Or:여러 개의 조건 중 하나라도 만족하는 데이터
- Between:특정 범위에 속하는 데이터
- GreaterThan, LessThan, GreaterThanEqual, LessThanEqual:주어진 값보다 크거나 작은 데이터
- IsNull, IsNotNull: 값이 null인 데이터를 검색하거나 null이 아닌 데이터
- Like, NotLike, StartingWith, EndingWith, Containing:문자열을 포함하는 데이터
- OrderBy: 검색 결과를 특정 필드를 기준으로 정렬
- IgnoreCase:대소문자를 구분하지 않고 검색
반응형
'BackEnd > SpringBoot' 카테고리의 다른 글
[Spring Boot] 리포지터리 수정,삭제 (0) | 2024.07.01 |
---|---|
[Spring Boot] 리포지터리로 데이터 저장 (0) | 2024.06.21 |
[Spring Boot] 엔티티 테이블 매핑 (0) | 2024.06.21 |