JpaRepository 인터페이스JpaRepository<Entity, ID> 인터페이스를 상속받는 자신만의 Repository 인터페이스를 정의하기만 하면 됩니다.public interface UserRepository extends JpaRepository<User, Long> {
// 이 인터페이스를 정의하는 것만으로...
}save(entity): 데이터 저장 (INSERT) 및 수정 (UPDATE)findById(id): ID로 단건 조회 (SELECT)findAll(): 모든 데이터 조회 (SELECT)deleteById(id): ID로 데이터 삭제 (DELETE)count(): 전체 데이터 개수 조회개념: 정해진 명명 규칙에 따라 메서드 이름을 작성하면, Spring Data JPA가 해당 이름에 맞는 JPQL(Java Persistence Query Language) 쿼리를 자동으로 생성하여 실행하는 기능입니다.
규칙: findBy, countBy 등의 접두사 뒤에 엔티티의 필드 이름을 조합하여 작성합니다.
예시:
public interface UserRepository extends JpaRepository<User, Long> {
// SELECT * FROM users WHERE username = ?
Optional<User> findByUsername(String username);
// SELECT * FROM users WHERE email = ? AND status = ?
List<User> findByEmailAndStatus(String email, UserStatus status);
// SELECT COUNT(*) FROM users WHERE status = ?
long countByStatus(UserStatus status);
}
장점: 간단한 조회 쿼리는 SQL이나 JPQL을 한 줄도 작성하지 않고, 메서드 선언만으로 해결할 수 있어 매우 편리합니다.
@Entity: 이 클래스가 JPA가 관리하는 엔티티임을 선언합니다.@Table: 엔티티와 매핑될 테이블의 이름을 지정합니다.@Id: 테이블의 기본 키(Primary Key)에 해당하는 필드임을 나타냅니다.@GeneratedValue(strategy = GenerationType.IDENTITY): 기본 키 값을 데이터베이스(e.g., MySQL의 AUTO_INCREMENT)가 자동으로 생성하도록 위임합니다.@Column: 필드와 매핑될 컬럼의 세부 속성(이름, nullable, unique 등)을 지정합니다.테스트 코드는 내가 작성한 코드가 의도한 대로 정확하게 동작하는지를 검증하는 코드입니다. 테스트 코드는 코드의 안정성을 보장하고, 리팩토링 시 자신감을 주며, 코드 자체를 설명하는 문서의 역할을 합니다.
Spring Boot Test: Spring Boot는 테스트를 매우 쉽게 작성할 수 있도록 강력한 테스트 지원 기능을 제공합니다.
@SpringBootTest:
@DataJpaTest:
JpaRepository, EntityManager 등)만 컨테이너에 로드하므로 @SpringBootTest보다 훨씬 가볍고 빠릅니다.@Test, @DisplayName 등의 어노테이션을 제공.assertThat(결과).isEqualTo(기대값)과 같이 자연스러운 문법을 제공.@DataJpaTest // JPA 계층 테스트
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
@DisplayName("사용자 저장 및 조회 테스트")
void saveAndFindUserTest() {
// given - 테스트 준비
User newUser = new User("testuser", "password123");
// when - 테스트 실행
User savedUser = userRepository.save(newUser);
Optional<User> foundUser = userRepository.findById(savedUser.getId());
// then - 결과 검증
assertThat(foundUser).isPresent(); // foundUser가 존재하는지 확인
assertThat(foundUser.get().getUsername()).isEqualTo("testuser");
}
}
JpaRepository 인터페이스와 쿼리 메서드를 통해 데이터 접근 계층의 개발을 극적으로 단순화합니다.@Entity, @Id 등의 어노테이션을 통해 데이터베이스 테이블과 매핑됩니다.@SpringBootTest는 통합 테스트에, @DataJpaTest는 JPA 계층의 단위 테스트에 사용되며, 가볍고 빠르며 자동 롤백 기능을 제공하여 Repository 테스트에 매우 유용합니다.