API/이론

59. [ JAVA ] SpringData JPA로 Repository 인터페이스 생성

천재단미 2025. 1. 12. 01:35
728x90
반응형

 

 

 

 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 인터페이스는 데이터베이스 작업을 간소화하고 유지보수성을 높이며, 개발 생산성을 극대화할 수 있는 강력한 도구입니다.

728x90
반응형
home top bottom
}