토비의 스프링 3.1 vol.1 1장 오브젝트와 의존 관계 - 2

K PizzaCola·2021년 7월 8일
0

Spring

목록 보기
3/3

기존 main 메소드에 원래 테스트 로직만이 있었는데, 예제에서 슬며시 객체를 할당하는 책임까지 주었다. 그래서 이를 처리할 Factory 객체를 만든다.

public class DaoFactory {
    public UserDao userDao() {
        ConnectionMaker connectionMaker = new MySQLConnectionMaker();
        return new UserDao(connectionMaker);
    }
}

그러면 main에서는 다음과 같이 UserDao를 사용할 수 있다.

public static void main(String[] args) {
    UserDao userDao = new DaoFactory().userDao();
    userDao.add(...);
}

이제 main에는 userDao 테스트 코드만 존재하고, DaoFactory에서는 관계 설정 코드만 존재하며, userDao는 DB에 접근해서 작업하는 것, ConnectionMaker는 DB에 연결하는 방법만이 존재한다. 즉, 관심사를 깔끔하게 분리해낸 것이다.

UserDao를 보자. UserDao는 외부에서 뭔지 모를 ConnectionMaker를 받고, ConnectionMaker를 이용해서 어떤 작업을 진행한다. 이런 측면에서 UserDao는 매우 수동적인 객체가 되는데, 이런 상황이 제어권이 역전되었다고 할 수 있다. 이렇게 프로그램의 제어 흐름 구조가 뒤바뀌는 것을 Inversion of Control 이라 한다. IoC를 적용해서 설계가 깔끔해지고 유연성이 증가하며 확장성이 좋아진다.

스프링은 대표적인 IoC 프레임워크이다. 스프링은 예제코드에서 작성한 DaoFactory보다 좀 더 많은 기능들을 제공한다. 스프링 IoC 컨테이너는 크게 다음 세가지 방법으로 객체 관계 설정 방법을 제공한다.

  • XML 기반
  • Annotation 기반
  • Java 기반

스프링 IoC 컨테이너에서 관리하는 객체를 Bean이라고 한다. 그리고 이 IoC 컨테이너를 BeanFactory / ApplicationContext 라고 한다.

스프링의 Bean은 기본적으로 싱글톤으로 관리한다. 서버 환경에서 싱글톤 객체를 이용하는 것은 매우 중요하다. 만약 서버에 매번 요청이 들어올 때 마다 로직을 담당하는 객체를 새로 만든다면 매우 많은 객체가 생성될 것이다. 그렇다면 서버가 감당하기 힘들 것이다.

일반적으로 자바에서 싱글톤 패턴을 구현하려면 생성자를 private로 만들고, 미리 만든 객체를 제공하는 형태로 이용한다. 그런데 이러면

  • 상속할 수 없고,
  • 테스트하기 어려우며,
  • 싱글톤의 사용은 전역 상태를 만들 수 있어 바람직하지 못하고,
  • 서버 환경에서 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.

그래서 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다. 이것이 싱글톤 레지스트리이다. 이 방식은 일반적인 POJO 또한 싱글톤으로 활용할 수 있게 해준다. 다만 이 때 주의해야할 것은, 빈으로 등록할 객체에 상태를 저장하지 않는 것이 좋다는 것이다.

스프링은 싱글톤 말고도 다른 형태의 스코프를 제공한다.

이후, 책에서는 xml, java 방식의 의존관계를 설정하는 예제코드를 제공한다. 좀 더 자세한 사항은 공식 문서를 참고하면 좋다.

1장 마지막에서 저자는 다음과 같이 이야기한다. 이후 프로그래밍을 공부할 때 언제나 가져야할 마음가짐이라고 생각한다.

스프링의 관심은 오브젝트와 그 관계다. 하지만 오브젝트를 어떻게 설계하고, 분리하고, 개선하고, 어떤 의존관계를 가질지 결정하는 일은 스프링이 아니라 개발자의 역할이며 책임이다. 스프링은 단지 원칙을 잘 따르는 설계를 적용하려고 할 때 필연적으로 등장하는 번거로운 작업을 편하게 할 수 있도록 도와주는 도구일 뿐임을 잊지 말자.
스프링을 사용한다고 좋은 객체지향 설계와 깔끔하고 유연한 코드가 저절로 만들어질까? 그건 절대 아니다. 그 부분은 객체지향 설계와 프로그래밍에 대한 학습과 훈련, 경험이 필요한 부분이며 각자가 공부해야 할 책임이 있는 과제다. 다만, 스프링은 그런 좋은 설계과 코드를 적용하고자 할 때 좋은 동반자가 돼줄 것이다.

1장을 읽으며 초난감 DAO에서부터 설계가 점차 좋아지는 것을 느낄 수 있었다. 특히 DI를 이용하면 깔끔한 객체지향 설계를 할 수 있다는 것을 느꼈다.

profile
공부하는 개발자입니다.

0개의 댓글