76
스프링보다 중요한 스프링 이야기 박성철 (한국 스프링 사용자 모임; KSUG)

스프링보다 중요한 스프링 이야기

Embed Size (px)

Citation preview

Page 1: 스프링보다 중요한 스프링 이야기

스프링보다 중요한 스프링 이야기

박성철(한국 스프링 사용자 모임; KSUG)

Page 2: 스프링보다 중요한 스프링 이야기

生卽苦

Page 3: 스프링보다 중요한 스프링 이야기

좋은 SW란?

Page 4: 스프링보다 중요한 스프링 이야기

좋은 SW란?

기능 품질 구조 품질

Page 5: 스프링보다 중요한 스프링 이야기

신규 기능 추가

기능 구현 + 통합

“우린 못해!”“우린 안해!”

Page 6: 스프링보다 중요한 스프링 이야기

소프트웨어 위기

소프트웨어 위l의 주요한 위lr 컴퓨터 성능이 몇 수십 배나 더 강력해졌기 때문입st! 심하게 말하면, 컴퓨터가 없었을  r 프로i래밍에r 전혀 문제가 없었습st( q린 컴퓨터 몇 개 뿐이었을  r 프로i래밍이 조k 문제가 되었c, 이제r 거v한 컴퓨터에 프로i래밍x 따라서 거v한 문제가 되었습st(

' 에츠허르 w이크스트라 / 1.-, 01M 튜링상 수상 연설

F. L. 바우어(Fritz Bauer), 1968, 나토 SW 공학 학회http://homepages.cs.ncl.ac.uk/brian.randell/NATO/NATOReports/index.html

Page 7: 스프링보다 중요한 스프링 이야기

인텔 CPU 클럭 속도 향상 속도

Page 8: 스프링보다 중요한 스프링 이야기

미녀라고 하더니…

Page 9: 스프링보다 중요한 스프링 이야기

SW 위기

SW 개발 문제

SW 품질 문제

SW 기능 문제

SW 구조 문제

보이는 문제

숨은 문제

Page 10: 스프링보다 중요한 스프링 이야기

SW 개발 문제

SW 기능 문제

SW 구조 문제

보이는 문제

숨은 문제

테스트

설계 & 아키텍처

개발 방법론

Page 11: 스프링보다 중요한 스프링 이야기

분해(decomposition, factoring)

Page 12: 스프링보다 중요한 스프링 이야기

관심사 분리(Separation of concerns)

Edsger W. Dijkstra, 1974, "On the role of scientific thought”

“e심사 분리r, 완벽하지r 않t 해x, 아직은 ph가의 생각을 효율적으로 정리하rw 사용할 수 있r 유일한 l법이t(”

“sepaKaMCoG o@ coGceKGs X eOeG C@ GoM peK@ecMly possCble Cs yeM Mhe oGly aOaClable MechGCJue @oK e@@ecMCOe oKdeKCGA o@ oGe’s MhouAhMs”

“특정 e점에 주의를 집중함”“@ocusCGA oGe's aMMeGMCoG upoG some aspecM”

Page 13: 스프링보다 중요한 스프링 이야기

SW 구조

Page 14: 스프링보다 중요한 스프링 이야기
Page 15: 스프링보다 중요한 스프링 이야기

코드 한 덩어리

Page 16: 스프링보다 중요한 스프링 이야기

수평적 분리

표현 계층

애플리케이션 계층

도메인 계층

데이터 접근/시스템 통합 계층

Page 17: 스프링보다 중요한 스프링 이야기

수직적 분리

기능

A

기능

B

기능

C

기능

D

기능

E

기능

F

Page 18: 스프링보다 중요한 스프링 이야기

수평/수직적 분리

AaaControl

AaaService

AaaBiz

AaaDao

BbbControl

BbbService

BbbBiz

BbbDao

CccControl

CccService

CccBiz

CccDao

DddControl

DddService

DddBiz

DddDao

Page 19: 스프링보다 중요한 스프링 이야기

수평/수직적 분리

AaaControl

XxxService

AbcBiz

QazDao

BbbControl

WsxDao

CccControl

YyyService

EdcDao

DddControl

ZzzService

RfvDao

DefBiz GhiBiz JklBiz MnoBiz

사용자 인터페이스 모델

쓰임새(Use Case) 모델

데이터 모델

Page 20: 스프링보다 중요한 스프링 이야기

객체 지향 프로그래밍

Page 21: 스프링보다 중요한 스프링 이야기

객체지향 프로그래밍

동적 디스패치

캡슐화 서브타입 다형성

객체 위임상속

Open Recursion

클래스

인스턴스

메서드

추상화

Page 22: 스프링보다 중요한 스프링 이야기

다이나믹 디스패치 ≒ 메시징

“m게 OO7r 메시징d 상태 처리 d정의 지역적 보존,

보호, 은익d 모든 것의 극u적인 지연 바인딩 뿐이t(”“OO7 Mo me meaGs oGly messaACGA, local KeMeGMCoG aGd pKoMecMCoG aGd

hCdCGA o@ sMaMe'pKocess, aGd exMKeme laMe'bCGdCGA o@ all MhCGAs”

“중요한 착안은 “메시지”이t( 이r 스몰톡d 스퀵 핵심

의 본질이t( 일본어에 마(ま)라r 짧은 u어가 있t(”“9he bCA Cdea Cs “messaACGA" MhaM Cs PhaM Mhe keKGal o@ SmallMalk)SJueak Cs

all abouM( 9he JapaGese haOe a small PoKd Tma’(((”

앨런 케이(0laG Kay) 間

Page 23: 스프링보다 중요한 스프링 이야기

순서도 vs 소통도(flow chart vs communication diagram)

Page 24: 스프링보다 중요한 스프링 이야기

메시지

대면 대화 X 지인과의 전화 통화 X

Page 25: 스프링보다 중요한 스프링 이야기

메시지

맥도날드에서 주문하기 O

Page 26: 스프링보다 중요한 스프링 이야기

invokeinterface

자바의 네(다섯)가지 호출 방식

invokestatic invokespecial

invokevirtual

invokedynamic

안o 친f야( 이것 좀 부탁해(

n가 ph지 몰라x 신분은 아s 이것 좀 처리해줘(

n가 ph지 x무지 모르겠지만 이것 좀 처리해줘(

Page 27: 스프링보다 중요한 스프링 이야기

인터페이스 중심 설계

“7KoAKammCGA Mo aG CGMeK@ace,SGoM aG CmplemeGMaMCoG” 2o@ 디자인 패턴

X

설계

구현

역할

Page 28: 스프링보다 중요한 스프링 이야기

의존관계 역전 원칙(Dependency inversion principle; DIP)

AbcService

X

SomeRepository

SomeDao

서비스 계층

데이터 접근 계층

Page 29: 스프링보다 중요한 스프링 이야기

생성과 사용 분리(Separation of Use from Construction)

Page 30: 스프링보다 중요한 스프링 이야기

객체 생성 문제

malloc() new?

GRASP의 생성자(creator) 원칙

누가 객체를 생성해야 하나?

대상 클래스로 구성되는 클래스대상 클래스를 담고 있는 클래스

대상 클래스의 인스턴스를 기록하는 클래스대상 클래스와 가깝게 사용되는 클래스

대상 클래스를 생성하는데 필요한 데이터가 있는 클래스

5A A G����������� ������������������  9AN J N G ����������� ������������������  1NN A ����������� ������������������  :JB R A����������� ������������������   GAN

Page 31: 스프링보다 중요한 스프링 이야기

객체 생성과 구현 의존 문제

사용

생성

구현에 의존

Service>svc>=>new>AwesomeService();>svc.showMeTheMoney();

AwesomeService

Service

Page 32: 스프링보다 중요한 스프링 이야기

공장 매서드 패턴

사용

생성

public>doThis()>{>Service>svc>=>createService()>svc.showMeTheMoney();>

}>

protected>Service>createService();

AwesomeService

Service

protected>Service>createService(){>return>new>AwesomeService();>

}

공장 매서드

Page 33: 스프링보다 중요한 스프링 이야기

복잡한 의존 관계 문제No man������ is an island entire of itself; every man������ is a piece of the continent, a part of

the main;

사용 생성

?

Page 34: 스프링보다 중요한 스프링 이야기

애플리케이션 구성

Page 35: 스프링보다 중요한 스프링 이야기

마법사

피예로

글린다

엘파바

네사로즈

딜라몬드

Page 36: 스프링보다 중요한 스프링 이야기

김선영

박혜나

김소현

김보영

이지훈

조상웅

남경주

이상준

마법사

피예로

글린다

엘파바

역할 배우배역구성

Page 37: 스프링보다 중요한 스프링 이야기

객체

메시지 (역할) 데이터 & 로직(구현)

인터페이스

Page 38: 스프링보다 중요한 스프링 이야기

Acme Processor

AcmeUI AcmeLogic AcmeDAO

Page 39: 스프링보다 중요한 스프링 이야기

AcmeUI

AcmeLogic

AcmeDAO

RealAcmeLogic RealAcmeDAO

인터페이스

클래스

예) Acme Processor

인터페이스를 사용한 설계

DIP

Page 40: 스프링보다 중요한 스프링 이야기

AcmeUI

AcmeLogic

AcmeDAO

RealAcmeLogic DevAcmeDAO

예) Acme Processor 개발용

Page 41: 스프링보다 중요한 스프링 이야기

AcmeUI

AcmeLogic

AcmeDAO

FakeAcmeLogic X

예) Acme Processor UI 테스트용

Page 42: 스프링보다 중요한 스프링 이야기

배역 구성

AcmeLogic

AcmeDAO

RealAcmeLogic

RealAcmeDAO상용

DevAcmeDAO

개발

TestAcmeDAO

테스트

FakeAcmeLogic

UI테스트

AcmeTestCase

테스트

AcmeUI

RealBigAcmeDAO

빅데이터

Page 43: 스프링보다 중요한 스프링 이야기

추상 공장 패턴

사용 생성

�� ��

공장1

공장2

공장3

+ =

+ =

+ =

구성1

구성2

구성3

생성 요

청 구현

구현

Page 44: 스프링보다 중요한 스프링 이야기

의존성 주입(Dependency Injection)

사용

생성구성 메타 데이터 1

구성 메타 데이터 2

구성 메타 데이터 3

구성1

구성2

구성3

DI 프레임워크

+++

Page 45: 스프링보다 중요한 스프링 이야기

점진적인 성장

Page 46: 스프링보다 중요한 스프링 이야기

변경

비용

시간

기술부채

예상

현실시장 대응 속도

Page 47: 스프링보다 중요한 스프링 이야기

D N/ RRR BG F J DJ JN GA A J ((- )., ,

Page 48: 스프링보다 중요한 스프링 이야기

설계 시점

2 ����������� ������������������   AN ����������� ������������������  ; ����������� ������������������  4 J

“시스템 설계에 매일 투자하라( ((( 현재 설b가 여러분이 이해한 최선의 설b와 일치하x록 점진적이면서x 지속적으로 작업한t(” ' 켄트 벡

폭포수 근본주의

BDUF(포괄적 사전 설계)

DUF

창발적 설계

막 개발

YAGN!!!JP����������� ������������������  1 U ����������� ������������������  5J ����������� ������������������  7AA ����������� ������������������  

Page 49: 스프링보다 중요한 스프링 이야기

설계 = 소스 코드

J ����������� ������������������   N����������� ������������������   J ����������� ������������������   JP ����������� ������������������   P G ����������� ������������������  NJB R A0����������� ������������������   J ����������� ������������������   N����������� ������������������  JP ����������� ������������������   AN ����������� ������������������  NJB R A ����������� ������������������  ����������� ������������������  

B G����������� ������������������  NJP A����������� ������������������   J A����������� ������������������   N����������� ������������������   DA����������� ������������������   A G����������� ������������������  NJB R A����������� ������������������   AN ����������� ������������������   ����������� ������������������   DA ����������� ������������������  AS AN����������� ������������������  NJ A����������� ������������������  JB����������� ������������������   DA����������� ������������������   J NA PA AN����������� ������������������  JB����������� ������������������   D ����������� ������������������   NNP J ����������� ������������������  

����������� ������������������  6 F����������� ������������������  9AA AN

•테스트 가능(Testable): 작은 테스트 가능한 단위 •이해 가능(Understandable): •Browsable •Explainable

TUBE

Page 50: 스프링보다 중요한 스프링 이야기

OOP/D 5원칙(SOLID)단일 책임 원칙(Single responsibility principle)e����������� ������������������   h ����������� ������������������  qd ����������� ������������������  tY k ����������� ������������������   ����������� ������������������   ����������� ������������������  v ����������� ������������������   a����������� ������������������  

개방-패쇄 원칙(Open/closed principle)����������� ������������������  b ����������� ������������������   ����������� ������������������   ’ ����������� ������������������   r ����������� ������������������   ����������� ������������������  tY ����������� ������������������  

����������� ������������������   a����������� ������������������  

리스코프 치환 원칙(Liskov substitution principle)l i ����������� ������������������   ����������� ������������������   y ����������� ������������������   fn ����������� ������������������   px����������� ������������������   ����������� ������������������   ����������� ������������������   l����������� ������������������  c����������� ������������������   ����������� ������������������   ����������� ������������������   a ����������� ������������������  

인터페이스 분리 원칙(Interface segregation principle)����������� ������������������   g m����������� ������������������   ����������� ������������������   ����������� ������������������   ����������� ������������������   ����������� ������������������  s ����������� ������������������   ����������� ������������������   u

a����������� ������������������   a ����������� ������������������  

의존관계 역전 원칙(Dependency inversion principle)w ����������� ������������������   ����������� ������������������  o ����������� ������������������   w ����������� ������������������   g

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Page 51: 스프링보다 중요한 스프링 이야기

GRASP일반 책임 할당 소프트웨어 원칙(또는 패턴)

Information Expert

Controller

Creator

High Cohesion

Low Coupling

Indirection

Pure Fabrication

Polymorphism

Protected Variations

http://en.wikipedia.org/wiki/GRASP_%28object-oriented_design%29

Page 52: 스프링보다 중요한 스프링 이야기

설계 패턴

크리스토퍼 알렉산더: 패턴 창안

켄트 벡 & 워드 커닝햄: SW에 패턴 도입 (OOPSLA 1987)

에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시데스: 디자인 패턴 출판

Creational patterns

Structural patterns

Behavioral patterns

Page 53: 스프링보다 중요한 스프링 이야기

템플릿 메서드 패턴

Page 54: 스프링보다 중요한 스프링 이야기

전략 패턴

Page 55: 스프링보다 중요한 스프링 이야기

관찰자 패턴

Page 56: 스프링보다 중요한 스프링 이야기

파사드 패턴

Page 57: 스프링보다 중요한 스프링 이야기

리팩터링

구현

Feedback(학습)

& 변경(=개선)

설계

시간

Page 58: 스프링보다 중요한 스프링 이야기

테스트 자동화

Fast: 테스트는 수행 속도가 빨라서 테스트에 부담이 없어야 한다.Independent: 테스트는 서로 영향을 주지 않고 독립적으로 순서에 상관 없이 실행될 수 있어야 한다.Repeatable: 테스트는 어떤 환경에서도 반복해서 실행할 수 있어야 한다.Self-Validating: 테스트는 사람이 관여하지 않고도 결과를 알 수 있도록 참과 거짓이 분명해야 한다.Timely: 테스트는 적시에 작성해야 한다. 구현 바로 직전이 최적이다.

F.I.R.S.T

수시로 리팩터링을 수행하면서 점진적으로 설계를 개선하도록 도와주는 안전장치

Page 59: 스프링보다 중요한 스프링 이야기

창발적 설계

- 코드 속 설계의 발굴

- 효과적인 추상화- 기술적 추상화

- 문제 도메인 추상화

- 관용적 패턴 수집

Page 60: 스프링보다 중요한 스프링 이야기

진화하는 아키텍처

“i  아키텍트들이 왔t( i들은 X7가 프로i래머들한테r 좋을지 몰라x, 아키텍처를 프로젝트 초기의 어느 단계에서 설계할 수 있x록 해준t면 모든 일이 훨씬 부드럽게 진행될 거라c 설명했t( 사람들은 이에 v해, 흐름을 옹호해야 하며, 아키텍트 역시 흐름 원칙에 따라서 처음에r 아키텍처를 시작하l 충분할 정x로만 만들c 일을 진행하면서 꾸준히 다듬어가야 한tr 주장을 아키텍트들에게 퍼부었t( ag i들은 마지못해 i렇게 하겠tc y의했지만, i래x 아키텍처 ub가 따로 있r 만큼 좋지r 않을 것이라c 말했t(”

?익스트림 프로i래밍, 71,0, “전체 X7팀”에서

Page 61: 스프링보다 중요한 스프링 이야기

횡단 관심사

로직 A 로직 B 로직 C 로직 D캐시

인자 확인

트랜잭션 관리

로그 기록

인증

오류 차단

관심사 분리 대상

- 서로 다른 여러 추상 경로에 횡단으로 걸친 중복

- 분해하기 불가능 하거나 어려움

- 강한 결합

- 반복적인 다량의 코드 양산

- 낮은 코드 재사용, 가독성의 원인

Page 62: 스프링보다 중요한 스프링 이야기

관점 지향 프로그래밍

• 횡단 관심사의 중앙 집중

• 메서드 호출을 가로채어 처리

• 새로운 행위를 추가

• 재사용성 향성

• 가독성 향상

횡단 관심사를 분리함으로서 모듈화를 고도화 하려는 기술

Page 63: 스프링보다 중요한 스프링 이야기

스프링 프레임워크

Page 64: 스프링보다 중요한 스프링 이야기

스프링 프레임워크는…

Java EE w/o EJB

Java Application Framework

Page 65: 스프링보다 중요한 스프링 이야기

스프링 프레임워크는…

스프링 프레임워크는 자바 플렛폼으로서 자바 애플리케이션을 개발하는데 필요한 하부 구조를 포괄적으로 제공합니다. 스프링이 하부 구조를 처리하므로 개발자는 애플

리케이션 개발에 집중할 수 있습니다.

Spring Framework is a Java platform that provides comprehensive infrastructure support for developing Java applications. Spring handles the infrastructure so you can focus on your application.

Page 66: 스프링보다 중요한 스프링 이야기

Java EE

• Java EE는 다량의 배관 코드를 요구한다.• 많은 Java EE 관련 패턴은 Java EE의 단점 때문에 생겼다.• Java EE는 테스트가 힘들다.• Java EE는 개발자가 쓰기에는 적당하지 않다.

이런 문제에도 불구하고 Java EE는 풍부한 개발 기반을 제공한다.

Java EE를 추상화해서 개발자가 편하게 사용할 수 있는 추상화 계층 필요

Page 67: 스프링보다 중요한 스프링 이야기

봄(스프링)의 대삼각형

순수 객체(POJO)

의존

관계

주입

Dependency Injection

관점

중심

프로그래밍

Aspect Orientated Program

ming

이식 가능한 서비스 추상화Portable Service Abstraction

애플리케이션 구성횡단 관심사 분리

Page 68: 스프링보다 중요한 스프링 이야기

순수 객체(POJO)

의존

관계

주입

Dependency Injection

관점

중심

프로그래밍

Aspect Orientated Program

ming

이식 가능한 서비스 추상화Portable Service Abstraction

봄(스프링)의 대삼각형

Page 69: 스프링보다 중요한 스프링 이야기

육각형 아키텍처

Page 70: 스프링보다 중요한 스프링 이야기

인프라의 침투

유지 보수

어려움

테스트장애

개발 속도저하

결함 급증

Page 71: 스프링보다 중요한 스프링 이야기

비 침투적 스프링

POJO(순수 객체)

차단

Page 72: 스프링보다 중요한 스프링 이야기

스프링 모듈

Page 73: 스프링보다 중요한 스프링 이야기

스프링의 특징

• 관심사 분리를 통한 로직 순수성 유지(비침투성, POJO, DI, AOP)

• 컴포넌트 기반 애플리케이션 구성

• 컴포넌트 생애 관리

• Effective Java

• 테스트 용이성

• 각종 자바 EE 기술 통합

• 자바 EE 추상화를 통한 생산성 향상

• 메타프로그래밍

창발적 설계진화하는 아키텍처 지원

Page 74: 스프링보다 중요한 스프링 이야기

2000년 대 후반 이후의 변화

• 소비자 시장 개발 기술의 기업 시장 진출 시도

• 생산성 경쟁

• 클라우드 보급(IaaS, PaaS, SaaS)

• 무어의 법칙 종료, 멀티 코어 CPU 시대

• 빅 데이터/패스트 데이터

• 시스템 통합

Page 75: 스프링보다 중요한 스프링 이야기

스프링 IO 플랫폼

Page 76: 스프링보다 중요한 스프링 이야기

클린 코드, 11장 “시스템” + 12장 “창발성”