엔티티가 데이터베이스 테이블을 생성했다면, 리포지터리는 이와 같이 생성된 데이터베이스 테이블의 데이터들을 저장, 조회, 수정, 삭제 등을 할 수 있도록 도와주는 인터페이스이다.
새롭게 생성한 인터페이스를 리포지터리로 만들기 위해 JpaRepository 인터페이스를 상속한다.
JpaRepository : JPA가 제공하는 인터페이스 중 하나로 CRUD 작업을 처리하는 메서드들을 이미 내장하고 있어 데이터 관리 작업을 좀 더 편리하게 처리할 수 있다.
'JpaRepository<Question,Integer>'은 Question 엔티티로 리포지터리를 생성하고 엔티티의 기본 키가 Integer임을 지정해 준 것이다.
CRUD : Create, Read, Update, Delete의 앞글자만 따 만든 단어로, 데이터 처리의 기본 기능을 의미한다.
리포지터리를 이용하여 데이터를 저장하려면 질문을 등록하는 화면과 사용자가 입력한 질문 관련 정보를 저장하는 컨트롤러, 서비스 파일 등이 필요하다. 하지만, JUnit을 사용하면 이러한 프로세스를 따르지 않아도 리포지터리만 개별적으로 실행해 테스트해볼 수 있다.

SbbApplicationTests 클래스가 스프링 부트의 테스트 클래스임을 의미
질문 엔티티의 데이터를 생성할 때 리포지터리(QuestionRepository)가 필요하므로 @Autowired 애너테이션을 통해 스프링의 의존성주입(DI, Dependency Injection)이란 기능을 사용하여 QuestionRepository의 객체를 주입함
testJpa 메서드가 테스트 메서드임을 나타낸다.

크킄 !!

question 테이블에 저장된 모든 데이터를 조회하기 위해서 리포지터리(questionRepository)의 findAll 메서드를 사용.
데이터 사이즈가 2인지 확인하기 위해 JUnit의 assertEquals 메서드를 사용했는데, 이 메서드는 테스트에서 예상한 결과와 실제 결과가 동일한지를 확인하는 목적으로 사용한다. 즉, 데이터를 올바르게 가져오는지를 확인하는 것이다. assertEquals(기댓값, 실젯값)와 같이 작성한다.

findById 메서드를 사용해, questionRepository를 사용해서 데이터베이스에서 id가 1인 질문을 조회, 이때 리턴 타입은 Question이 아닌 Optional이다. 호출한 값이 존재할 수도 있고, 존재하지 않을 수도 있어서 그럼ㅇㅇ
QuestionRepository 인터페이스

findBySubject 메서드를 선언만 하고 구현은 하지 않았음
**SbbApplicationTests.java 테스트 코드

인터페이스에서 findBySubject 메서드를 구현하지 않았는데 어떻게 실행이 되는걸까? jPA에 리포지터리의 메서드명을 분석하여 쿼리를 만들고 실행하는 기능이 있기 때문에 가능하다. 'findBy + 엔티티의 속성명'과 같은 리포지터리의 메서드를 작성하면 입력한 속성의 값으로 데이터를 조회할 수 있다.
해당 메서드를 호출할 떄 실제 데이터베이스에서 실행되는 쿼리문은 다음과 같다.

And 연산자를 사용해 subject와 content를 함께 조회한다.

hibernate : SQL을 일일이 쓰지 않아도 자바의 클래스와 테이블을 자동으로 매핑해주는 기술
Like 연산자를 사용해 특정 문자열을 포함하는 데이터를 찾는다.



질문 엔티티의 데이터를 조회하고, subject 속성을 '수정된 제목'으로 수정함.
변경 된 질문을 데이터베이스에 저장하기 위해 this.questionRepository.save(q)와 같이 리포지터리의 save 메서드를 사용함.

리포지터리의 delete 메서드를 사용하여 데이터를 삭제함. 잘 삭제되었는지 확인하기 위해 count 메서드를 사용해 테이블 행의 개수를 확인함.
CRUD 실습 완료 !!