6 min to read
헐리우드 원칙
헐리우드 원칙을 통한 비즈니스 문제의 해결과 소스코드 설계
세계적으로 영화와 연관된 키워드로 유명한 헐리우드가 있다.
헐리우드 원칙이란?
헐리우드 원칙(Hollywood Principle)이란 아래와 같다
사전적 정의는 없지만, 많은 위키와 글들에서 아래와 같이 말한다.
“Don’t call us, we’ll call you” 우리한테 연락하지 마세요. 우리가 연락할께요.
예를들면, 캠퍼스 리쿠르팅 (교내채용) 행사를 진행한다고 하자. 학생은 기업의 채용담당자를 찾아가서 이력서를 제출한다. 그리고 기다리면, 채용담당자에게 연락이 올 것이다.
하지만, 캠퍼스 리쿠르팅 (교내채용) 행사가 없다면?
- 기업에 채용행사 요청을 한다.
- 채용행사을 기다리고, 이력서를 제출한다.
- 이력풀에 이력등록을 하고 기다린다.
일반적으로는 위와 같이 생각 할 수 있다. 그래서? 어떤 선택지가 더 나은 방법일까?
- 행사요청 → 채용의사가 있는지, 행사를 할지를 정함 → 만약 정한다면 행사 참여 및 이력서를 제출
- 채용행사를 기다림 → 회사 : 회사의 채용의사와 채용행사 진행 유무를 결정
- 이력풀 등록 → 학생이 이력서를 제출 할 수 있음
학생이 할 수 있는 최선의 선택은 이력풀에 본인의 이력을 등록하는 것이다.
(1번은 행사유무 의사를 확인하고, 이후에 이력서를 제출하게 됨으로 시간이든다. 2번은 학생이 주도적으로 할 수 있는 일이 없다.)
최선의 선택을 위해서, 예시 상황에 대한 목표와 각 요소의 구성과 역할을 보자.
목표
채용(구직과 구인)
요소의 구성과 역할
학생(구직자) → 구직을 위한 본인의 이력서를 채용담당자에게 제공한다.
채용담당자(구인자) → 구인을 위해 학생(구직자)들의 이력서를 수집하고, 채용을 위한 활동을 한다.
이력서 → 학생의 희망 업무와 정보가 들어있다.
위 상황에서 학생과 채용담당자는 각자의 역할과 목표달성을 위해 다양한 일을 한다.
학생은 이력서 작성 후, 작성 된 이력서를 채용담당자에게 제공 할 것이다.
그러면, 이후에는 담당자는 일련의 절차를 거쳐 채용유무를 확정 할 것이다.
여기서 중요한 사항은 ‘추가적으로 이후에 발생하는 복잡한 일들’이다. 더욱 복잡한일로 고난도(High-Level)의 일들이 펼쳐진다.
채용담당자가 이력서를 검토하거나 사내 채용시스템 혹은 프로세스에 전달한다.
채용담당자는 검토 혹은 시스템(프로세스)를 통해서 돌아온 결과를 확인한다.
학생은 이력서를 수정한다.
채용담당자는 수정 이력서를 반영한다.
채용기업은 채용을 위한 준비를 한다. 행사를 열고, 채용담당자는 이력서를 검토하거나 프로세스를 이용하는 일부터, 수정이력서의 반영까지의 역할을 수행하고 있다.
학생은 이력서의 작성(수정포함)과 제출이 캠퍼스리쿠르팅에서 할 수 있는 유일한 결정적인 일이다.
이후의 일들은 전적으로 ‘채용담당자의 영역’이다. 수집된 이력서를 다루는 일은 채용담당자에게 넘겨진 것이다.
학생은 이력서를 제출 뒤에 할 수 있는 일이 극히 제한적이며, 채용과정에 참여 할 수 없다.
앞으로의 채용을 위한 여정은 ‘오직 채용기업과 담당자’만 할 수 있는 과정이다.
나의 의지로 시간에 맞춰서 순차적으로 해결 가능하던 일들이, 이력서 제출 후 채용기업의 의사에 맞춰서 진행해야 한다. (내가 관여 할 수도, 해서도 안되는 영역이니까..)
따라서 학생은 채용기업의 채용프로세스에 맞춰서 연락을 받고 행동 할 뿐이다. 구직자가 해야 할 일들에 대한 제어는 채용담당자(채용기업)을 통해서 이뤄진다.
즉, 헐리우드 원칙은 ‘당신이 할 일 중에서 내가 필요할 때 불러주면, 요청한 사항에 맞춰서 행동하겠다.’ 로 이해 할 수 있겠다. (요청한 사항 → 다양한 활용)
제어권의 소유와 흐름
단계 : 이력서작성 → 이력서 제출 → 채용(인터뷰, 계약등)
제어소유자 : 구직자 → 구직자 → 구인자
제어방향 → (순방향) → (순방향) ← (역방향)
*단계는 시간순으로 흐름, 학생을 기준(주체)로 볼 때 권한이 역전됨
Q)만약,학생이 채용담당자가의 이력서를 수정 할 수 있는 권한이 생긴다면 어떤 문제가 있을까?
만약, ‘검토 → 인터뷰요청 → 계약 → 채용완료’ 의 절차가 있다면, 절차상태 중간에 수정을 하면 검토 행위가 무시된다. 한명이라면 검토부터 다시하면 문제가 없다.
하지만 절차가 많고, 수정요청이 많을 경우 절차 수(N) * 사람(N)만큼의 변수가 발생한다. → 복잡도가 높아진다. 잘못생각하면 프로세스가 엉켜버린다.
이 문제를 해결 하려면 시간에 따라 프로세스가 동작해야만한다. 채용절차를 공개하고, 수정 가능한 일자를 제공하여 해당 날짜 이후에는 일괄처리 해야한다.
어디서 사용될까?
프로그래밍의 영역으로 옮겨보자.
흔히 헐리우드 원칙은 IoC 혹은 DI로 불린다.
HollywoodPrinciple is often called InversionOfControl, or DependencyInjection.
헐리우드원칙은 제어의 역전이나 의존성 삽입으로 흔히 불린다.
IoC와 DI를 사용하는 범주는 API와 Framework라고 할 수 있다.
프레임워크의 경우에는 요즘에는 유명한 Spring DI가 있으며, API의 경우 JS의 CallBack등을 활용한 경우가 포함된다.
예시는?
자바스크립트 API와 스프링프레임워크 DI를 통해서 실제 사례를 살펴볼 것이다.
여기서 중요하게 살펴봐야 할 점은 헐리우드 원칙 ‘당신이 할 일 중에서 내가 필요할 때 불러주면, 요청한 사항에 맞춰서 행동하겠다.’ 이다.
요청에 맞춰 행동하겠다는 것은, 다양하게 응용하여 ‘재사용’ 할 수 있다는 것이다.
자바스크립트 API
함수 call이 이전의 경우에는 전역변수 name에 의존을 하고 있는 모습이다.
재사용을 위해서는 name을 바꿔주어야 하는데.. 아래 코드에서 name이 변경되면 이전 수행작업이 변경된다. 변수와 함수가 꽁꽁묶인 코드이다.
그러나 함수에 파라미터를 넣어서 본인의 파라미터 nameVar에 의존하고 있다.
따라서 함수 call은 부를때 Argument로 할당한 값에 따라서 얼마든지 다양한 방법으로 console.log 를 수행한다. 즉 재사용이 가능하다.
callback을 통해 인수로 함수를 넣어 주게 되면, 수행해야 할 변수와 동작까지 지정이 가능하다.
헐리우드 예제 코드 JS
//헐리우드 적용 전
let name = "apple";
function call(){
console.log(name);
}
call();
//헐리우드 적용 후
let name = "apple";
function call(nameVar){
console.log(nameVar);
}
call(name);
Spring 프레임워크
헐리우드 적용전에는 TextEditor() 메소드가 SpellChecker 인스턴스를 생성했다.
그러나 적용 후에는 프레임워크가 빈등록과정을 통해서 SpellChecker를 생성후 파라미터로 삽입해주었다.(Dependency Injection)
이경우에도, DI로 같은 클래스의 인스턴스라면 얼마든지 교체 할 수 있다. 프로퍼티의 정의를 다른곳에 위임 해준 것이다.
//헐리우드 적용 전
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
///////////////////////////////////////////////////////
//헐리우드 적용 후
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
////빈등록
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Definition for textEditor bean -->
<bean id = "textEditor" class = "com.tutorialspoint.TextEditor">
<constructor-arg ref = "spellChecker"/>
</bean>
<!-- Definition for spellChecker bean -->
<bean id = "spellChecker" class = "com.tutorialspoint.SpellChecker"></bean>
</beans>
정리하며
헐리우드 원칙을 ‘당신이 할 일 중에서 내가 필요할 때 불러주면, 요청한 사항에 맞춰서 행동하겠다.’ 라고 정의했었다.
즉, 내가 언제 어떻게 해야 할 지를 알고, 스스로 제어 할 수 있는 일이면 하되, 그밖에 영역의 일은 정의해서 알려주면 행동하겠다는 것이다.
이를 고수준 컴포넌트(High-Level Component)라고 봐도 될 것 같다.
스스로 할 수 있는 일을 열심히 하고, 못하는 일은 위임하자.
특히 내가 시간을 정할 수 없는 일은 부탁하고 다른일을 하자..
계속 묻는건 서로 피곤하다.
참고자료
- https://dzone.com/articles/the-hollywood-principle
- http://wiki.c2.com/?HollywoodPrinciple
- https://martinfowler.com/bliki/InversionOfControl.html
- http://vandbt.tistory.com/43
- http://thephantomprogrammer.blogspot.kr/2015/08/the-hollywood-principle-dont-call-us.html
- https://www.tutorialspoint.com/spring/spring_dependency_injection.htm
Comments