개발자의 오르막

스프링데이터 JPA 기본 개념과 메소드 기능 확인 본문

ORM/JPA

스프링데이터 JPA 기본 개념과 메소드 기능 확인

계단 2019. 9. 24. 10:21

# 스프링데이터 Reference

  - https://spring.io/projects/spring-data

 

Spring Projects

The Spring portfolio has many projects, including Spring Framework, Spring IO Platform, Spring Cloud, Spring Boot, Spring Data, Spring Security...

spring.io

 


# 스프링 데이터 구성

출처 : 인프런-백기선 스프링데이터 JPA 강좌

- 스프링 데이터 : SQL & NoSQL 저장소 지원 프로젝트의 묶음을 의미

- 스프링 데이터 common : 여러 저장소 지원 프로젝트의 공통 기능 제공

                                    (Repository, Bean 등의 공통 기능 제공)

- 스프링 데이터 REST : 저장소의 데이터를 하이퍼 미디어 기반 HTTP 리소스로(REST API)로

                              제공하는 프로젝트

- 스프링 데이터 JPA : 스프링데이터 Common 이 제공하는 기능에 JPA 관련 기능 추가

 


 

# 스프링 데이터 Common

출처 : 인프런-백기선 스프링데이터 JPA 강좌

- JPA 프로젝트를 구성할 때, 우리는 Custom Repository를 인터페이스로 생성한다.

 

- Custom Repository는 JpaRepository를 상속받는다.

 

- JpaRepository는 PagingAndSortingRepository를 상속받는다.

 

- PagingAndSotringRepository는 CrudRepository를 상속받는다.

  주로 페이징과 Sort 의 메소드를 갖고 있다.

 

- CrudRepository는 Repository를 상속받는다. 이때 Repository는 마커 인터페이스로

  실질적 기능은 하지 않는다.

   CrudRepository에서 데이터의 Crud에 전반적으로 사용하는 메소드를 갖고있다.

 

* 어노테이션

  - @NoRepositoryBean : 실제 빈을 등록하지 않도록 방지하는 어노테이션

     중간 단계의 Repository 는 모두 이 어노테이션이 등록되어 있다.

 

 

# h2 데이터베이스 환경 추가하기

  - 우선, 각각의 레파지토리의 메소드를 시험해보기 전에 실제 DB에 운용되면

    번거로워지기 때문에 h2데이터베이스를 활용한 Test 클래스를 작성한다.

 

 

# 실습하기

@RunWith(SpringRunner.class)
@DataJpaTest
public class PostRepositoryTest {

	@Autowired
	PostRepository postRepository;
	
	@Test
	public void crudRepository() {
		// Given
		Post post = new Post();
		post.setTitle("hello spring boot common");
		assertThat(post.getId()).isNull();
		
		// When
		Post newPost = postRepository.save(post);
		
		// Then
		assertThat(newPost.getId()).isNotNull();
		
		// When
		List<Post> posts = postRepository.findAll();
		
		// Then
		assertThat(posts.size()).isEqualTo(1);
		assertThat(posts).contains(newPost);
		
		// When
		Page<Post> page = postRepository.findAll(
                          PageRequest.of(0, 10));
		
		// Then
		assertThat(page.getTotalElements()).isEqualTo(1);
		assertThat(page.getNumber()).isEqualTo(0);
		assertThat(page.getSize()).isEqualTo(10);
		assertThat(page.getNumberOfElements()).isEqualTo(1);
		
		page = postRepository.findByTitleContains("spring", 
               PageRequest.of(0, 10));
		assertThat(page.getTotalElements()).isEqualTo(1);
		assertThat(page.getNumber()).isEqualTo(0);
		assertThat(page.getSize()).isEqualTo(10);
		assertThat(page.getNumberOfElements()).isEqualTo(1);
		
		// When
		long spring = postRepository.countByTitleContains("spring");
		assertThat(spring).isEqualTo(1L);
	}
}

 

* 참고!

- DataJpaTest 는 @Transactional 에서 기본으로 롤백이 적용되기 때문에
  하이버네이트에서 쿼리 자체를 날리지 않는다.

Comments