시뻘건 개발 도전기

#14 : JPA 시작 본문

Framework/spring

#14 : JPA 시작

시뻘건볼때기 2020. 5. 18. 22:22
반응형

  사실 spring에서 MyBatis를 먼저 배우게 되는데 나는 생략하고 가장 핫한 JPA를 공부해볼까 한다. MyBatis를 경험해본 경과 상당히 귀찮고 반복되는 로직과 sql 작성으로인한 오타 등으로 나를 힘들게 했던 기억이 난다.

  JPA는 Java Persistence API로 RDB 관계를 표현하는 자바의 API로써 spring Data JPA는nce API로 RDB 관계를 표현하는 자바의 API로써 spring Data JPA는이러한 JPA에 대한 저장소를 서포트한다. 이 spring Data JPA는 JPA Data Source에 접근해야하는 프로그램 개발에 용이할 수 있다고 정의되어 있다. JPA reference는 다음 문서를 참고하자. 예제도 구할 수 있으니 꼭 참고하자.

 

 

Spring Data JPA - Reference Documentation

Example 108. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v

docs.spring.io

당연히 maven dependency를 걸어야 한다.

<dependencies>
  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
  </dependency>
<dependencies>

 

 

  최신 버전의 JPA를 사용하려면 이하 버전도 상관은 없으나,  5.2.6 이상의 spring 버전을 권장한다고 한다. spring Data 저장소의 추상화 목적은 다양한 영속성 저장소를 위해 사용하는 데이터 접근 레이어를 구현할 때 필요로 하는 뻔히 작성해야하는 코드들의 양을 아주 명시적으로 확 줄이는 것이다.

  이 목적을 위해서 다양한 query keywords가 spring Data에서 제공된다. 버전에 따라서 지원이 되지 않을 수 있으니 자신이 사용하는 버전을 확인해보자. 우리는 앞으로 타입 파라미터를 주어야 한다. 예를 들어본다.

public interface MyRepository extends JpaRepository<Student, Integer> {
	@Entity
	class Student {
		@Id @GeneratedValue
		private Integer id;
	}
}

 

타입 파라미터 정의

정말 좋은게 JPA면 JpaRepository를, MongoDB면 MongoRepostory를 제공하고, 이 녀석들은 모두 CrudRepository를 상속받고 있다는 것이다. 여기서 중점적으로 보아야 할 것은 이 CrudRepository 위에는 PagingAndSortingRepository가 있다. 이 녀석은 paging과 sort에 관련된 기능을 제공한다. 아래 코드를 보면 Sort를 통해 오름차순, 내림차순을 설정할 수 있고, Pageable을 통해 paging 설정을 해서 findAll할 수 있다.

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
	Iterable<T> findAll(Sort sort);
	Page<T> findAll(Pageable pageable);
}

  중요한 점은 paging을 하게 되면, sort도 할 수 있다는 것이다. 실질적으로 개발을 할 때, 대부분 paging하게 될텐데. 비교적 많이 사용되는 것이 Page<T> findAll(Pageable pageable); 일 것이다.

  하나만 기억하자.

"전체 사이즈는 얼마고 몇 번째 페이지를 가지고 올 것이며 어떻게 정렬시켜서 얻을 것인가?"

 

 

  query method를 만드는 법은 4step이 있다.

step1. Repository를 상속한 인터페이스 만들기

interface PersonRepository extends Repository<Person, Long> { … }

step2. query method 정의하기

interface PersonRepository extends Repository<Person, Long> {
	List<Person> findByLastname(String lastname);
}

step3. Spring Data JPA 활성화 시키기. step2에서 정의한 녀석을 찾아서 application Context에 등록 해주는 메커니즘을 처리할 수 있어야 할 것이다.

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EnableJpaRepositories
class Config { … }

step4. 주입 받아서 사용하기

class SomeClient {
	private final PersonRepository repository;

	SomeClient(PersonRepository repository) {
		this.repository = repository;
	}

	void doSomething() {
		List<Person> persons = repository.findByLastname("Matthews");
	}
}
반응형
Comments