스프링은 의존성 주입(Dependency Injection) 컨테이너로 사용되며, @Component
로 등록된 Bean을 생성하고 관리한다. 이는 애플리케이션의 다양한 부분에서 사용되는 객체들을 관리하고, 필요한 곳에 주입하여 사용할 수 있도록 한다. 스프링은 또한 @Autowired
주석을 사용하여 Bean들 간의 의존성을 자동으로 주입할 수 있다. 이를 통해 객체 간의 결합도를 낮추고 유연하고 확장 가능한 애플리케이션을 만들 수 있다.
데이터 계층에서 Repository 패턴과 DAO 패턴의 차이를 알아보고, @Repository
어노테이션에 대해 알아보자.
DAO(Data Access Object) 패턴은 저수준 데이터 엑세스 API 및 데이터 조작을 고수준 비즈니즈 서비스와 분리할 때 사용한다. DAO 패턴에는 다음 컴포턴트로 구성된다.
public class Reservation {
private Long id;
private String name;
private LocalDate date;
private ReservationTime time;
//...
}
Repository 패턴은 저장소라는 뜻으로 데이터베이스로부터 도메인 객체에 대한 액세스를 위한 컬렉션과 유사한 인터페이스를 제공한다. 즉, Repository는 DB의 페러다임 불일치를 객체지향답게 도메인 객체의 집합을 조작하게 하는 역할인 것이다.
public class Reservations {
List<Reservation> reservations = new ArrayList<>();
public void add(Reservation reservation) {
reservations.add(reservation);
}
public Reservation get(int index) {
return reservations.get(index);
}
//...
}
위와 같이 Reservation
의 집합인 Reservations
또한 객체의 집합이므로 respository 패턴으로 볼 수 있다.
Repository 패턴은 결국 도메인 내의 객체들을 관리하는 클래스일 뿐이기에 여전히 도메인 영역에 가깝다.
Repository 패턴을 활용하여 데이터 영속성에서 이용할 수 있다.
public interface ReservationRepository {
void add(Reservation reservation);
Reservation get(int reservationId);
}
데이터와 관련된 작업을 처리하고 DAO와 비슷하게 쿼리를 숨기지만, 도메인의 비즈니스 로직에 더 가까운 고수준의 위치에 있다.
Repository는 데이터베이스에서 데이터를 가져와 도메인 객체를 채우기 위해 DAO를 사용할 수 있다. 또는 도메인 객체에서 데이터를 준비하고 지속성을 위해 DAO를 사용하여 데이터를 저장소 시스템에 전송할 수도 있다.
@Repository
어노테이션은 데이터베이스를 조작하는 Bean에 적용하도록 특수하게 설계된 어노테이션이다.
해당 어노테이션이 적용돼 있는 클래스에는 데이터 엑세스 코드가 들어 있다는 뜻이므로 스프링은 각 데이터베이스의 SQL 예외를 좀 더 애플리케이션 친화적인 DataAccessException
계층 예외로 변환한다.