엔티티를 사용해서 생성한 테이블에서 저장, 조회, 수정, 삭제의 작업을 수행하려면 리포지터리를 사용해야 한다. 리포지터리는 테이블에 접근하고, 데이터를 관리하는 메서드(ex : findAll, save)를 제공한다.
다음과 같은 Member 엔티티를 관리하는 리포지터리를 만들 것이다.
src/main/java 폴더 안의 프로젝트 패키지에 MemberRepository 인터페이스를 만들고 JPaRepository를 상속받는다.
package com.example.springstudy;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<Member,String> {
}
JPaRepository에는 데이터 관리를 위한 메서드들이 내장되어 있다. 타입 매개변수에는 이 리포지터리가 관리할 엔티티 클래스와 이 클래스의 기본키의 타입을 지정해주면 된다.
리포지터리를 테스트하기 위해 JUnit을 설치할 것이다.
테스트 폴더에 테스트 코드를 작성한다.
package com.example.springstudy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringStudyApplicationTests {
@Autowired
private MemberRepository memberRepository;
@Test
void testJpa() {
Member m1 = new Member();
m1.setId("abc");
m1.setEmail("abc@abc.com");
m1.setPassword("1234");
this.memberRepository.save(m1);
}
}
SpringStudyApplicationTests.java
테스트코드 실행
SQL이 실행된 것을 볼 수 있다.
pgAdmin4을 열어서 확인해보면 데이터가 삽입되어있다.
데이터를 하나 더 삽입하였다.
Member m2 = new Member();
m2.setId("dfg");
m2.setEmail("dfg@dfg.com");
m2.setPassword("5678");
this.MemberRepository.save(m2);
테이블의 데이터를 모두 조회하려면 리포지터리의 findAll 메소드를 사용한다.
@Test
void testJpa() {
List<Member> all = this.memberRepository.findAll();
assertEquals(2, all.size());
for(Member m:all){
System.out.print(m.getId() + " ");
System.out.print(m.getEmail() + " ");
System.out.print(m.getPassword() + ", ");
}
}
assertEquals는 테스트에서 예상한 결과와 실제 값이 일치하는지 검증하는 메소드다. 지금 테이블에는 두개의 행이 들어있으니 예상대로라면 테스트가 통과해야 한다.
테스트 코드를 실행해보면 데이터를 정상적으로 받아오고 테스트도 통과한 것을 볼 수 있다.
Id를 통해서 조회할 땐 findId 메소드를 사용한다.
@Test
void testJpa() {
Optional<Member> m = this.memberRepository.findById("abc");
m.ifPresent(member -> assertEquals("abc", member.getId()));
}
결과값의 타입은 Optinal로 해야 한다. 값이 존재하지 않을 수도 있기 때문이다. Optianal 타입에는 값이 존재하면 콜백을 실행하는 ifPresent라는 람다식이 있다. 여기서 테스트를 검증하면 된다.
이메일로 데이터를 조회하려면 인터페이스를 수정해야 한다. MemberRepository 인터페이스에 findByEmail을 추가한다.
public interface MemberRepository extends JpaRepository<Member,String> {
Optional<Member> findByEmail(String email);
}
그리고 테스트코드를 실행한다.
@Test
void testJpa() {
Optional<Member> m = this.memberRepository.findByEmail("abc@abc.com");
m.ifPresent(member -> assertEquals("abc@abc.com", member.getEmail()));
}
테스트를 실행하면 정상적으로 통과된다.
인터페이스에 추상메소드만 선언해놓으면 JPA가 메소드명을 분석해서 쿼리를 자동으로 생성해준다.
데이터 업데이트
@Test
void testJpa() {
Optional<Member> m = this.memberRepository.findById("dfg");
m.ifPresent(member -> {member.setEmail("def@def.com");
this.memberRepository.save(member);}
);
}
데이터 삭제
@Test
void testJpa() {
Optional<Member> m = this.memberRepository.findById("dfg");
m.ifPresent(member -> this.memberRepository.delete(member));
}
'스프링' 카테고리의 다른 글
[Springboot] 스프링부트 프로젝트 빌드하기 (0) | 2024.03.07 |
---|---|
스프링부트 REST API (0) | 2024.02.28 |
스프링부트 jpa PostgreSQL 사용하기 (0) | 2024.02.26 |
스프링 부트 프로젝트 구조 알아보기 (0) | 2024.02.26 |
스프링부트 시작하기 (0) | 2024.02.26 |