Repository 인터페이스란?
Repository 인터페이스는 Spring Data JPA에서 데이터 액세스 계층(Data Access Layer)을 추상화하는 핵심 구성요소입니다. 이를 통해 개발자는 복잡한 SQL을 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있으며, 코드의 간결성과 유지보수성을 크게 향상시킬 수 있습니다.
Repository 인터페이스의 자동화 처리
Spring Data JPA의 Repository 인터페이스를 사용하면, 데이터베이스 테이블 변경 시 다음과 같은 자동화된 처리를 제공합니다.
1. 쿼리 메서드 자동 생성
메서드 이름 기반 쿼리: 메서드 이름만으로도 SQL 쿼리를 자동 생성합니다.
Optional<User> findByEmail(String email); // email 컬럼으로 조회
테이블 구조 변경 시, 엔티티 필드만 수정하면 쿼리 메서드가 자동으로 반영됩니다.
2. 엔티티 매핑 자동 처리
- 엔티티 클래스의 필드와 데이터베이스 컬럼 간의 매핑이 자동으로 이루어집니다.
- 테이블 변경 사항이 생기면, 엔티티 클래스만 수정하면 됩니다.
3. 기본 CRUD 기능 제공
Repository 인터페이스를 상속받으면 다음과 같은 기본 CRUD 메서드를 사용할 수 있습니다.
save(), findById(), findAll(), delete() 등
4. 페이징 및 정렬 기능 지원
페이징(Pageable)과 정렬(Sort) 기능을 자동으로 지원합니다.
Page<User> findByNickname(String nickname, Pageable pageable);
5. 예외 처리 자동화
데이터베이스 예외를 Spring의 예외 계층으로 변환하여 처리합니다.
// SQL 에러 -> DataAccessException으로 변환
Repository 인터페이스 사용 이유
1. 명시적인 DAO 계층임을 표시
Repository는 데이터 액세스 객체(DAO) 계층을 명시적으로 정의합니다.
이를 통해 비즈니스 로직과 데이터 액세스 로직의 명확한 분리가 가능합니다.
2. 특정 데이터베이스 예외를 Spring 예외로 변환
다양한 데이터베이스 예외를 Spring의 예외 계층으로 통일합니다.
DataAccessException 예외를 통해 데이터베이스별 에러를 일관되게 처리
3. 컴포넌트 스캔 대상
@EnableJpaRepositories를 통해 자동으로 스캔되며, Spring 컨테이너에 빈(Bean)으로 등록됩니다.
Repository 인터페이스 생성 방법
1. 의존성 추가
프로젝트의 build.gradle 또는 pom.xml에 Spring Data JPA Dependencies( 의존성을 )를추가합니다.
프로젝트의 build.gradle 또는 pom.xml 파일에 Spring Data JPA 의존성을 추가도 가능합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 엔티티 클래스 생성
JPA 엔티티 클래스를 생성하여 데이터베이스 테이블과 매핑합니다.
@Data
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Column(length = 100, unique = true)
public String email;
@Column(length = 256)
public String password;
@Column(length = 30)
public String nickname;
@Column
public Instant createdAt;
@PrePersist
public void prePersist(){
createdAt = Instant.now();
}
}
3.Repository 인터페이스 생성
JpaRepository를 상속받아 Repository 인터페이스를 생성합니다.
Repository 인터페이스 주요 메서
메서드 설명
save() | 엔티티 저장/수정 |
findById() | ID로 조회 |
findAll() | 전체 데이터 조회 |
delete() | 데이터 삭제 |
count() | 데이터 개수 조회 |
existsById() | 특정 데이터 존재 여부 확인 |
4. 주요 키워드 설명
동작 키워드
- find: 조회
- exists: 존재 여부
- count: 개수
- delete/remove: 삭제
조건절 키워드
- And: 여러 조건 AND
- Or: 여러 조건 OR
- Equals: = (생략 가능)
- Between: between ? and ?
- LessThan: <
- GreaterThan: >
- Like: like
- Contains: like '%?%'
- StartsWith: like '?%'
- EndsWith: like '%?'
- IsNull: is null
- IsNotNull: is not null
- True: = true
- False: = false
정렬 키워드
- OrderBy[속성]Asc: 오름차순
- OrderBy[속성]Desc: 내림차순
반환 타입
- List<T>: 목록
- T: 단건
- Optional<T>: 널 가능성 있는 단건
5. 쿼리 직접 작성
기본 조회 메서드
// where email = ?
List<User> findByEmail(String email);
// where nickname = ?
List<User> findByNickname(String nickname);
// where email = ? and nickname = ?
Optional<User> findByEmailAndNickname(String email, String nickname);
존재 여부 확인
boolean existsByEmail(String email); // email 존재 여부
개수 조회
long countByNickname(String nickname); // nickname으로 개수 조회
삭제
void deleteByNickname(String nickname); // nickname으로 삭제
조건절 다양화
List<User> findByNicknameStartingWith(String prefix); // nickname like 'prefix%'
List<User> findByCreatedAtAfter(Instant date); // created_at > ?
List<User> findByAgeBetween(int min, int max); // age between ? and ?
정렬
List<User> findByNicknameOrderByCreatedAtDesc(String nickname); // order by created_at desc
결과 제한
User findFirstByOrderByCreatedAtDesc(); // limit 1
List<User> findTop5ByOrderByCreatedAtDesc(); // limit 5
페이징
Page<User> findByNickname(String nickname, Pageable pageable);
쿼리 직접 작성
@Query 어노테이션
직접 JPQL 또는 SQL 쿼리를 작성할 수 있습니다.
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
@Query("SELECT c FROM Course c WHERE c.title LIKE %:keyword%")
Page<Course> findAllByTitleContains(String keyword, Pageable pageable);
}
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
@Query("SELECT tc\n" +
"FROM Course tc\n" +
"WHERE tc.title LIKE %:keyword%")
Page<Course> findAllContainsTitle(String keyword, Pageable pageable);
}
Spring Data JPA의 Repository 인터페이스는 데이터베이스 작업을 간소화하고 유지보수성을 높이며, 개발 생산성을 극대화할 수 있는 강력한 도구입니다.
'API > 이론' 카테고리의 다른 글
65. [JAVA] DB 처리 방식 : JDBC, DAO 패턴, JPA (0) | 2025.01.12 |
---|---|
58. [ JAVA ] SpringBoot 에서 JWT적용 및 구현 (0) | 2025.01.12 |
52. [ JAVA ] Spring Boot : 데이터 유효성 검사 적용방법(validation) (0) | 2025.01.10 |
43. [ JAVA ] JWT(Json Web Token)(보안) 정의 (0) | 2024.12.30 |
37. [ JAVA ] 서버 개발 환경 설정 (1) | 2024.12.18 |