July 2009 Archives

우리가 객체와 객체의 관계를 설계할때 고려할 사항이 몇가지 있습니다만, 그중 하나가 재사용성입니다.
객체지향을 이루는 원리 중 하나가 재사용성이라고는 강의중에 말씀드린바 있습니다. 재사용성을 높이기 위해 사용하는 방법 중 하나가 인터페이스를 추출해 내는 것입니다.
인터페이스를 추출하고, 이를 상속받는 오브젝트를 구현함으로서, 추후 동일한 클래스를 사용하는 클래스, 즉 클라이언트 클래스의 로직을 수정하지 않도록 하는 것이지요.
예를 들어 보겠습니다.
우리는 비디오대여점에서 고객의 주소정보를 바꾸고 싶다고 하겠습니다. 먼저 비디오 대여점의 코드는 다음과 같습니다.

public class MovieRenter {
        private PersonCustomer customer = new PersonCustomer();
        ...
        public void changeCustomerAddress(String newAddress) {
                // 고객의 주소 정보를 바꾼다.
                customer.changeAddress(newAddress);
        }
        ...
}


PersonCustomer 라는 클래스가 있습니다. 이 클래스는 고객중에 개인 고객 정보를 담는 클래스로서, 주소를 바꿀 수 있는 메소드를 제공하죠. 소스는 다음과 같습니다.

public class PersonCustomer {
        ...
        public void changeAddress(String address) {
                // 주소를 바꾼다. 
        }
        ...
}


여기서 만일 또 다른 고객 유형이 추가 된다고 생각해 보세요.(실제로 고객 유형은 상당히 많죠)
새로운 고객 유형이 추가 된다면, 우리는 MovieRenter 소스를 수정해야 합니다. 즉, MovieRenter 클래스는 재사용할 수 없는 클래스가 되어 버리고 말죠.
이를 위해서 고객 클래스들을 Customer 라는 인터페이스를 상속받도록 하겠습니다. 코드는 아래와 같습니다.


public interface Customer {
        ...
        public void changeCustomerAddress(String newAddress);
        ...
}


그리고 PersonCustomer는 위의 인터페이스를 상속받죠. 코드는 다음과 같습니다.

public class PersonCustomer implements Customer {
        ...
        public void changeAddress(String address) {
                // 주소를 바꾼다. 
        }
}


자. 다시 MovieRenter 클래스 코드를 보겠습니다. 고객 객체를 생성하는 부분을 잘 확인하세요. 

public class MovieRenter {
        private Customer customer = new PersonCustomer();
        ...
        public void changeCustomerAddress(String newAddress) {
                // 고객의 주소 정보를 바꾼다.
                customer.changeAddress(newAddress);
        }
        ...
}

고객을 생성하는 코드 확인하셨나요? new PersonCustomer();를 호출하게 되어 있습니다. 자, 이것이 문제 입니다. 
우리는 소스를 수정하기 않기 위해 Customer 인터페이스를 이용하고자 하였습니다. 하지만, 코드상에서는 객체를 생성하기 위해서 PersonCustomer를 사용하게 됩니다. 
결국 인터페이스를 사용하였어도 구현 클래스에 의존할 수 밖에 없어 지는 것입니다..

의존성 주입은 위와 같은 의존 상황을 회피하기 위한 방법입니다.
MovieRenter클래스에서 PersonCustomer클래스를 참조하지 않기 위해 즉, 의존하지 않기 위해, 스프링 프레임웍 같은 컨테이너에서 customer 오브젝트에 객체를 생성해 주는 것입니다. 이를 주입(injection)이라 합니다.
실제로 의존성 주입을 사용한 코드는 다음과 같습니다.

public class MovieRenter {
        private Customer customer;
        public void setCustomer(Customer newCustomer){
                this.customer = newCustomer;
        }
        ...
        public void changeCustomerAddress(String newAddress) {

                // 고객의 주소 정보를 바꾼다.

                customer.changeAddress(newAddress);
        }
        ...
}

코드상에서 PersonCustomer가 사라진 것을 확인하실 수 있습니다. 
위와 같이 우리는 의존성 주입을 이용하여 불필요한 의존성(PersonCustomer참조)을 제거 할 수 있습니다.

정리하겠습니다. 의존성 주입은 객체에 필요한 타 객체의 생성을 책임지는 방법입니다.(객체 생성 방법중 하나로 보셔도 좋습니다.) 다시 말하면, 프레임웍에서 주입할 객체(PersonCustomer)를 생성하여 필요한 객체(MovieRenter)에 의존성을 주는 것입니다. 

고객에게 요구사항을 털어내게 하는 방법중 가장 좋은 방법은 대화이다. 대화를 하면서 모르거나 궁금한 것을 물어보고, 그에 대한 답변을 해주는 방식이 가장 일반적인 것이라 할 수 있겠다. 하지만, 우리는 무엇이 궁금한지 모르고 고객은 무엇을 답변해야 하는지 모른다. 무언가를 만들어 보여주어야 할 우리가 궁금한 것을 모른다는 것은 어쩌면 황당한 상황일런지는 모르지만, 현실이 그렇다. 그래서 우리는 최대한 궁금한 것을 짜 내어 프로토타입핑 작업을 하고, 이를 매개체로 하여 고객과 대화 한다.
빠른 프로토타이핑이라는 것은 빠른 요구사항 도출에 필수적이다. 일정한 시간내에서 빠른 요구사항 도출은 프로젝트를 성공으로 이끄는 데 상당한 역할을 한다. 빠른 프로토타이핑을 위해 깔끔하고 사용하기 편한 UI 목업 툴을 하나 소개하고자 한다.이미 상당수의 사람들이 사용하고, 사랑하고 있는 Balsamiq 이다.



부차적인 설명은 필요 없을 듯 하다. 아래의 동영상을 보자.



전부터 눈 여겨 보고 있던 툴인데, 이번 프로젝트에 적용해보게 되었다.

Recent Comments

동치미 on 오브젝트와 오브젝트 타입, 그리고 클래스: 에~ 시간이 없어서
동치미 on WP의 부활: //드루지기 안녕하
드루지기 on WP의 부활: 워드프레스 좋지요.
동치미 on 느림의 미학: [민달이] 감사합니
민달이 on 느림의 미학: 저도 여유를 가지자
동치미 on 철학을가진개발자 Vs 그렇지않은개발자: [데꾸벅] 막걸리
동치미 on 근황!: //kimgisa
kimgisa on 근황!: Email 주소 안
데꾸벅 on 철학을가진개발자 Vs 그렇지않은개발자: 장신정신 = 철학
동치미 on 근황!: 민달이님 때문이라도

Sign In

About this Archive

Find recent content on the main index or look in the archives to find all content.