@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()
);
}
// 기타 데이터 접근 메서드...
}
DataAccessException으로 자동 변환합니다.@Repository는 @Component의 특화된 형태입니다. 기능적 차이점은 다음과 같습니다:
@Component: 일반적인 스프링 관리 컴포넌트@Repository: 데이터 접근 계층 컴포넌트로, 추가적으로 예외 변환 기능을 제공합니다.@Component
public class GenericComponent {
// 일반적인 컴포넌트
}
@Repository
public class UserRepository {
// 데이터 접근 로직을 처리하는 리포지토리
}
Spring Data JPA를 사용할 때는 인터페이스에 @Repository를 명시적으로 붙이지 않아도 됩니다:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
}
Spring Data JPA가 이 인터페이스의 구현체를 자동으로 생성하고 @Repository의 기능을 제공합니다.
@Repository의 주요 기능 중 하나는 데이터 접근 기술의 예외를 스프링의 예외로 변환하는 것입니다:
이를 통해 특정 데이터 접근 기술에 종속되지 않는 일관된 예외 처리가 가능해집니다.
@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());
}
}
UserRepository).@Repository 어노테이션은 스프링 애플리케이션의 데이터 접근 계층을 명확하게 정의하고 관리하는 데 중요한 역할을 합니다. 데이터베이스 연산의 추상화, 예외 처리의 일관성, 그리고 트랜잭션 관리와의 통합 등 다양한 이점을 제공합니다. 잘 설계된 리포지토리 계층은 애플리케이션의 확장성과 유지보수성을 크게 향상시키며, 비즈니스 로직과 데이터 접근 로직의 명확한 분리를 가능하게 합니다.