저자: 한동훈(traxacun)
[지난기사보기] ASP.NET 가이드 6. 자동 포커스 이동 & 페이지 만료하기 ASP.NET 가이드 5. NDoc을 통한 코드 문서화 ASP.NET 가이드 4. 통합 예외처리 ASP.NET 가이드 3. UI 향상 및 사용자 템플릿 만들기 ASP.NET 가이드 2. 숫자/문자 입력 텍스트 박스 만들기 ASP.NET 가이드 1. 자바 스크립트 사용하기
ASP.NET 뿐만 아니라 다양한 웹 프로그래밍 환경에서 가장 반복적인 부분은 화면상의 컨트롤에 값을 설정하고, 값을 가져오는 일이다. 이와 같은 작업을 보다 편리하게 할 수 있는 방법은 없을까? 웹 페이지상의 각 요소에 값을 자유자재로 넣으려면 전체 HTML 문서 구조를 해석해서 어느 요소에 어떤 값을 넣을지를 결정해주는 작업을 해야한다. 이렇게 복잡하게 할 바엔 직접 코딩할래!라는 개발자가 대부분이다.
또한, DB에 값을 가져오거나 저장하는 일을 단순하게 할 수 있는 방법은 없을까? 라는 물음이다. 물론, Data Access Layer를 담당하는 클래스를 작성해서 DB작업을 단순하게 해주지만 쿼리 작성, 값의 유효성과 같은 것들을 자동화해주지는 못한다.
MS가 Data Access Bulilding Block을 제공한다해도 여전히 반복적인 작업을 해야한다. 이에 대한 대안은 과연 없을까?
컨트롤 처리
ASP.NET에서는 웹 페이지의 각 요소를 컨트롤로 다루기 때문에 각 요소에 접근해서 값을 설정하거나 변경하는 작업을 비교적 쉽게 할 수 있다. 게다가, 앞에서 다룬 것처럼 ASP.NET의 전체 컨트롤 트리를 해석하는 코드를 손쉽게 작성할 수 있기 때문에 페이지 내의 모든 컨트롤 값을 알아내는 작업도 쉽게 할 수 있다.
페이지에 있는 모든 컨트롤의 값을 출력하기 위해 BasePage 클래스에 GetFormVariables() 함수를 추가하였다. 이 함수는 모든 컨트롤값을 해시로 저장한다. 값을 이용하기 위해서는 hash["ControlName"]의 형식으로 이용할 수 있고, 전체 컨트롤 값을 얻기 위해서는 다음과 같이 Iterator 패턴을 사용하면 된다.(닷넷에서는 Enumerator라는 용어를 사용하고 있지만 C++/Java 등에서는 이와 같은 형태에 대해 Iterator라는 용어를 사용하고 있다)
화면에 출력되는 값들을 보면 컨트롤 내의 모든 요소들의 값을 잘 가져오는 것을 알 수 있다. GetFormVariables() 함수는 Hashtable 형태로 값을 가져오는 버전과 필드 구분자를 이용해서 값을 가져오는 형태로 나뉘어져있다. GetFormVariables()에서 값을 가져오지 않는 몇가지가 있다. 그 중에는 DataGrid, DropDownList, RadioButtonList, CheckBoxList 컨트롤들이 있다. 이들은 그 안에 포함된 데이터를 다루기 위한 방법들이 별도로 필요하기 때문에 생략하였다.
다음으로 컨트롤에 값을 설정하는 경우를 살펴보자. 요즘 업무용 웹 응용프로그램의 경향을 보면 다양한 탭을 사용하고, 각 탭마다 적게는 30개에서 많게는 300개 이상의 컨트롤을 올려놓고 작업하고 있다. 이런 상황에서 ControlName.Text = "Value";와 같은 형태의 코드를 각 컨트롤마다 사용한다는 것은 심각한 시간낭비라 할 수 있다.
첫번째 SetFormVaribles() 함수는 컨트롤 이름 목록과 컨트롤 값 목록을 각각 배열로 받아서 순서대로 값을 찾아서 컨트롤의 값을 매핑해주는 예이며, 두번째 SetFormVariables() 함수는 Hashtable에 설정된 값을 컨트롤에 매핑해주는 형태이다. 예제에서 볼 수 있는 것처럼 다양한 컨트롤에 값을 매핑할 수 있다. DataGrid와 List 컨트롤의 값 설정과 매핑은 별도의 주제로 다룰 것이기 때문에 그 주제는 다음 기회로 미룰 것이다. ^^;
일단, 값을 설정하는 컨트롤의 형태에서 간파할 수 있는 것이 몇가지 있을 것이다. 조회성 화면을 작성하는 경우에 DB로부터의 결과를 Hashtable의 형태로 가져온다면 그 값을 바로 페이지상의 컨트롤에 매핑할 수 있을 것이다. DB Field 명을 컨트롤 명으로 사용하는 방법도 생각할 수 있고, 중간에 XML 파일 형식을 만들어서 DB Field와 컨트롤 이름 사이의 매핑을 작성할 수 있을 것이다. 아마, 필자라면 |