가장 간단한 초보적인 재사용 방법으로 다른 Source를 복사해서 사용한다.
GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); String date = df.format(date);
A라는 클래스에서 사용하고 B라는 클래스에서 동일한 로직이 필요하여 복사하여 사용한 경우에 만약 JDK의 버전이 바뀌어 동일한 기능을 제공하는 항샹된 인터페이스가 제공 된다면 모든 클래스를 변경 해주어야 한다.
자주 사용되고 호출되는 유사한 기능들을 모아 메서드로 정의해서 재사용한다.
public class DateUtility { public static String toStringToday(String format) { GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); String date = df.format(date); } }
String sdate = DateUtility.toStringToday("yyyMMMdd");
Jdk 버전이 바뀌거나 메서드의 내용이 수정되어도 클래스를 모두 수정할 필요 없이, 해당 메서드 toStringToday()의 내용만 수정하면 된다.
toStringToday()메서드의 Signature을 변경하면 이 메서드를 사용하는 모든 클래스에게 영향을 준다.
복사 붙이기 보다는 진보된 방식이지만, 여전히 영역간의 결합도 문제는 존재한다.
public class person { public static String printBirthDate(String format) { DateUtility.toStringToday(birthDate, format); } }
관심의 분리 (Seperation of Concerns)
AOP가 핵심관심모듈의 코드를 직접 건드리지 않고 필요한 기능이 동작하도록 하는 데는 위빙(Weaving)이라고 하는 특수한 작업이 필요하다, 위빙 작업을 통하여 핵심모듈 사이에 필요한 횡단관심모듈이 동작하도록 만든다.
프로그램 개발에서 반복적으로 나타나는 과제를 해결하기 위한 방법중 하나로, 소프트웨어 개발과정에서 발견된 Know-How를 축척하여 이름을 붙여 이후에 재사용하기 좋은 형태로 특정 규악을 묶어서 정리한 것.
비기능적(Non-Funtional) 요구사항(성능, 보안, 기능, 확장성, 안정성등)을 만족하는 구조와 구현된 기능을 안정적으로 실행하도록 제어해주는 잘 만들어진 라이브러리의 덩어리
디자인 패턴은 프레임워크의 핵심적인 특징이고, 프레임워크를 사용하는 애플리케이션에 그 패턴이 적용된다는 특징을 가지고 있다. 하지만 프레임워크는 디자인 패턴이 아니다.
Ioc란 "제어의 역전" 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다는 뜻이다. 즉, 컨테이너 역할을 해주는 프레임워크에게 제어 권한을 넘겨 개발자의 코드가 신경 써야 할 것을 줄이는 전략이다.
프레임워크는 특정 부분의 기술적인 구현을 라이브러리 형태로 제공한다.
프레임워크와 라이브러리의 가장큰 차이는 프레임워크는 프레임워크코드가 유저코드를 호출하는 것이고, 라이브러리는 유저코드가 라이브러리를 호출하여 제어한다는 것이다.
디자인 패턴 + 라이브러리 = 프레임워크
프레임워크의 라이브러리를 살펴볼 때도 적용된 패턴을 주목해서 살펴 보면 그 구성을 이해하기 쉽다.
특히 프레임워크를 확장하거나 커스터마이징 할 때는 프레임워크에 적용된 패턴에 대한 이해가 필요하다.
아키텍처 결정 = 사용하는 프레임워크 종류 + 사용전략