[Spring] 토비의 스프링 Vol.1 8장 스프링이란 무엇인가?

Shiba·2023년 9월 26일
0

🍀 스프링 정리

목록 보기
10/21
post-thumbnail

📗 스프링이란 무엇인가?

📖 스프링의 정의

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

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

스프링은 근본적인 부분에서 엔터프라이즈 개발의 복잡함을 제거해내고 진정으로 개발을 편하게 해주는 해결책을 제시

📝 오픈소스

기본적으로 오픈소스 프로젝트 방식으로 개발되며 스프링소스에서 버그 신고, 기능 추가 등을 요청받아 수행

📝 경량급

불필요하게 등장하던 의존적인 코드를 제거하고 복잡하거나 고가의 WAS가 없어도 개발이 가능할 정도로 가장 단순하고 가볍게 구성되어있음

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

스프링은 특정 계층이나 기술 업무 분야에 국한되지않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크이다.

📖 스프링의 목적

앞서 정의에서 살펴보았듯 "엔터프라이즈 개발을 편하게" 하는것이 목적이다.

📝 엔터프라이즈 개발의 문제점

가장 대표적인 프로젝트의 실패 원인 = 엔터프라이즈 시스템 개발이 복잡하다

◼ 복잡함의 근본적인 이유

  • 기술적인 제약조건과 요구사항이 늘어감
    - 순수한 비즈니스 로직 뿐만 아니라, 트랜잭션, 보안, 리모팅 등 여러요소들을 모두 고려하여 개발을 진행해야한다
  • 엔터프라이즈 애플리케이션의 핵심기능인 비즈니스 로직의 복잡한 증가
    - 엔터프라이즈 시스템으로 업무를 처리하는 비율이 늘어나면서, 다양하고 복잡한 업무 처리 기능을 엔터프라이즈 시스템이 구현해야한다.

◼ 복잡함을 가중시키는 원인

비즈니스 로직의 복잡함과 엔터프라이즈 기술의 복잡함이 얽혀있기 때문
- 전통적인 엔터프라이즈 개발 기법은 비즈니스 로직의 코드와 엔터프라이즈 기술 코드가 혼재될 수 밖에 없는 방식이였다.

📝 복잡함을 해결하려는 도전

◼ 제거될 수 없는 근본적인 복잡함

엔터프라이즈 기술의 근본적인 복잡함은 사실상 제거할 수 없다
- 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요

실패한 해결책 : EJB

EJB도 두가지 종류의 복잡함을 분리하는 것이 목표였다.
- 몇몇 부분은 일부분 분리에 성공했다
- EJB환경에서 동작하기 위한 인터페이스 구현, 상속하는 구조는 오히려 EJB라는 환경에 종속되게 만드는 코드로 만들었다.

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

  • 스프링은 EJB의 실패를 교훈삼아 시작했다.
    • EJB: 어떤 기술을 적용했을 때, 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 "침투적인 기술"
    • 스프링: 기술의 적용 사실이 코드에 직접 반영되지 않는 "비 침투적인 기술"
      • 코드의 설계나 구현 방식을 제한하지는 않음

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

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

스프링은 복잡함의 문제를 두 가지로 분류하고 각각에 대한 적절한 대응 방법 제공

  • 기술에 대한 접근 방식이 일관성 없고, 특정환경에 종속적이다.
    - 서비스 추상화를 통해 로우 레벨 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스 제공
  • 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
    - 스프링은 AOP를 통해 기술 관련 코드를 깔끔하게 분리해 별도의 모듈로 관리

◼ 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략

"자바" 라는 객체지향 기술 그 자체.
- 객체지향 프로그래밍은 유연한 설계가 가능하고 재사용성이 높은 코드를 작성할 수 있음
- 스프링은 단지 객체지향 언어의 장점을 못살리게 방해하던 요소를 제거하도록 도와줌

◼ 핵심 도구 : 객체지향과 DI

" 기본으로 돌아가자"

  • 객체지향에 충실한 설계가 가능하도록 도와주는 것이 스프링의 기본 전략
  • DI도 결국 객체지향 기법 중 하나이며 스프링이 쉽게 사용하도록 도와줄 뿐
    - 서비스 추상화, 템플릿/콜백, AOP 모두 DI 없이는 존재할 수 없음

📖 POJO 프로그래밍

"스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것"

📝 스프링의 핵심: POJO

스프링의 주요 기술인 Ioc/DI, AOP와PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 기능기술 이라고 불린다.

📝 POJO란 무엇인가?

POJO(Plain Old Java Object): 간단한 자바 오브젝트. 뭔가 있어보이려고 용어만듦.

📝 POJO의 조건

적어도 다음의 세 가지 조건을 충족해야한다

  • 특정 규약에 종속되지 않는다.
    - 자바 언어와 꼭 필요햔 API 외에는 종속되지 않아야 한다.
    - 별다른 가치를 주지도 못하는 규약에 종속되지 않고, 객체지향 설계의 자유로운 적용이 가능한 오브젝트이어야 한다.
  • 특정 환경에 종속되지 않는다.
    - 특정 환경에 종속적이어야 동작하는 오브젝트도 POJO라고 할 수 없다.
    - 에노테이션에 특정 기술과 환경에 종속적인 정보를 담고 있으면 안된다.
  • 객체지향적인 자바 언어의 기본에 충실하게 만들어져야한다.

📝 POJO의 장점

POJO의 조건이 바로 POJO의 장점이 된다.

  • 특정 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다.
  • 환경에 종속되지 않아 제약이 없어 자동화된 테스트에 유리한 코드이다.
  • 객체지향적인 설계를 자유롭게 적용할 수 있다는 것도 큰 장점

📝 POJO 프레임워크

POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크
- 스프링 프레임워크, 하이버네이트
- 하이버네이트는 DB이용 기술에 POJO를 적용하는 것이 목적
- 스프링은 엔터프라이즈 애플리케이션 개발의 모드 영역과 계층에서 POJO방식의 구현이 가능하게 하려는 목적

📖 스프링의 기술

스프링은 POJO 개발을 쉽게 할 수 있도록 지원하는 세 가지 기능기술 제공
- Ioc/DI, AOP, PSA

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

기본원리는 1장에서 살펴보았으니 여기서는 활용 방법을 생각해보자.
- OCP원칙으로 설명가능
- 개방의 관점에선 유연한 확장이 가능
- 폐쇄의 관점에선 코드의 재사용이 가능함

◼ DI 활용 방법

핵심기능의 변경

의존 대상의 구현을 바꾸는 것 - 전략패턴
- A->B의 구조에서 B의 구현방식을 B1,B2,B3와 같이 필요에 따라 바꾸는 것

핵심기능의 동적인 변경

의존 오브젝트의 핵심 기능 자체를 바꾸는데, 동적으로 변경도 가능
- 다이나믹 라우팅 프록시, 프록시 오브젝트 기법을 활용

부가기능의 추가

핵심기능은 그대로 둔 채로 부가기능을 추가 - 데코레이터 패턴
- 트랜잭션 기능을 부여할 때 사용했었음

인터페이스의 변경

인터페이스와 실제 오브젝트 사이에 인터페이스가 일치하지 않는 경우, 어댑터처럼 인터페이스를 바꾸어 줄 수 있다.
- A->C를 사용하려할 때, A->B라면 B의 내부에서 C를 호출하는 어댑터 오브젝트를 생성하여 연결

프록시

프록시 패턴의 전형적인 응용 방법
- 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 로딩 적용시
- 원격 프록시 적용시
- 웹 서비스, REST호출, HTTP방식의 호출 등 다양한 리모팅 기술

템플릿과 콜백

템플릿/콜백 패턴은 DI의 특별한 적용 방법
- 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이 자주 바뀌는 부분을 분리하여 템플릿과 콜백으로 만들어 DI를 적용

싱글톤과 오브젝트 스코프

DI할 오브젝트의 생명주기를 제어할 수 있음
- DI를 프레임워크로 사용한다는 건 DI 대상 오브젝트를 컨테이너가 관리한다는 뜻

테스트

의존 오브젝트를 대신하여 목 오브젝트와 같은 테스트 대역 사용시 DI가 필요
- DI를 위해 만든 수정자 메소드를 사용하면 테스트 코드 안에서 수동으로 목 오브젝트 주입 가능

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

IoC/DI만 사용해서는 일부 서비스에서 POJO의 조건을 유지한 채로 적용하기 힘듦
- 이러한 문제를 해결하기 위해 AOP가 필요

◼ AOP 적용 기법

다이나믹 프록시를 사용

데코레이터 패턴의 응용
- 자바의 객체지향 패턴을 활용한 방법이여서 만들기가 쉽고 간편
- 부가기능을 부여할 수 있는 곳은 메소드의 호출이 일어나는 지점뿐

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

AspectJ 오픈소스 AOP 툴 사용
- JDK의 지원만으로는 불가능한 고급 기능을 제공해줌
- 별도의 AOP 컴파일러를 이용한 빌드를 거치거나 바이트 코드를 조작하는 방법 사용해야함

◼ AOP의 적용 단계

AOP에 익숙하지 않은 상태라면 단계를 밟아 AOP를 도입하는 접근 방법 사용

  1. 미리 준비된 AOP 이용
    미리 만들어져 있는 AOP 기능을 그대로 사용해보는 것으로 시작해보자
    - 스프링이 제공하는 대표적인 AOP인 트랜잭션을 사용해보자
  2. 전담팀을 통한 정책 AOP 적용
    소수의 AOP 담당자 관리하에 애플리케이션 전체적으로 이용가능 한 것을 적용
    -비즈니스 로직을 가진 오브젝트에 대한 보안, 로깅,트레이싱,모니터링
  3. AOP의 자유로운 이용
    1,2단계를 거쳐 AOP와 어느정도 친숙해졌고, 위험성, 장단점을 이해했다면 스스로 AOP를 활용하는 단계로 넘어가보자

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

환경과 세부 기술의 변화와 관계없이 일관된 방식으로 기술에 접근할 수 있게 해줌
- 스프링의 기본 플랫폼인 JavaSEE에 종속적이지 않도록 서비스 추상화 기술 사용

profile
모르는 것 정리하기

0개의 댓글