코어 스프링

백종하·2021년 8월 8일

Spring

목록 보기
2/2

자바 개발 간소화

스프링을 사용하는 모든 자바 애플리케이션은 간소함, 테스트 용이성, 낮은 결합도라는 이득을 얻었다.

자바 복잡도를 지원하기 위해 스프링의 네 가지 주요 전략

  1. POJO를 이용한 가볍고 비침투적인 개발
  2. DI와 인터페이스 지향을 통한 느슨한 결합도
  3. 애스펙트와 공통 규약을 통한 선언적 프로그래밍
  4. 애스펙트와 템플릿을 통한 반복적인 코드 제거

비침투적 개발이란 바탕이 되는 기술을 사용하는 클래스, 인터페이스, API 등을 코드에 직접 나타내지 않는 방법, 복잡함을 분리
침투적 개발이란 바탕이 되는 기술을 사용하는 클래스, 인터페이스, API 등을 코드에 나타내며 종속객체 주입을 명시적으로 고려하는 방법, 복잡함을 가중

스프링이 POJO 지향 개발을 통해 어떻게 침투적 개발을 최소화.

POJO의 힘

스프링은 API를 이용하여 애플리케이션 코드의 분산을 가능한 한 막는다. 스프링은 스프링에 특화된 인터페이스 구현이나 스프링 자체에 의존성이 높은 클래스 확장을 거의 요구하지 않는다. 스프링 기반 애플리케이션의 클래스에는 스프링이 사용한다는 표시도 거의 없다. 최악의 경우 클래스에 스프링의 애너테이션이 붙지만 그렇지 않은 경우에는 POJO다.

스프링이 POJO에 힘을 불어넣는 방법 중 하나는 DI를 활용한 조립.

종속객체 주입

종속객체주입(DI, Dependency Injection)
DI를 이용하면 객체는 시스템에서 각 객체를 조율하는 제3자에 의해 생성 시점에 종속객체가 부여.
객체는 종속객체를 생성하거나 얻지 않는다. 즉, 종속객체는 종속객체가 필요한 객체에 주입.
종속객체 주입은 생성자 주입(constructor injection)
스프링 애플리케이션에서 애플리케이션 컨텍스트(application context)는 빈에 관한 정의들을 바탕으로 빈들을 엮어 준다.

애스펙트 적용

애스펙트 지향 프로그래밍은 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용할 수 있는 컴포넌트에 담는다.
애스펙트 지향 프로그래밍은 소프트웨어 시스템 내부의 관심사들을 서로 분리하는 기술이라고 설명.
시스템은 보통 특정한 기능을 책임지는 여러 개의 컴포넌트로 구성된다. 그러나 각 컴포넌트는 대체로 본연의 특정한 기능 외에 로깅이나 트랜잭션 관리, 보안 등의 시스템 서비스도 수행해야하는 경우가 많다.

비즈니스 객체들은 시스템 서비스와 매우 긴밀하게 관련.
각 객체는 본연의 책임을 수행할 뿐만 아니라 로깅과 보안, 트랜잭션 컨텍스트에 대해서도 파악해야 한다.

AOP는 시스템 서비스를 모듈화해서 컴포넌트에 선언적으로 적용한다. AOP를 이용하면 시스템 서비스에 대해서는 전혀 알지 못하지만 응집도가 높고 본연의 관심사에 집중하는 컴포넌트를 만든다. 애스팩트는 확실히 POJO를 단순화한다.
애플리케이션의 핵심은 비즈니스 기능을 구현하는 모듈들로 구성되어 있고 AOP를 이용해서 이 핵심 애플리케이션의 핵심은 비즈니스 기능을 구현하는 모듈들로 구성되어 있고 AOP를 이용해서 이 핵심 애플리케이션 위에 추가적인 기능을 여러 겹으로 덮고 있다. 이때 핵심 기능을 구현하는 모듈에는 아무런 변화도 가하지 않고 추가적인 기능을 선언적으로 적용한다.

템플릿을 사용한 상투적인 코드 제거

상투적인 코드 - 공통 작업이나 간단한 작업을 위해 반복적으로 작성해야 하는 코드.

빈을 담는 그릇, 컨테이너

스프링 기반 애플리케이션에서는 스프링 컨테이너 안에서 객체가 태어나고 자라고 소멸한다. 스프링 컨테이너는 객체를 생성하고 서로 엮어주고 이들의 전체 생명주기(lifecycle)를 관리한다.

스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치한다. 스프링 컨테이너는 종속객체 주입을 이용해서 애플리케이션을 구성하는 컴포넌트를 관리하며 협력 컴포넌트 간 연관관계의 형성도 여기에서 이뤄진다.
애플리케이션 컨텍스트

MVC - 사용자 인터페이스가 애플리케이션 로직과 분리되는 웹 애플리케이션을 만드는 경우에 일반적으로 사용하는 접근 방식이다.

핵심은 DI와 AOP
DI는 객체들이 상호 간의 종속관계나 구체적인 구현 방법을 알 필요가 없도록 애플리케이션 객체들을 연결하는 방법이고 종속객체를 필요로 하는 객체에 종속객체가 부여되는 방식
종속객체를 필요로 하는 객체는 인터페이스를 통해서 주입된 객체만 알므로 결합도가 낮아진다.
AOP를 이용하면 일반적으로 애플리케이션의 여러 곳에 흩어져 있는 로직을 한 곳으로 즉 애스펙트로 모을 수 있다.
각 애스펙트는 스프링이 빈을 와이어링할 때 런타임에 연결되어 효과적으로 빈에 새로운 기능을 부여

profile
이제 소용없다 기억력! 기록으로 남기자!

0개의 댓글