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 WP의 부활: //드루지기 안녕하
드루지기 on WP의 부활: 워드프레스 좋지요.
동치미 on 느림의 미학: [민달이] 감사합니
민달이 on 느림의 미학: 저도 여유를 가지자
동치미 on 철학을가진개발자 Vs 그렇지않은개발자: [데꾸벅] 막걸리
동치미 on 근황!: //kimgisa
kimgisa on 근황!: Email 주소 안
데꾸벅 on 철학을가진개발자 Vs 그렇지않은개발자: 장신정신 = 철학
동치미 on 근황!: 민달이님 때문이라도