본문 바로가기
Spring/02. Repository

01. Repository 개발

by 989898 2025. 2. 11.

1. 데이터 접근 캡슐화

Repository 패턴의 핵심은 데이터베이스와의 직접적인 상호작용을 캡슐화하는 것입니다. 이를 통해 애플리케이션의 다른 계층에서 데이터베이스 관련 세부사항을 알 필요가 없습니다. 예를 들어, SQL 쿼리나 데이터베이스 연결 로직은 Repository 내부에 숨겨져 있으며, 외부에서는 단순히 메서드를 호출해 데이터를 처리할 수 있습니다. 이는 다음과 같은 이점을 제공합니다:

  • 재사용성: 동일한 데이터 접근 로직을 여러 곳에서 재사용 가능.
  • 유지보수성: 데이터베이스 관련 코드가 한 곳에 집중되어 있어 수정이 용이.

2. 비즈니스 로직과 데이터 액세스 로직 분리

Repository는 데이터 액세스만 담당하고, 비즈니스 로직은 서비스 계층에서 처리됩니다. 이렇게 하면 각 계층의 책임이 명확히 분리되어 코드의 구조가 더 명확해지고 유지보수가 쉬워집니다. 예를 들어, 비즈니스 로직이 변경되더라도 Repository는 영향을 받지 않으며, 반대로 데이터베이스 구조가 변경되더라도 서비스 계층은 영향을 받지 않습니다.

3. 데이터베이스 접근의 추상화

Repository는 SQL 쿼리와 같은 세부사항을 숨기고, 데이터베이스 접근을 추상화합니다. 이는 다음과 같은 장점을 제공합니다:

  • 데이터베이스 독립성: MySQL, PostgreSQL, Oracle 등 다양한 DB 엔진으로 쉽게 전환 가능.
  • 코드 변경 최소화: 데이터베이스를 변경할 때 Repository 구현만 수정하면 되므로 애플리케이션 코드 전체를 수정할 필요가 없음.

4. 쿼리 및 데이터 변환의 책임

Repository는 SQL 쿼리 결과를 도메인 객체로 변환하거나, 도메인 객체를 DB에 저장하기 위한 형식으로 변환하는 역할을 담당합니다. 이는 도메인 객체와 DB 간 매핑을 일관성 있게 유지하며, 개발자가 직접 변환 작업을 하지 않아도 되도록 합니다.

 

예시:

psmt.setString(index++, member.getMbEmail());
psmt.setTimestamp(index++, Timestamp.valueOf(LocalDateTime.now()));

 

위 코드는

Member

객체의 데이터를 DB에 저장하기 위해 SQL 쿼리에 맞게 변환하는 과정입니다.

5. 단위 테스트 용이성

Repository 패턴은 테스트 환경에서 실제 DB 대신 Mock 객체를 사용하거나 In-Memory DB로 대체할 수 있어 단위 테스트가 용이합니다. 이는 다음과 같은 이점을 제공합니다:

  • 테스트 독립성 확보: 실제 DB 의존 없이 테스트 가능.
  • 속도 향상: 빠른 테스트 실행.
  • 안정성 증가: 외부 환경(DB 상태)에 영향을 받지 않음.

6. 유지보수 및 확장성 향상

데이터베이스 관련 로직이 Repository에 집중되어 있기 때문에 변경 사항 발생 시 애플리케이션 전체에 영향을 미치지 않고 Repository만 수정하면 됩니다. 또한 복잡한 쿼리를 한 곳에서 관리하여 유지보수가 쉬워집니다.

간략히 넘어갈 수 있는 부분

Repository 패턴의 장점

  • 응집도 높임: 관련 코드를 한 곳에 모아 중복 제거.
  • 책임 분리: 비즈니스 로직과 데이터 접근 로직 분리.
  • 유연성 제공: DB 엔진 변경 시 최소한의 수정으로 대응.
  • 테스트 용이성: Mocking으로 독립적이고 빠른 테스트 가능.

JDBC-API 기반 JdbcMemberRepository

JdbcMemberRepository는 JDBC API를 활용하여 데이터를 처리하는 Repository 구현체입니다.

 

주요 특징:

  • SQL 쿼리를 사용해 데이터를 삽입 (INSERT)하거나 조회.
  • PreparedStatement 와 ResultSet 을 사용해 안전하고 효율적인 DB 작업 수행
     
  • LocalDateTime 과 Timestamp간 변환 처리.

예시 코드:

try (PreparedStatement psmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
    psmt.setString(index++, member.getMbEmail());
    psmt.setTimestamp(index++, Timestamp.valueOf(LocalDateTime.now()));
    // ...
}

 

이는 SQL 인젝션 방지를 위해 PreparedStatement를 사용하는 좋은 사례입니다.

결론

Repository 패턴은 데이터 접근 캡슐화와 추상화를 통해 코드 재사용성과 유지보수성을 높이고, 비즈니스 로직과 데이터 액세스 로직을 분리하여 애플리케이션 구조를 명확히 합니다. JdbcMemberRepository는 이러한 패턴을 JDBC API로 구현한 사례로, 실무에서 자주 활용되는 방식입니다.