티스토리 뷰

반응형

8장 스프링이란 무엇인가?

스프링이 단지 IoC/DI를 제공하는 프레임워크이라고 정의할 수 있을까?

스프링의 사상과 가치, 적용된 원칙을 더 깊이 있게 살펴보자.

 


스프링의 정의

📝 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

 

애플리케이션 프레임워크?

  • 특정 계층, 기술, 업무 분야에 국한되지 않고 애플리케이션 전 영역을 포괄하는 범용적 프레임워크
  • 애플리케이션 개발 전 과정을 빠르고, 편리하고, 효율적으로 진행하는것이 일차적인 목표

 

경량급?

  • 스프링 자체 코드나 기술이 가볍다는 의미가 아니다.
  • 불필요하게 무겁지 않다는 의미이다. ↔ EJB
  • 비싼 서버를 사용할 필요 없이 가장 단순한 서버환경인 톰캣, 제티에서도 완벽하게 동작한다.

 

자바 엔터프라이즈 개발을 편하게?

  • 근본적인 부분에서 엔터프라이즈 개발의 복잡함을 제거하고 진정으로 개발을 편하게 해주는 해결책을 제시한다.
  • 스프링 프레임워크 제공 기술이 아니라 애플리케이션 로직에 더 많은 시간을 쏟게 해준다.

 

오픈소스?

  • 소스가 모두에게 공개되고, 특별한 라이선스를 취득할 필요 없이 언제든 자유롭게 이용해도 된다.
  • 개발이 계속될지 불확실하다는 한계를 극복하기 위해 전문 기업을 만들어 개발을 책임지고 있다.

 


스프링의 목적

구체적인 스프링의 개발 철학과 궁극적인 목표를 살펴보자.

 

엔터프라이즈 개발의 복잡함

복잡함의 근본적인 이유

1. 기술적인 제약조건과 요구사항이 늘어가기 때문이다.

 

  • 순수 비즈니스 로직 외에도 기술적으로 고려할 사항이 많다.
  • 많은 요청을 동시 처리 → 서버 자원의 효율적 분배
  • 금융, 원자력, 항공, 국방 등의 시스템 → 보안과 안전성, 확장성

 

2. 핵심 기능인 비즈니스 로직의 복잡함이 증가하기 때문이다.

 

  • 업무 프로세스가 수시로 변화하면서 엔터프라이즈 시스템도 수시로 변경되어야 한다.
  • 엔터프라이즈 시스템으로 처리해야 하는 비즈니스 로직이 더 복잡해지고 있다.

⇒ 주요 원인: 비즈니스 로직의 복잡함, 기술적인 복잡함이 서로 얽혀 있다.

 

 

복잡함을 해결하려는 도전

  • 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니다.
  • 가장 먼저 성격이 다른 이 두 가지 복잡함을 분리해야 한다.

 

실패한 해결책: EJB

1. 목표: 로우 레벨에 신경쓰지 않고 비즈니스 로직을 효과적으로 개발한다.

2. 실패한 이유

 

  • EJB 환경에서 동작하기 위해 굳이 특정 인터페이스를 구현하고, 상속하고, …
  • EJB 환경과 스펙에 종속되는 코드로 만들어져야 하는 부담을 안게 됐다.
  • EJB의 특정 클래스를 상속해 자바의 객체지향적 특성을 잃어버렸다.

⇒ 기술적 복잡함을 덜어주려다 더 큰 복잡함을 추가하는 실수 발생

 

 

 

↔ 비침투적인 방식을 통한 효과적인 해결책: 스프링

 

  • 비침투적: 스프링 프레임워크의 적용 사실이 코드에 직접 반영되지 않는다.
  • 기술적 복잡함과 비즈니스 로직의 복잡함을 깔끔히 분리할 수 있다.

 

 

복잡함을 상대하는 스프링의 전략

기술적 복잡함을 상대하는 전략

1. 문제점: 기술에 대한 접근 방식이 일관성이 없고 특정 환경에 종속적이다.

  • 스프링의 서비스 추상화로 해결
    • 로우레벨의 기술 구현과 사용하는 인터페이스를 분리
    • 환경과 세부 기술에 독립적인 접근 인터페이스를 제공
  • 스프링의 템플릿/콜백 패턴
    • 반복적인 작업 흐름과 API 사용 코드를 제거

 

2. 문제점: 기술적 처리 담당 코드가 성격이 다른 코드에 섞여서 등장한다.

  • 스프링의 AOP로 해결
    • 기술 관련 코드를 깔끔히 분리해 별도 모듈로 관리한다.

 

 

애플리케이션 로직의 복잡함을 상대하는 전략

 

  • 자바라는 객체지향 기술 그 자체가 해결 방법!
  • 스프링은 단지 객체지향 언어의 장점을 제대로 살리지 못하게 한 방해 요소를 제거할 뿐이다.

 

 

핵심 도구: 객체 지향과 DI

스프링의 모토: 기본으로 돌아가자.

 

서비스 추상화, 템플릿/콜백, AOP, … 모든 스프링 기술이 DI를 바탕으로 하고 있다.

 

 

DI란 특별한 기술이라기 보다는 유연성을 위해 자연스레 적용되는 객체지향 프로그래밍 기법이다.

그래서 객체지향과 DI는 서로 떼놓고 생각할 수 없다.

 

 


POJO 프로그래밍

스프링의 핵심: POJO

  • 스프링 애플리케이션 = POJO 애플리케이션 코드 + POJO의 관계를 정의한 설계정보
  • POJO로 개발하게 해주는 가능기술: IoC/DI, AOP, PSA

 

POJO란 무엇인가?

Plain Old Java Object: 복잡한 기술 대신 자바의 단순한 오브젝트를 사용하는 기술

 

POJO의 조건

1. 특정 규약에 종속되지 않는다.

  • 자바 언어와 꼭 필요한 API 외에는 종속되지 않는다.

2. 특정 환경에 종속되지 않는다.

  • 웹이라는 환경정보에만 종속되는 것도 허용하지 않는다.

 

  • POJO: 객체지향원리에 충실하면서 환경과 기술에 종속되지 않고 재활용할 수 있는 방식으로 설계된 오브젝트
  • POJO 프로그래밍: POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법

 

POJO의 장점

  • 특정 기술과 환경에 종속되지 않는 오브젝트
  • 테스트 자동화의 편리함
  • 객체지향적 설계의 자유로운 적용

 

POJO 프레임워크

POJO 프로그래밍이 가능하도록 기술적 기반을 제공하는 프레임워크

ex) 스프링, 하이버네이트

 

스프링의 기술

POJO 가능 기술: IoC/DI, AOP, PSA

스프링 사용자라면 스프링이 직접 제공하지 않는 기술에 대해서도 IoC/DI, AOP, PSA를 적용할 줄 알아야 한다.

 

 

제어의 역전(IoC) / 의존관계 주입(DI)

  • 스프링의 가장 기본이 되는 기술, 스프링의 핵심 개발 원칙
  • IoC와 DI는 유연한 확장이 가능하게 하기 위해 사용한다. (OCP 원칙)

 

DI 활용 방법

1. 핵심기능 변경

  • A→B 구조에서 의존 대상인 B의 구현을 바꾼다.
  • 대표적인 예시: 전략 패턴

2. 핵심기능의 동적인 변경

  • 예시: 사용자의 등급에 따라 다른 DataSource를 사용하도록 한다.

3. 부가기능 추가

  • 핵심기능은 그대로 둔 채 부가기능을 추가한다.
  • 대표적인 예시: 데코레이터 패턴, 트랜잭션 기능 부여

4. 인터페이스 변경

  • 클라이언트가 사용하려는 인터페이스와 실제 오브젝트 사이의 인터페이스가 일치하지 않는 경우
  • 대표적인 예시: 어댑터 패턴, 서비스 추상화(PSA)

5. 프록시

  • 지연 로딩 사용시 프록시가 필요하다.
  • 대표적인 예시: 프록시 패턴

6. 템플릿과 콜백

  • 반복적으로 등장하지만 항상 고정적인 작업 흐름과 자주 바뀌는 부분을 분리해 간결한 코드를 만든다.
  • 콜백을 템플릿에 주입하는 방식으로 동작하도록 응용할 수 있다.
  • 대표적인 예시: 템플릿/콜백 패턴

7. 싱글톤과 오브젝트 스코프

  • DI할 오브젝트의 생명주기를 제어할 수 있다.
  • 싱글톤은 그 중 가장 기본이 되는 스코프이다.

8. 테스트

  • 효과적으로 테스트하기 위해서 오브젝트를 가능한 한 고립시켜야 한다.

 

애스펙트 지향 프로그래밍(AOP)

  • 객체지향 기술의 한계와 단점을 극복하도록 도와주는 보조적 프로그래밍 기술
  • OOP를 더욱 OOP 답게 만들 수 있다.

 

AOP 적용 기법

1. 스프링과 같이 다이내믹 프록시를 사용한다.

 

  • 데코레이터 패턴을 응용하는 방법
  • 만들기 쉽고 적용하기 간편
  • 부가기능을 부여할 수 있는 곳은 메소드 호출 지점 뿐이라는 제약 존재
  • 스프링의 기본적인 AOP 구현 방법

2. 자바 언어의 한계를 넘어서는 언어의 확장을 이용한다.

 

  • AspectJ라는 오픈소스 AOP 툴을 사용하는 방법
  • 메소드 호출, 인스턴스 생성, 필드 액세스 등 다양한 조인 포인트 제공

 

AOP 적용 단계

1. 미리 스프링에서 만들어 준비된 AOP 기능 이용

 

  • ex) 트랜잭션, @Configurable

2. 소수의 전담팀을 통한 정책 AOP 적용

 

  • 애플리케이션 전체적으로 이용 가능한 것을 적용
  • ex) 비즈니스 로직 오브젝트에 대한 보안, 로깅, 트레이싱, 실시간 성능 모니터링 등

3. AOP의 자유로운 이용

 

  • AOP에 친숙해지고 이해도가 높아지면 개발자가 스스로 AOP를 활용
  • 개발자의 구현 기능에 적용하면 유용한 세부적인 AOP 이용

 

포터블 서비스 추상화(PSA)

환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근하게 해준다.

반응형

'SPRING' 카테고리의 다른 글

[토비의 스프링] 6. AOP (2)  (0) 2022.12.29
[토비의 스프링] 6. AOP(1)  (0) 2022.12.29
[토비의 스프링] 서비스 추상화  (0) 2022.11.14
[토비의 스프링] 예외 처리  (0) 2022.11.08
[토비의 스프링] 테스트  (0) 2022.10.25