스프링보다 중요한 스프링 이야기
박성철

(한국 스프링 사용자 모임; KSUG)
生卽苦
좋은 SW란?
좋은 SW란?
기능 품질 구조 품질
신규 기능 추가
기능 구현 + 통합
“우린 못해!”

“우린 안해!”
소프트웨어 위기
소프트웨어 위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
인텔 CPU 클럭 속도 향상 속도
미녀라고 하더니…
SW 위기
SW 개발 문제
SW 품질 문제
SW 기능 문제
SW 구조 문제
보이는 문제
숨은 문제
SW 개발 문제
SW 기능 문제
SW 구조 문제
보이는 문제
숨은 문제
테스트
설계 & 아키텍처
개발 방법론
분해

(decomposition, factoring)
관심사 분리

(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”
SW 구조
코드 한 덩어리
수평적 분리
표현 계층
애플리케이션 계층
도메인 계층
데이터 접근/시스템 통합 계층
수직적 분리
기능A
기능B
기능C
기능D
기능E
기능F
수평/수직적 분리
AaaControl
AaaService
AaaBiz
AaaDao
BbbControl
BbbService
BbbBiz
BbbDao
CccControl
CccService
CccBiz
CccDao
DddControl
DddService
DddBiz
DddDao
수평/수직적 분리
AaaControl
XxxService
AbcBiz
QazDao
BbbControl
WsxDao
CccControl
YyyService
EdcDao
DddControl
ZzzService
RfvDao
DefBiz GhiBiz JklBiz MnoBiz
사용자 인터페이스 모델
쓰임새(Use Case) 모델
데이터 모델
객체 지향 프로그래밍
객체지향 프로그래밍
동적 디스패치
캡슐화 서브타입 다형성
객체 위임
상속
Open
Recursion
클래스
인스턴스
메서드
추상화
다이나믹 디스패치 ≒ 메시징
“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)
間
순서도 vs 소통도

(flow chart vs communication diagram)
메시지
대면 대화 X 지인과의 전화 통화 X
메시지
맥도날드에서 주문하기 O
invokeinterface
자바의 네(다섯)가지 호출 방식
invokestatic invokespecial
invokevirtual
invokedynamic
안o 친f야( 이것 좀 부탁해(
n가 ph지 몰라x 신분은 아s 이것 좀 처리해줘(
n가 ph지 x무지 모르겠지만 이것 좀 처리해줘(
인터페이스 중심 설계
“7KoAKammCGA Mo aG CGMeK@ace,SGoM aG CmplemeGMaMCoG”
2o@ 디자인 패턴
X
설계
구현
역할
의존관계 역전 원칙

(Dependency inversion principle; DIP)
AbcService
X
SomeRepository
SomeDao
서비스 계층
데이터 접근 계층
생성과 사용 분리

(Separation of Use from Construction)
객체 생성 문제
malloc() new
?
GRASP의 생성자(creator) 원칙
누가 객체를 생성해야 하나?

대상 클래스로 구성되는 클래스

대상 클래스를 담고 있는 클래스

대상 클래스의 인스턴스를 기록하는 클래스

대상 클래스와 가깝게 사용되는 클래스

대상 클래스를 생성하는데 필요한 데이터가 있는 클래스
5A A G
 9AN J N G
 1NN A
 :JB R A
  GAN
객체 생성과 구현 의존 문제
사용
생성
구현에 의존
Servicesvc=newAwesomeService();
svc.showMeTheMoney();
AwesomeService
Service
공장 매서드 패턴
사용
생성
publicdoThis(){
Servicesvc=createService()
svc.showMeTheMoney();
}
protectedServicecreateService();
AwesomeService
Service
protectedServicecreateService(){
returnnewAwesomeService();
}
공장 매서드
복잡한 의존 관계 문제
No man is an island entire of itself; every
man  is a piece of the continent, a part of
the main;
사용 생성
?
애플리케이션 구성
마법사
피예로
글린다
엘파바네사로즈
딜라몬드
김선영
박혜나
김소현
김보영
이지훈
조상웅
남경주
이상준
마법사피예로글린다엘파바
역할 배우배역구성
객체
메시지 (역할) 데이터  로직(구현)
인터페이스
Acme Processor
AcmeUI AcmeLogic AcmeDAO
AcmeUI
AcmeL
ogic
AcmeD
AO
RealAcmeLogic RealAcmeDAO
인터페이스
클래스
예) Acme Processor
인터페이스를 사용한 설계
DIP
AcmeUI
AcmeL
ogic
AcmeD
AO
RealAcmeLogic DevAcmeDAO
예) Acme Processor 개발용
AcmeUI
AcmeL
ogic
AcmeD
AO
FakeAcmeLogic X
예) Acme Processor UI 테스트용
배역 구성
AcmeL
ogic
AcmeD
AO
RealAcmeLogic
RealAcmeDAO
상용
DevAcmeDAO
개발
TestAcmeDAO
테스트
FakeAcmeLogic
UI테스트
AcmeTestCase
테스트
AcmeUI
RealBigAcmeDAO
빅데이터
추상 공장 패턴
사용 생성
공장1
공장2
공장3
+ =
+ =
+ =
구성1
구성2
구성3
생
성
요청 구현
구현
의존성 주입

(Dependency Injection)
사용
생성
구성 메타 데이터 1
구성 메타 데이터 2
구성 메타 데이터 3
구성1
구성2
구성3
DI 프레임워크
+
+
+
점진적인 성장
변경비용
시간
기술부채
예
상
현실
시장 대응 속도
D N/ RRR BG F J DJ JN GA A J ((- )., ,
설계 시점
2
  AN
 ;
 4 J
“시스템 설계에 매일 투자하라( ((( 현재 설b가 여러분이 이해한 최선의 설b와
일치하x록 점진적이면서x 지속적으로 작업한t(” ' 켄트 벡
폭포수 근본주의
BDUF(포괄적 사전 설계)
DUF
창발적 설계
막 개발
YAGN!!!
JP
 1 U
 5J
 7AA
 
설계 = 소스 코드
J
  N
  J
  JP
  P G
 NJB R A0
  J
  N
 
JP
  AN
 NJB R A
 
 
B G
 NJP A
  J A
  N
  DA

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