본문 바로가기

Develop/.NET 가이드

[C#] 리플렉션 Reflection (1) : 왜 알아야 할까?

반응형

Reflection
Reflection

리플렉션 Reflection

리플렉션 (Reflection) 은 프로그램이 동적으로 소스 코드를 해석할 수 있게 하는 기술입니다.

ActivityService 같이 특정 이름 규칙으로 클래스를 작성하면 개발자가 코드로 객체를 생성하거나 연결하지 않아도, 프로그램 내에 등록되고 사용할 수 있었던 마법의 원리는 프레임워크가 리플렉션 기술을 사용해 클래스의 이름을 바탕으로 클래스를 생성/관리/제거해주기 때문입니다. 객체를 프레임워크가 관리해주니까, 개발자는 프레임워크에게 요청하면 언제 어디서나 안정적으로 원하는 클래스를 얻을 수 있습니다. 즉 개발자는 클래스로 객체를 생성하는 거나, 객체를 사용할 수 있게 준비하는 일정 부분을 프레임워크에게 믿고 맡길 수 있게 됩니다.

예제 코드를 보여드리자면, 아래와 같이 클래스를 정의합니다.

    public class BaseViewModel : MvxViewModel
    {
        protected readonly IMvxMessenger _messengerService;

        // 프레임워크는 리플렉션 기술로 BaseViewModel 클래스 생성자 정보를 읽고, 
        // 이 클래스를 객체로 만들기 위해서는
        // IMvxMessenger 클래스가 필요하다는걸 프레임워크는 이해하게 됩니다.
        public BaseViewModel(IMvxMessenger messengerService)
        {
            _messengerService = messengerService;
        }
    }

만약 어디서나 BaseViewModel 클래스를 사용하고 싶다면 아래와 같이 프레임워크에게 요청하면, 프레임워크가 BaseViewModel의 생성자를 읽고 알아서 만들어서 개발자에게 전달해줍니다.

// 리플렉션 기술로 이해한 클래스 정보에 따라 객체를 생성합니다.
var viewModel = Mvx.IoCProvider.IoCConstruct<BaseViewModel>();

이처럼 프로그램이 실행되는 동안 클래스의 소스 코드를 읽고 클래스가 생성될 때나 사용될 때 필요한 객체를 내부적으로 결정해주는 의존성 주입 (Dependency Injection) 기술은 리플렉션 기술로 구현되어 있습니다. 이러한 기술이 프레임워크에 적용됨에 따라 개발자는 프레임워크가 관리하는 클래스를 사용할 때 클래스 타입만 전달해주면, 프레임워크가 알아서 객체를 만들어 개발자가 사용할 수 있도록 준비합니다.

이와 같이 프레임워크가 작동하는 내부적인 원리를 이해하기 위해서는 리플렉션 (Reflection) 기술에 대해 이해하고 있어야만 합니다. 프레임워크는 개발자의 편의를 위해 실제 내부 구현이 어떻게 이루어지는지 숨기고 있습니다. 따라서 개발자는 프레임워크로 어떻게 필요한 것을 얻을지, 또 현재 사용하는 프레임워크와 잘 맞는 설계는 무엇일지 결정하려면 프레임워크의 설계 규칙을 이해하고 있어야 합니다.

프레임워크의 설계 원칙을 이해하려면 프레임워크 설계의 기반이 되는 리플랙션 기술에 대해 알아야만 합니다. 단지 검색을 통해 얻은 단편적인 코드만으로는 프레임워크의 설계 원칙을 지레 짐작 할 뿐입니다. 리플랙션 기술을 모르는 상태에서 특정 프레임워크에 의존해 개발을 시작하면 프레임워크가 이해되지 않으니, 의도한 결과를 어떻게 만들 수 있을지를 단편적인 코드에 의존하여 개발하게 됩니다. 프레임워크에 대한 이해없이 단편적인 코드에 의존하니 샘플 코드를 응용할 수 있는 능력이 떨어지게 되고 개발하는 내내 어떻게 해야할지 모르는 난감한 상황에 처하게 됩니다. 할 수 있는건 계속 검색을 해서 많은 샘플 코드 얻거나, 무작정 여러가지를 시도하는 방법 밖에 없습니다.

당연히 저도 이러한 문제점을 겪으면서 개발을 하다보니, 개발하는 내내 이해할 수 없는 것들로 인해 좌절하고 개발에 대한 흥미를 잃기도 했었습니다. 다른 개발자 분들이 동일한 어려움을 겪지 않으면서, 생산적인 업무로 보람을 느끼시길 바라는 마음으로 리플렉션 (Reflection) 기술에 대해 구체적인 사례와 함께 설명드리도록 하겠습니다.

반응형

태그