템플릿 메소드 패턴

  • 템플릿 메소드 패턴은 상속을 통해 기능을 확장해서 사용한다.
  • 변하지 않는 부분은 슈퍼클래스에 두고 변하는 부분은 추상 메소드로 정의해둬서 서브클래스에서 오버라이드하여 새롭게 정의해서 사용한다.

전략 패턴

  • 오브젝트를 둘로 분리하고, 클래스 레벨에서는 인터페이스를 통해서만 의존하도록 만든다.
  • 확장에 해당하는 변하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 통해 위임하는 방식이다.

애플리케이션 컨텍스트

  • IoC와 DI를 위한 빈팩토리 + 그 이상의 기능을 가진다.

IoC컨테이너

  • 스프링 애플리케이션에서는 오브젝트의 생성과 관계설정, 사용, 제거 등의 작업을 코드 대신 독립된 컨테이너가 담당한다. 오브젝트의 제어권을 코드 대신 컨테이너가 갖고 있기 떄문에 IoC(제어의 역전)컨테이너라고 불린다.

    빈 팩토리

    • 오브젝트의 생성과 오브젝트 사이에서의 관계를 맺어주는 DI관점으로 볼 때는 컨테이너를 빈 팩토리라고 한다.
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
        ...
        }
  • ApplicationContext 인터페이스의 내부 코드다. ListableBeanFactory 와, HierarchicalBeanFactory 을 상속 받았다.

IoC컨테이너가 동작하기 위해 필요한 두 가지

  • POJO클래스
  • 빈설정메타정보
    • 빈설정정보는 보통 XML이나 자바코드로 작성되어긴하지만 특정한 파일 포맷이나 형식에 제한되거나 종속되지 않는다.
    • BeanDefinitionReader 인터페이스를 구현한 Reader를 만들기만하면, 메타정보는 어떤 형식으로든 작성할 수 있다.

IoC 컨테이너를 통해 애플리케이션이 만들어지는 과정

  1. 메타정보 리소스를 메타정보 리더를 통해 읽어서 설정 메타정보를 만든다.
  2. POJO클래스와 메타정보를 이용해 애플리케이션컨텍스트를 만든다.
  3. 2에서 만들어진 애플리케이션 컨텍스트를 이용해 애플리케이션이 만들어진다.

결론 - 스프링애플리케이션이란 POJO클래스와 설정 메타정보를 이용해 IoC컨테이너가 만들어주는 오브젝트의 조합이다.

IoC(Inversion of Control)

  • 제어의 역전. 프로그램의 제어 흐름 구조가 뒤바뀐 것.

  • 일반적 으로 오브젝트는 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 그 오브젝트를 만들 지 스스로가 정한다. 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조다.

  • 제어의역전 개념이 적용된 오브젝트는 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 당연히 생성하지도 않는다. 자신 또한 어떻게 만들어지고 어디서 사용되는지 알 수 없다. 모든 제어권한은 자신이 아니라 다른 대상에 있기 때문.

    • 제어의 역전이 적용된 예.
      1. 템플릿메서드패턴. - 제어권을 상위 템플릿메서드에 넘기고, 자신은 필요할 때 호출되어 사용된다. ex ) UserDao를 상속받은 서브클래스는 추상메서드 getConnection()을 구현한다. 슈퍼클래스인 UserDao의 템플릿메소드인 add(), get() 등에서 필요할 때 getConnection()을 호출해 사용한다. 즉! 제어권을 상위 템플릿 메서드에 넘기고 자신은 필요할 때 호출되어 사용한다.
      2. 프레임워크 - 애플리케이션코드가 프레임워크에 의해 사용된다. 프레임워크가 흐름을 주도하는 중에 개발자가 만든 코드를 사용한다.

        반면 라이브러리는 애플리케이션코드가 애플리케이션 흐름을 직접 제어한다. 동작하는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용한다.

DI(Dependency Injection)

  • 오브젝트 레퍼런스를 외부로부터 제공(주입)받고 이를 통해 여타 오브젝트와 다이내믹하게 의존관계가 만들어지는 것이 핵심이다.
  • 단지 외부에서 파라미터로 오브젝트의 레퍼런스를 넘겨줬다고 해서 다 DI가 아니다. DI에서 말하는 주입은 다이내믹하게 구현 클래스를 결정해서 제공받을 수 있도록 인터페이스타입의 파라미터를 통해 이뤄져야한다.

스프링?


자바엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크.
기본 틀, 공통프로그래밍 모델, 기술API 등을 제공한다.
스프링을 사용한다는 것은 다음 세가지 요소를 적극적으로 활용해서 개발한다는 뜻이다.

스프링의 구성요소.


애플리케이션의 기본 틀 - 스프링컨테이너

  • 설정정보를 참고로해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다. 일반적으로 웹모듈에서 동작하는 서비스나 서블릿으로 등록해서 사용한다.
  • 스프링을 사용하기 위해선 스프링컨테이너를 다루는 방법과 설정정보를 작성하는 방법을 알아야한다.

공통프로그래밍모델 - IoC/DI , 서비스 추상화, AOP

애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀을 제공해준다. 코드의 작성방법의 기준도 제시한다. 이런 틀을 보통 프로그래밍모델이라 한다.

  • IoC/DI
    • 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델. 유연하고 확장성이 뛰어난 코드를 만들 수 있게 도와주는 객체지향 설계 원칙과 디자인 패턴의 핵심원리를 담고있다. 스프링의 기본이 되며 가장 중요한 기술.
  • 서비스 추상화.

    • 구체적인 기술과 환경에 종속되지 않도록 유연한 추상계층을 두는 방법이다.
  • AOP

    • 코드에 이리저리 흩어져있는 부가적인 기능을 독립적으로 모듈화 하는 프로그래밍 모델. 깔끔한 코드를 유지할 수 있게 도와준다.

기술 API

  • UI작성 뿐만아니라, 웹프레젠테이션 계층, 비지니스 서비스 계층 등 다양한 서비스에서 필요한 주요 기술을 스프링에서 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략클래스 등을 제공한다.
  • 스프링이 제공하는 API와 지원 기술은 모두 스프링의 프로그래밍모델( ioc/di, 서비스추상화, aop를 말하는 것인가?) 에 따라 작성되있기 때문에 쓰는 것만으로도 스프링의 프로그래밍모델을 코드에 자연스레 녹여낼 수 있다.

결론. 스프링을 사용한다는 것은?

위 세가지 요소를 적극적으로 활용해서 애플리케이션을 개발한다는 뜻

  1. 클래스는 스프링 컨테이너 위에서 오브젝트로 만들어져 동작하게 만든다.
  2. 코드는 스프링의 프로그래밍 모델에 따라 작성한다.
  3. 엔터프라이즈 기술을 사용할 때는 스프링이 제공하는 기술API와 서비스를 활용한다.

+ Recent posts