데메테르 의 법칙 Law of Demeter – Aliencube Community 
 Home > Visual Studio and Development Technologies > . NET > 데메테르 의 법칙 Law of Demeter 
 Published Dec 6 , 2013 by Justin Yoo 
 데메테르 의 법칙 Law of Demeter 
 데메테르 는 그리스 신화 에 나오 는 추수 의 신 이 다 . 로마 신화 에서 는 세레스 Ceres 라고 불리 는 바로 그 신 . 하지만 , 그 데메테르 하 고 이 법칙 하고 는 상관없 다는 것 이 함정 . [ 위키피디아 ] 1 에서 는 데메테르 의 법칙 을 아래 와 같이 정의 하 고 있 다 . 
 데메테르 의 법칙 에서 는 어떤 객체 O 의 메소드 m 는 다음 과 같 은 종류 의 객체 에 있 는 메소드 들 만 실행 시킬 수 있 다 . 
 O 자체 
 m 의 변수 
 m 안 에서 만들 어 진 객체 
 O 가 직접 관리 하 는 콤 포 넌 트 객체 
 m 의 스코프 안 에서 O 가 접근 가능 한 전역 변수 
 좀 말 이 어려운데 , Richard Carr 의 [ The Law of Demeter ] 2 포스트 에 좀 더 쉬운 설명 이 있 다 . 
 어떤 클라스 의 멤버 – 메소드 또는 속성 – 는 반드시 다음 과 같 은 객체 들 의 멤버 들 만 을 실행 시켜야 한다 : 
 해당 메소드 또는 속성 이 선언 된 객체 
 메소드 의 파라미터 로 보내 진 객체 
 메소드 또는 속성 이 직접 초기 화 시킨 객체 
 호출 을 위한 메소드 또는 속성 으로서 같 은 클라스 안 에서 선언 된 객체 
 아래 예제 코드 를 보 자 . ASP . NET MVC 웹 사이트 를 개발 하 다 보 면 콘트 롤러 에서 흔히 볼 수 있 는 상황 이 다 . 
 위 의 코드 에서 Index 액션 을 보 면 대략 예상 이 가능 하 겠 지만 ProductService 라는 서비스 레이어 안 에서 ProductRepository 라는 데이터 리포 지토리 패턴 을 통해 CRUD 를 구현 하 고 있 다 . Index 액션 은 전체 제품 리스트 를 보여 주 는 뷰 를 갖 고 있 어서 전체 제품 리스트 는 서비스 안 에 구현 된 리포 지토리 의 Get 메소드 를 통해 가져오 게 된다 . 이렇게 메소드 체 이닝 을 하 는 것 이 바로 데메테르 의 법칙 을 위반 하 는 것 이 된다 . ProductController 객체 는 생성자 를 통해 변수 로 받 은 ProductService 객체 의 메소드 또는 속성 을 호출 해야 하 지 그 내부 에 있 는 ProductRepository 객체 의 Get 메소드 를 직접 호출 해서 는 안 된다 . ProductRepository 객체 의 현재 상태 가 null 이 라면 해당 코드 는 NullReferenceException 을 던지 기 때문 이 다 . 따라서 ProductService 클라스 안 에 추가 적 인 메소드 를 선언 해 주 는 방식 으로 리팩토링 을 해야 한다 . 
 public IList < Product > GetProducts ( ) 
 즉 ProductRepository 객체 를 public 속성 이나 필드 로 두 는 것 이 아니 라 내부 적 으로 encapsulation 시키 고 ProductRepository 클라스 의 멤버 는 ProductService 클라스 의 멤버 를 통해 호출 하 는 방식 으로 하 게 되 면 , ProductController 클라스 는 직접 적 으로 관련 이 있 는 콤 포 넌 트인 ProductSerivce 에 대해서 만 통제 권 을 가질 수 있 어서 보다 안 전하 고 유연 한 코드 를 작성 할 수 있 게 된다 . 
 이런 식 으로 메소드 체 이닝 을 최대한 줄이 는 것 이 바람직 한 객체 지향 프로그래밍 이 라고 할 수 있 겠 다 . 하지만 이렇게 프로그래밍 을 하 게 되 면 추가 적 인 메소드 를 작성 해야 하 는 부담 이 생기 게 되 는데 , 이것 이 꼭 부정 적 이 라고 는 할 수 없 는 것 이 객체 사이 의 의존 성 을 최소 화 하 는 방식 으로 유연 하 게 개발 을 할 수 있 기 때문 이 다 . 
 단 , LINQ 를 쓰 는 상황 이 라면 얘기 가 달라진다 . LINQ 에서 는 특성 상 메소드 체이 닝 이 필수 일 수 밖 에 없 는지라 , 이 데메테르 의 법칙 에서 벗어날 수 있 는데 , 그 이유 는 메소드 체 이닝 을 하 는 것 과 상관없이 항상 리턴 타입 이 동일 하 기 때문 이 다 . 위 의 예제 코드 에 나온 ProductRepository 클라스 의 Get 메소드 는 아마도 내부 적 으로 아래 와 같이 구현 이 되 어 있 을 것 이 다 . 
 public ProductRepository ( ICompanyDataContext context ) 
 public IList < Product > Get ( ) 
 return this . _ context 
 여기 서 Products , Where 그리고 OrderBy 는 모두 동일 한 IEnumerable < Product > 객체 를 반환 한다 . 즉 LINQ 를 이용한 메소드 체이 닝 의 경우 메소드 마다 동일 한 데이터 타입 을 반환 하 기 때문 에 이 데메테르 의 법칙 을 위반 하 지 않 고 안 전하 게 사용 할 수 있 다 . 
 [ Law of Demeter ] [ ^ 1 ] from Wikipedia 
 [ The Law of Demeter ] [ ^ 2 ] by Richard Carr 
 http : / / en . wikipedia . org / wiki / Law _ of _ Demeter ↩ 
 http : / / www . blackwasp . co . uk / LawOfDemeter . aspx ↩ 
 Previous Post 엔 티티 프레임워크 Code First 방법론 # 3 
 Next Post Alienstrap for WordPress 
 Law of Demeter Method Chaining Object Oriented Programming Weird Meetup