728x90
반응형
DB는 H2 DB를 사용하였습니다. 관련 설정이나 설치방법은 제외하겠습니다.
테스트에 사용할 엔티티를 생성
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본생성자를 만들어 주는 기능
public class Member extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "member_id")
private Long Id;
private String username;
private int age;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "team1_id")
private Team team;
public Member( String username) {
this.username = username;
}
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
if(team != null){
changeTeam(team);
}
}
public Member(String username, int age) {
this.username = username;
this.age = age;
}
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
Repository로 사용할 인터페이스를 생성하여 준다.
// Data JPA 사용시 "JpaRepository<엔티티,엔티티의 키값>" 상속받아 사용한다.
public interface MemberRepository extends JpaRepository<Member,Long> ,MemberRepositoryCustom{
}
인터페이스에서 상속받은 JpaRepository를 살펴보면 아래처럼 기본적으로 JPA에서 제공하는 기능들을 사용할 수 있다.
/*
* Copyright 2008-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.jpa.repository;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
/**
* JPA specific extension of {@link org.springframework.data.repository.Repository}.
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findAll()
*/
@Override
List<T> findAll();
/*
* (non-Javadoc)
* @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)
*/
@Override
List<T> findAll(Sort sort);
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findAll(java.lang.Iterable)
*/
@Override
List<T> findAllById(Iterable<ID> ids);
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(java.lang.Iterable)
*/
@Override
<S extends T> List<S> saveAll(Iterable<S> entities);
/**
* Flushes all pending changes to the database.
*/
void flush();
/**
* Saves an entity and flushes changes instantly.
*
* @param entity
* @return the saved entity
*/
<S extends T> S saveAndFlush(S entity);
/**
* Deletes the given entities in a batch which means it will create a single {@link Query}. Assume that we will clear
* the {@link javax.persistence.EntityManager} after the call.
*
* @param entities
*/
void deleteInBatch(Iterable<T> entities);
/**
* Deletes all entities in a batch call.
*/
void deleteAllInBatch();
/**
* Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is
* implemented this is very likely to always return an instance and throw an
* {@link javax.persistence.EntityNotFoundException} on first access. Some of them will reject invalid identifiers
* immediately.
*
* @param id must not be {@literal null}.
* @return a reference to the entity with the given identifier.
* @see EntityManager#getReference(Class, Object) for details on when an exception is thrown.
*/
T getOne(ID id);
/*
* (non-Javadoc)
* @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example)
*/
@Override
<S extends T> List<S> findAll(Example<S> example);
/*
* (non-Javadoc)
* @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example, org.springframework.data.domain.Sort)
*/
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
Data JPA 관련 문서
https://spring.io/projects/spring-data-jpa#learn
마지막으로 테스트 클래스를 생성한 뒤 확인
@SpringBootTest
@Transactional
class MemberJpaRepositoryTest {
@Autowired
MemberJpaRepository memberJpaRepository;
@Test
public void testMember() {
Member member = new Member("memberA");
//Member 객체 저장
Member savedMember = memberJpaRepository.save(member);
//Member 객체 조회
Member findMember = memberJpaRepository.find(savedMember.getId());
//검증
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
//영속성 컨텍스트 에서 가져오기 때문에 같은 객체로 가져온다.
assertThat(findMember).isEqualTo(member);
}
728x90
반응형
'Spring & Spring Boot' 카테고리의 다른 글
[ Spring Cloud ] 마이크로서비스 와 클라우드 개념정리 - 1편 (0) | 2021.07.15 |
---|---|
[ Spring-Boot ] JPA @EntityGraph 사용하기 (0) | 2021.06.14 |
Spring Cloud Netflix - Eureka (0) | 2021.06.11 |
[ Spring-Boot ] JPA QueryDsl 정렬 사용하기 (1) | 2021.05.23 |
[ Spring-Boot ] JPA Embedded 타입 사용하기 (0) | 2021.05.23 |