본문 바로가기

Domain

(72)
애자일 개발의 기술 2/e - 애자일이란 무엇인가? 인상 깊은 내용을 추렸다. 대기업은 그들의 프로세스를 매우 세세하게 정의했다. 역할, 책임, 문서 템플릿, 모델링 언어 및 변경 통제 위원회까지 개발의 모든 측면을 엄격하게 정의하고 통제했다. 만약 프로젝트가 성공하지 못하면 더 많은 세부 사항, 문서 및 승인이 더해졌다. 사람들은 이를 더 단순하고, 더 가볍고, 덜 상세한 SW 개발 방법론을 만들었는데 이를 Adaptive Software Development, Feature-Driven Development, XP, Scrum 등으로 불렀다. 애자일의 정수 애자일 개발은 예측적이기보다는 적응적이며, 프로세스 지향보다는 사람 지향이다. Agile Cargo Cults 미군이 한 외딴 섬에 상륙했다. 섬의 원주민들은 근대 문명을 처음 봤고, 군인들과 그들..
생성자에서 많은 작업을 하는 것은 바람직하지 않은가? 개요 이전 포스팅에서 ViewModel의 생성자에서 많은 작업을 하는 것은 바람직하다는 저자의 코멘트가 있었다. 과연 정말 바람직하지 않은 것인지, 어떤 면에서 문제가 있는지 확인하고자 한다. 해당 포스팉에서는 Is doing a lot in constructors bad? - Stack Overflow의 의견들을 적극 참조했다. 생성자에서 작업 시 발생할 수 있는 문제점 생성자에서 많은 작업을 하는 것은 다양한 문제를 야기할 수 있다. 1. 테스트가 어렵게 만든다. 예를 들어, new를 통해 생성자에서 다양한 객체를 생성한다고 가정하자. 유닛 테스트가 매우 어려워질 것이다. 2. 단일 책임 원칙을 위반한다. 다양한 책임을 가진 많은 코드를 하나의 블록에 넣는 것은 좋지 않다. 3. 생성자의 코드가 일부..
[디자인패턴] 컴포지트 패턴(Composite Pattern) 컴포지트 패턴(Composite Pattern) 컴포지트 패턴이란 객체들의 관계를 트리 구조로 구성하여 전체-부분의 관계 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일한 인터페이스로 다룰 수 있다. 말이 어렵지만 대표적인 예시를 들면 디렉토리, 파일 구조와 같다. 디렉토리는 '복합 객체'이며 파일은 '단일 객체'이다. 사용자인 OS 유저는 디렉토리, 파일에 대해 삭제/이름 바꾸기 등의 작업을 동일한 인터페이스로 수행할 수 있다. Component: 구체적인 부분 Leaf: 부분 클래스(단일 객체)로 Composite의 일부가 될 수 있다. Composite: 복합 객체로 복수 개의 Component를 가질 수 있다. 즉, Component를 상속받아 구현한 Leaf와 Composi..
[디자인패턴] 널 오브젝트 패턴(Null Object Pattern) 널 오브젝트 패턴(Null Object Pattern) 자바에서 흔히 마주칠 수 있는 에러가 NullPointerException이다. 이를 방지하기 위해 if(object!=null) 등의 코드를 활용하게 된다. 특정 객체가 존재하지 않는다는 것을 null이아닌 Null Object를 반환하여 NullPointerException을 방지하는 기법이 널 오브젝트 패턴이다. 단점으로는 잘못 사용할 경우 예외나 에러를 발견하기 어려울 수 있다. 예제 금액을 지불하는 날짜가 정해져있는 신용카드 고객들이 있다. 널 오브젝트 패턴 활용 전 Customer c = DB.getCustomer("Bob"); if (c != null && c.isTimeToPay(today)) { c.pay(); } 널 오브젝트 패턴 ..
[디자인패턴] 미디에이터 패턴(Mediator Pattern) 미디에이터 패턴(Mediator Pattern) 미디에이터 패턴은 객체들 간의 상호작용 행위를 정리하여 따로 모아놓은 중재자(미디에이터) 객체를 따로 두어 관리하는 디자인 패턴이다. 객체 간의 직접적인 소통보다 중재자를 통해 소통하게 된다. 객체 간의 의존성을 줄여 결합도를 감소시킨다는 장점이 있다. 잘못 사용할 경우 중재자 객체에 모든 권한이 집중되어 크고 복잡해진다. MediatorBase: Colleague 객체 간의 상호작용을 위한 인터페이스 ConcreteMediator: MediatorBase 인터페이스를 실제 구현하여 객체 간의 상호작용을 돕는 클래스 ColleagueBase: Colleague의 기본 인터페이스 ConcreteColleague: Colleague 인터페이스를 구현한 클래스로..
[디자인패턴] 데코레이터 패턴(Decorator Pattern) 데코레이터 패턴(Decorator Pattern) 객체에 동적으로 새로운 기능을 추가하려고 할 때 사용한다. 이 과정에서 객체의 타입과 호출하는 메소드는 그대로 유지한다. 또한, 상속을 통해 하위 클래스를 만드는 방법이 비효율적인 상황에서 사용할 수 있다. 예제. 고전 전투기 게임 위와 같은 전투기 게임에서 아이템을 먹을 때 마다 새로운 무기가 추가되는 기능이 존재한다. 기본 구성 interface Fighter{ fun attack() } open class F22Fighter:Fighter{ override fun attack(){ print("발사") } } 데코레이터 패턴 위의 F22Fighter 전투에서 아이템을 먹을 때 마다 추가될 기능을 구현한다. interface FighterDecorat..
[디자인패턴] 프록시 패턴(Proxy Pattern) 프록시 패턴(Proxy Pattern) 프록시 패턴은 어떤 다른 객체로의 접근하는 것을 제어하기 위해 그 객체의 대리자의 역할을 제공하는 패턴을 의미한다. 프록시 패턴은 다음과 같은 경우에 주로 사용된다. 한 객체가 너무 일이 많아 대리인 객체가 일부 일을 처리해야할 때 한 객체를 은닉하고 대리인 객체를 앞으로 먼저 보여야할 때 (Placeholder의 역할) 사용 여부가 불확실 한 객체를 생성하는 것을 방지하고 실제 필요할 때 생성할 수 있게끔 할 때 --> 영상 썸네일 매우 간단한 구현 예시 interface Service{ fun doSomething() } open class MainService: Service{ override fun doSomething(){ print("I'm real") ..
[디자인패턴] 퍼사드 패턴(Facade Pattern) 퍼사드 패턴(Facade Pattern) 퍼사드 패턴은 가장 객체지향의 기본적인 패턴이다. 복잡한 코드를 뒤에 숨기고 간략화 된 인터페이스를 제공하는 패턴이다. 여러 클래스를 퍼서드 클래스 안에서 클래스들을 초기화해주고 특정 작업을 수행하면 된다. 예제 예를 들어, 사용자의 위치 정보를 얻어 해당 위치에 필요한 정보를 서버에 요청하여 받아온 뒤, 해당 값을 Json으로 바꾸는 과정이 존재한다. public class Example{ public static void main(String[] args){ double[] location = new GeoLocation().getLocation(); InternetConnection conn = new InternetConnection(); conn.conn..