# 7.7 위임 숨기기 (Hide Delegate)

리팩터링 전

```javascript
manager = aPerson.department.manager;
```

리팩터링 후

```javascript
manager = aPerson.manager;

class Person {
  get manager() {return this.department.manager;}
}
```

## 🧷 배경

모듈화 설계를 제대로 하는 핵심은 캡슐화.

의존성을 없애기 위해 서버 자체에 위임 메서드를 만들어서 위임 객체의 존재를 숨겨 위임 객체가 수정되도 서버 코드만 고치면 되서 클라이언트는 아무런 영향을 받지 않는다.

즉, 클라이언트가 위임 객체의 존재를 몰라도 되도록 감춘다.

## 🧷 절차

1. 위임 객체의 각 메서드에 해당하는 위임 메서드를 서버에 생성한다.
2. 클라이언트가 위임 객체 대신 서버를 호출하도록 수정한다. 하나씩 바꿀 때마다 테스트한다.
3. 모두 수정했다면, 서버로부터 위임 객체를 얻는 접근자를 제거한다.
4. 테스트한다.

## 🧷 예시

```javascript
// 클라이언트...
manager = aPerson.department.manager; // department 삭제.
```

1. 클라이언트 코드를 다 고쳤다면 사람 클래스의 `department()` 접근자를 삭제한다.

```javascript
// Person클래스...
get manager() {return this._department.manager;}
```

2. 모든 클라이언트가 이 메서드를 사용하도록 고쳐준다.

```javascript
// 클라이언트...
manager = aPerson.department.manager;
```

3. 클라이언트에서 어떤 사람이 속한 부서의 관리자를 알고 싶다고 하면, 부서 객체부터 가져와야한다.\
   클라이언트는 부서 클래스의 작동 방식, 관리자 정보를 제공한다는 사실을 알아야 한다. 이 때 의존성을 줄이려면 클라이언트가 부서 클래스를 볼 수 없게 숨기고, 사람 클래스에 위임 메서드를 만들어준다.

```javascript
// Person 클래스...
constructor(name){
  this._name = name;
}
get name() {return this._name;}
get department() {return this._department;}
set department(arg) {this._department = arg;}

// Department 클래스...
get chargeCode()  {return this._chargeCode;}
set chargeCode(arg) {this._chargeCode = arg;}
get manager() {return this._manager;}
set manager(arg)  {this._manager = arg;}
  
```

<br>
