@Repository

코딩냥이·2024년 9월 10일

Annotation

목록 보기
6/34

@Repository

@Repository는 스프링 프레임워크에서 데이터 접근 계층(Data Access Layer)의 컴포넌트임을 나타내는 어노테이션입니다.

기능

  • 데이터베이스 연산을 수행하는 클래스임을 명시합니다.
  • @Component의 특화된 형태로, 데이터 접근 관련 예외를 스프링의 일관된 예외 계층구조로 변환합니다.
  • 스프링의 컴포넌트 스캔 메커니즘에 의해 자동으로 감지되고 빈으로 등록됩니다.

사용 방법

@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public User findById(Long id) {
        return jdbcTemplate.queryForObject(
            "SELECT * FROM users WHERE id = ?",
            new Object[]{id},
            (rs, rowNum) ->
                new User(
                    rs.getLong("id"),
                    rs.getString("username"),
                    rs.getString("email")
                )
        );
    }

    public void save(User user) {
        jdbcTemplate.update(
            "INSERT INTO users (username, email) VALUES (?, ?)",
            user.getUsername(),
            user.getEmail()
        );
    }

    // 기타 데이터 접근 메서드...
}

주요 특징

  1. 데이터 접근 로직 캡슐화: 데이터베이스 연산과 관련된 로직을 포함합니다.
  2. 예외 변환: 데이터 접근 기술(예: JDBC)의 예외를 스프링의 DataAccessException으로 자동 변환합니다.
  3. 트랜잭션 참여: 스프링의 트랜잭션 관리 기능과 자연스럽게 통합됩니다.
  4. ORM 통합: JPA, Hibernate 등의 ORM 기술과 함께 사용될 때 추가적인 기능을 제공합니다.

@Repository vs @Component

@Repository@Component의 특화된 형태입니다. 기능적 차이점은 다음과 같습니다:

  • @Component: 일반적인 스프링 관리 컴포넌트
  • @Repository: 데이터 접근 계층 컴포넌트로, 추가적으로 예외 변환 기능을 제공합니다.
@Component
public class GenericComponent {
    // 일반적인 컴포넌트
}

@Repository
public class UserRepository {
    // 데이터 접근 로직을 처리하는 리포지토리
}

Spring Data JPA와의 사용

Spring Data JPA를 사용할 때는 인터페이스에 @Repository를 명시적으로 붙이지 않아도 됩니다:

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastName(String lastName);
}

Spring Data JPA가 이 인터페이스의 구현체를 자동으로 생성하고 @Repository의 기능을 제공합니다.

예외 변환 메커니즘

@Repository의 주요 기능 중 하나는 데이터 접근 기술의 예외를 스프링의 예외로 변환하는 것입니다:

  • JDBC SQLException → DataAccessException
  • Hibernate HibernateException → DataAccessException
  • JPA PersistenceException → DataAccessException

이를 통해 특정 데이터 접근 기술에 종속되지 않는 일관된 예외 처리가 가능해집니다.

테스트

@Repository 클래스의 테스트는 주로 통합 테스트 형태로 이루어집니다:

@SpringBootTest
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void findById_ShouldReturnUser() {
        User user = new User("John Doe", "john@example.com");
        userRepository.save(user);

        User foundUser = userRepository.findById(user.getId());

        assertNotNull(foundUser);
        assertEquals("John Doe", foundUser.getUsername());
        assertEquals("john@example.com", foundUser.getEmail());
    }
}

베스트 프랙티스

  1. 단일 책임 원칙: 각 리포지토리 클래스는 하나의 엔티티 또는 관련된 엔티티 그룹에 대한 데이터 접근을 담당해야 합니다.
  2. 인터페이스 사용: 리포지토리 인터페이스를 정의하고 구현 클래스를 만들면 유연성과 테스트 용이성이 향상됩니다.
  3. 명명 규칙: 리포지토리 클래스의 이름은 보통 엔티티 이름에 "Repository"를 붙입니다 (예: UserRepository).
  4. 쿼리 메서드 활용: Spring Data JPA를 사용할 때는 쿼리 메서드 네이밍 규칙을 활용하여 간단한 쿼리를 쉽게 정의할 수 있습니다.
  5. 페이징과 정렬: 대량의 데이터를 다룰 때는 페이징과 정렬 기능을 적극 활용합니다.
  6. 캐싱 고려: 자주 접근하는 데이터에 대해서는 캐싱을 고려하여 성능을 향상시킵니다.

결론

@Repository 어노테이션은 스프링 애플리케이션의 데이터 접근 계층을 명확하게 정의하고 관리하는 데 중요한 역할을 합니다. 데이터베이스 연산의 추상화, 예외 처리의 일관성, 그리고 트랜잭션 관리와의 통합 등 다양한 이점을 제공합니다. 잘 설계된 리포지토리 계층은 애플리케이션의 확장성과 유지보수성을 크게 향상시키며, 비즈니스 로직과 데이터 접근 로직의 명확한 분리를 가능하게 합니다.

연관 포스팅

@Mapper

profile
HelloMeow~!

0개의 댓글