-
8장) 8.1 스프링의 정의 ~ 8.2 스프링의 목적Java & Spring/토비의 스프링 3.1 2021. 9. 7. 17:02반응형
8장 스프링이란 무엇인가?
8.1 스프링의 정의
- 스프링의 가장 대중적인 정의
- 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션
- 애플리케이션 프레임워크
- 일반적인 라이브러리, 프레임워크
- 특정 업무 분야나 한 가지 기술에 특화된 목표를 가지고 만들어짐
- ex) 웹 계층을 MVC로 쉽게 만듦, 포맷과 출력장치를 유연하게 변경할 수 있는 애플리케이션 로그 기능 제공, ORM 등
- 특정 업무 분야나 한 가지 기술에 특화된 목표를 가지고 만들어짐
- 스프링
- 애플리케이션 프레임워크
- 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션 전 영역을 포괄하는 범용적인 프레임워크
- 자바 엔터프라이즈 개발의 이상적인 프로그래밍 모델을 추구하는 데 필요한 기반이 돼주는 코드, 즉 프레임워크가 지금 스프링의 원시버전
- 애플리케이션 전 영역을 관통하는 일관된 프로그래밍 모델과 핵심 기술을 바탕으로, 각 분야의 특성에 맞는 필요를 채워주고 있기 때문에 애플리케이션을 빠르고 효과적으로 개발 가능
- 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 애플리케이션 전 계층과 전 영역에 전략과 기능 제공
- 애플리케이션을 편리하게 개발하게 해주는 애플리케이션 프레임 워크로 사용됨
- 애플리케이션 프레임워크
- 일반적인 라이브러리, 프레임워크
- 경량급
- 기술수준이 가볍다거나, 용도가 제한적인 의미가 아닌, 불필요하게 무겁지 않음을 의미
- 스프링이 처음 등장했을 시절의 자바 주류 기술인 이전 EJB 같은 과도한 엔지니어링이 적용된 기술과 스프링을 대비해 설명했던 표현
- 기술수준이 가볍다거나, 용도가 제한적인 의미가 아닌, 불필요하게 무겁지 않음을 의미
- 자바 엔터프라이즈 개발을 편하게
- 근본적인 부분에서 엔터프라이즈 개발의 복잡함을 제거해내고 진정으로 개발을 편하게 해주는 해결책을 제시
- 편리한 애플리케이션 개발 == 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 신경을 덜쓰고 애플리케이션의 핵심인 요구사항(비즈니스 로직)을 빠르고 효과적으로 구현하는 것
- EJB
- EJB의 비전과 목표도 편리한 애플리케이션 개발이었지만, 이 과정에서 다른 차원의 더 큰 복잡함을 애플리케이션 개발에 끌고 들어왔음
- 스프링
- 애플리케이션 개발자들이 프레임워크가 제공하는 기술이 아니라 자신의 애플리케이션 로직에 더 많은 관심과 시간을 쏟게 도와줌
- 엔터프라이즈 개발의 기술적인 복잡함과 그에따른 수고를 제거
- 필연적으로 요구되는 기술적인 요구를 충족하면서도 개발을 복잡하게 만들지 않음
- EJB
- 오픈소스
- 오픈소스 프로젝트 방식으로 개발
- 개발 과정에 많은 사람이 자유롭게 참여
- 거대하고 활발한 커뮤니티
- 잠재적인 버그와 문제점이 빠르게 발견되고 해결
- 라이선스 비용에 대한 부담이 X
- 지속적이고 안정적인 개발이 계속될지 불확실하다는 단점이 존재
8.2 스프링의 목적
- 스프링의 개발 철학과 궁극적인 목표 생각하기
8.2.1 엔터프라이즈 개발의 복잡함
- 2000년대 초반 자바 컨퍼런스에서 자주 논의된 주제는
왜 자바 엔터프라이즈(JAVA EE) 프로젝트는 실패하는가?
- 여러 원인 중 가장 대표적인 이유는,
엔터프라이즈 시스템 개발이 너무 복잡해져서
- 여러 원인 중 가장 대표적인 이유는,
- 복잡함의 근복적인 이유 두 가지
- 기술적인 제약조건과 요구사항이 늘어가기 때문
- 엔터프라이즈 시스템
- 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템
- 많은 사용자의 요청을 동시에 처리 ~> 서버 자원을 효율적으로 공유하고 분배하여 사용
- 중요한 기업 핵심 정보 처리 및 미션 크리티컬한 시스템을 다룸 ~> 보안, 안정성, 확장성에 뛰어나야함
- 타 시스템과의 자동화된 연계, 리모팅 기술, 분산 트랜잭션 지원 등 요구됨
- 순수 비즈니스 로직 구현 외 기술적 고려 사항이 많음
- 엔터프라이즈 시스템
- 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가하기 때문
- 엔터프라이즈 시스템이 관여하는 업무의 비율이 급격하게 커지며 애플리케이션 개발이 힘들고 복잡해짐
- 수시로 업무 프로세스를 변경하고 조종하는 것이 상시화될 정도로 변화의 속도가 빨라짐
- 시스템 개발 및 유지보수, 추가 개발 등의 작업에 대한 부담이 커지고 난이도가 상승
- 기술적인 제약조건과 요구사항이 늘어가기 때문
- 복잡함을 가중시키는 원인
- 엔터프라이즈 애플리케이션 개발이 실패하는 주요 원인은 비즈니스 로직의 복잡함과 기술적인 복잡함이 한데 얽혀 있기 때문
- ex) 고객의 거래내역 분석 ~> 특성 파악 ~> 추천상품 선정 로직
- 비즈니스 로직 + 다양한 기술 문제 존재(기술 선정 및 유지보수 등)
- 복잡하게 얽힌 코드를 수정하다 새로운 버그 양산 가능성이 높아짐
- ex) 고객의 거래내역 분석 ~> 특성 파악 ~> 추천상품 선정 로직
- 엔터프라이즈 애플리케이션 개발이 실패하는 주요 원인은 비즈니스 로직의 복잡함과 기술적인 복잡함이 한데 얽혀 있기 때문
8.2.2 복잡함을 해결하려는 도전
- 제거될 수 없는 근본적인 복잡함
- 엔터프라이즈 개발의 근본적인 복잡함의 원인은 제거 대상 X
- 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요
- 비즈니스 로직의 복잡함을 효과적으로 다루기 위한 방법,
기술적인 복잡함을 효과적으로 처리하는데 적용되는 방법이 서로 다름- 성격이 다른 이 두 가지 복잡함을 분리해야함
- 실패한 해결책: EJB
- EJB의 목표 또한 위의 두 복잡함을 분리하는 것
- 기술적인 복잡함을 애플리케이션 핵심 로직에서 일부분 분리에 성공
- EJB라는 환경과 스펙에 종속되는 코드로 만들어져야 하는 더 큰 부담을 만듦
- EJB 틀 안에서 자바코드를 강제 ~> 자바 언어가 원래 갖고 있던 장점을 상실
- 객체 지향적인 특성은 잃어버린 밋밋한 서비스 스크립트성 코드로 변질
- 비침투적인 방식을 통한 효과적인 해결책: 스프링
- EJB와 같은 목표로 출발
- 침투적인 기술 vs 비침투적인 기술
- 침투적인 기술
- EJB처럼 어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 경우
- 비침투적인 기술
- 기술의 적용 사실이 코드에 직접 반영되지 않는 특징
- 침투적인 기술
- 스프링은 비침투적인 기술 전략
- 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리
- 이 과정에서 스프링 스스로가 애플리케이션 코드에 불필요하게 나타나지 않음
- 꼭 필요할 것 같은 경우 조차 직접 노출되지 않음
- 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리
8.2.3 복잡함을 상대하는 스프링의 전략
- 기술적 복잡함을 상대하는 전략
- 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제 두 가지
- 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다
- 일관성 없는 기술과 서버환경의 변화에 대한 스프링의 공략 방법은 서비스 추상화
- ex) 트랜잭션 추상화, OXM 추상화, 데이터 엑세스 기술에 독립적으로 적용 가능한 트랜잭션 동기화 기법 등
- 기술적인 복잡함은 추상화로 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 좋음
- 테스트 편의성 증대, 기술에 대한 세부 설정과 환경에 독립적인 코드 작성 가능
- 일관성 없는 기술과 서버환경의 변화에 대한 스프링의 공략 방법은 서비스 추상화
- 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다
- 근본적으로 엔터프라이즈 서비스를 적용하는 한, 책임에 따라 계층을 구분하고 그 사이에 서로 기술과 특성에 의존적인 인터페이스나 예외처리 등을 최대한 제거한다해도 쉽게 해결 불가
- 스프링의 해결 방법 AOP
- 최후까지 애플리케이션 로직을 담당하는 코드에 남아 있는 기술 관련 코드를 깔끔하게 분리해서 별도의 모듈로 관리하게 해주는 강력한 기술
- AOP 적용 이전의 문제
- 기술과 비즈니스 로직이 지저분하게 얽혀 다루기 힘듦
- 기술적인 코드가 중복되는 문제
- AOP는 기술을 다루는 코드로 인한 복잡함이 기술 그 자체 이상으로 불필요하게 증대되지 않도록 도와주는 가장 강력한 수단
- 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
- 비즈니스 로직을 담은 코드는 애플리케이션의 가장 중요한 핵심
- 자주 변경되거나 수정되고 복잡함
- 핵심 코드에 오류가 있으면 업무에 큰 지장을 주거나 치명적인 손실을 유발
- 예전에는 비즈니스 로직의 상당 부분을 DB에 두는 것이 유행
- 엔터프라이즈 시스템 규모가 커지고, 복잡함이 증가하면서 DB에 두는 것이 불편하고 위험해짐
- 많은 비용이 드는 공유 자원인 DB에 커다란 부담을 주고, 개발 & 유지보수, 테스트도 매우 어려움
- 비즈니스 로직은 애플리케이션 안에서 처리하도록 만들도록 발전
- 자바는 객체지향 언어의 장점을 살려 설계된 언어
- 객체지향 프로그래밍 기법과 언어가 주는 장점인 유연한 설계가 가능하고 재사용성이 높다는 점을 잘 활용하면 자주 바뀌고 조건이 까다로운 비즈니스 로직을 효과적으로 구현해낼 수 있음
- 객체지향 분석과 설계를 통해 작성된 모델을 코드로 구현하고 지속적으로 발전시킬 수 있음
- 비침투적인 기술인 스프링은 핵심 로직을 다루는 코드에는 스프링의 흔적을 찾을 수 없을 만큼 드러내지 않음
- 뒤에서 비즈니스 로직을 담당하는 오브젝트들에게 적절한 엔터프라지 기술 서비스가 제공되도록 도움
- 비즈니스 로직의 복잡함을 상대하는 스프링의 전략은 자바라는 객체지향 기술 그 자체
- 비즈니스 로직을 담은 코드는 애플리케이션의 가장 중요한 핵심
- 핵심 도구: 객체지향과 DI
- 기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 공통적으로 사용하는 도구는
객체지향oo
- 스프링의 모토는
기본으로 돌아가자
- 자바 엔터프라이즈 기술의 가장 큰 장점은 객체지향 설계와 프로그래밍을 가능하게 해주는 자바 언어
- 자바의 기본인 객체지향에 충실한 설계까 가능하도록 단순한 오브젝트로 개발, 구조를 만들기 위해 DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략
- 서비스 추상화, 템플릿 / 콜백, AOP와 같은 스프링의 기술은 DI없이 존재할 수 없음
- DI는 유연하게 확장할 수 있는 오브젝트를 설계를 하다보면 자연스럽게 적용되는 객체지향 프로그래밍 기법
- 스프링은 이를 편하고 쉽게 사용할 수 있게 도와줌
- 기술적인 복잡함을 해결하는 문제나 기술적인 복잡함이 비즈니스 로직에 침범하지 못하도록 분리하는 경우에도 DI가 바탕이 된 여러 가지 기법이 활용
- 비즈니스 로직 자체의 복잡함을 해결하려면 DI보다는 객체지향 설계 기법이 더 중요
- 스프링은 비즈니스 로직 자체를 기술적인 코드와 특정 기술의 스펙이 침범하지 않는데 집중
- 순수한 비즈니스 로직만을 담고 있는 코드는 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있기 때문
- 상속, 다형성, 위임을 포함한 많은 객체지향 디자인 패턴과 설계 기법이 잘 녹아들을 수 있음
- 기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 공통적으로 사용하는 도구는
- 스프링의 기술과 전략은 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사요할 수 있도록 돕는 것
반응형'Java & Spring > 토비의 스프링 3.1' 카테고리의 다른 글
9장) 9.3 애플리케이션 아키텍처 (vol1 마지막 정리) (226) 2021.09.24 8장) 8.3 POJO 프로그래밍 ~ 8.4 스프링의 기술 (2) 2021.09.07 7장) 7.6 스프링 3.1의 DI (2) 2021.08.30 7장) 7.4 인터페이스 상속을 통한 안전한 기능확장 ~ 7.5 DI를 이용해 다양한 구현 방법 적용하기 (0) 2021.08.20 7장) 7.3 서비스 추상화 적용 (0) 2021.08.08 - 스프링의 가장 대중적인 정의