폼 컬렉션(Form Collection)을 이용한 SQL문의 작성

일반입력 :2000/01/11 00:00

Steven W. Disbrow

ASP 코드에서 사용자가 입력한 정보를 데이터 베이스에 저장하는 일은 여간 힘든 작업이 아니다. 이제 이런 작업에 필요한 모든 SQL 문을 쉽게 작성하는 방법에 대해서 설명하겠다. ASP 페이지를 작성할 때, 가장 자주 하는 작업은 사용자가 HTML 폼에 입력한 데이터를 받아서 데이터베이스에 저장하는 일이다. 불행하게도 이런 작업을 하기 위해서는, 데이터를 먼저 입력 받은 후에, 입력된 데이터를 데이터 베이스에 저장하기 위해 적절한 SQL 문을 일일이 작성해줘야 한다. 만약 다섯 개 이상의 필드를 삽입 하거나 수정하려고 한다면 SQL 문을 작성하기 위한 ASP 코드가 복잡해지기 때문에 끔찍한 혼란을 가져올 것이다. 여기에서는 SQL 문을 작성하기 위한 쉽고 빠른 방법을 제시하겠다.그러나, 제일 먼저 좀 어려운 방법을 살펴보자. 예제로 fname, Iname, 그리고 age의 세가지 필드가 있는 HTML 폼을 생각해보자. 이제 이런 정보들을 데이터베이스에 넣어야 한다고 가정해보자. 리스트 A에 SQL 삽입문을 생성하기 위한 ASP 코드 뿐만 아니라, 사용하고 있는 HTML 폼이 나와있다.이런 ASP코드도 그리 나빠 보이지는 않지만, 필드가 10개, 50개, 심지어 150개 있다면 어떻게 될지 생각해보자. 게다가 데이터 베이스에 저장하려고 하는 각각의 필드 이름과, 데이터 타입을 알아야 한다면 어떻게 될까? SQL 삽입문에서 문자열은 작은 따옴표로 묶여 있어야 하고, 숫자는 그 반대로 되야 하기 때문에 이런 문제가 발생하는 것이다. 이런 작업이 3개의 필드에서는 별로 어렵지 않겠지만, 필드수가 많아질수록 그에 대한 작업은 굉장히 지루해질 것이다. 보다 손쉬운 방법이제 우리에게 필요한 것은 입력할 데이터의 필드 수나 데이터 형식에 관계없이 모든 폼에 적용할 수 있으면서도 간편한 SQL 작성법이다. 이런 방법을 구현하기 위해서 ASP에 내장되는 request.form 컬렉션을 이용할 것이다. 이 컬렉션으로 루프를 반복해 나가면, 각각의 데이터와 함께 폼필드의 이름을 추출해 내는 것이다. 리스트 B에는 이런 과정을 보여주는 간단한 예가 나와있다. 이 코드에서 보는 것처럼, 이런 작업과정에서는 HTML 필드이름이 데이터베이스의 각 필드 이름과 동일해야 한다는 사실에 주목한다. 아마 우선적으로 눈에 띄는 것은, 이런 코드가 첫번째 예제에 비해 약간 길다는 것이다. 그러나 이런 코드는 필드의 수에 상관없이 적용될 수 있다는 사실을 기억해보자. 따라서, 좀 더 큰 규모의 폼에서는 이런 기술을 사용하게 되면 훨씬 효율적으로 작업을 마칠 수 있을 것이다. 그 다음으로 유념할 점은 여전히 필드 한 개의 타입과 이름을 알아야 한다는 것이다. 이제 필요한 것은 ASP 코드가 필드 형태를 알 수 있는 방법이다. 그렇게 해서 적합한 SQL 문을 생성할 수 있다. 여기서 사용할 솔루션은 각각의 HTML 필드에 필드의 타입을 포함시키는 것이다. 예를 들어 보자. 숫자형 필드 이름은 num_으로 시작하게 된다. 따라서 age 필드는 num_age로 이름을 고쳐야 한다.(문자와 텍스트 필드에는 별도의 수식어가 없다. 따라서 기본적으로 따옴표 안에 넣는다) 리스트 C에 이런 방식의 적용 예가 나와있다.리스트 B에서 코드를 추출하여, buildSQLInsert 함수 부분에 삽입했다. 임시 변수값을 설정하고 나면, 앞서 작업한 것과 같이 반복작업에 들어가게 된다. 가장 큰 차이점은 루프를 돌때마다, 필드의 이름에서 밑줄문자(_)을 찾는다는 것이다. 밑줄문자가 검색되면, 필드이름에서 표시를 위해 앞부분에 붙였던 것을 떼어낸다. 이때 때어낸 부분은 필드의 형태를 알려주기 때문에, 데이터 타입에 적용하게 되는 SQL 코드를 생성하기 위한 select 문을 사용하게 된다. (이때, 주의할 점은 떼어낸 부분은 생성될 SQL에서 사용하지 않는다는 것이다.)그 외에 고려해야 할 사항들함수의 윗부분을 보면, 데이터에 포함되어 있는 모든 작은 따옴표를 두개의 작은 따옴표로 변경하기 위해 교체함수를 사용한다는 점을 알 수 있다. SQL 해석기가 텍스트 문자열에 포함된 작은 따옴표 하나를 허용하지 않기 때문이다. 작은 따옴표를 두개로 바꿔주게 되면, SQL 해석기가 작은 따옴표 한 개를 정확하게 텍스트에 포함시킬 것이다.이 점에 관해서 두 가지만 더 설명하겠다. null 값과 최종 SQL문에서 빠진 필드에 관한 것이다. 리스트 D에 이런 두가지 문제를 처리하는 코드가 포함되어 있다.널값은 다루기가 매우 쉽다. 입력 받은 필드에 아무런 값이 들어 있지 않다면, 간단히 최종 SQL문에 NULL을 넣으면 된다. 간단하긴 하지만, 이런 로직은 작업에 들어가기 전에 폼 데이터를 이미 확인했다는 전제를 깔고 있다는 점에 꼭 주의해야 한다. 예를 들어, 데이터베이스의 fname 필드에서 null 값을 허용하지 않는다면, ASP코드에 데이터가 넘어가기 전에 사용자가 해당필드에 값을 입력했는지 반드시 확인해야 한다. (클라이언트 측 자바스크립트를 이용하면 훌륭하게 이런 기능을 추가할 수 있다)또다른 문제는 간혹 SQL문에 필드를 포함시키고 싶지 않은 경우가 있다는 점이다. 리스트 D에서는 omitFields 매개변수를 함수에 추가하는 방식으로 이 문제를 처리한다. 이런 매개변수를 넘기는 모든 필드이름은 최종 SQL 문에서 빠지게 될 것이다. 만약 하나 이상의 필드를 생략하려고 한다면, 간단하게 쉼표(,)로 구분해주면 된다. 또 생략하는 것을 원하지 않는다면 빈 문자열 (“”)을 넘기면 된다. 이때 지정하는 필드의 이름은 데이터베이스에 보이는 필드 이름이 아니라, HTML 파일의 필드이름과 동일해야 한다는 점에 유의해야 한다. (예를들어, num_age는 맞지만, age는 틀린다)체크 박스마지막으로 고려해야 하는 점은 HTML 체크 박스를 다루는 방법이다. 만약 HTML 폼의 체크박스가 체크되어 있지 않다면, request.form 컬렉션에서는 아예 그 값이 나타나지도 않을것이다. 만약 데이터베이스에서 참 또는 거짓 값을 설정하기 위해 체크박스를 사용하는 것이라면, 이런 경우에 문제가 될 수도 있다.가장 좋은 해결 방법은 데이터베이스의 필드에 기본값을 설정해두고, 그 반대값을 지정하기 위한 체크박스를 사용하는 것이다. 만약 이런 방법이 제대로 작동하지 않는다면, 현재 진행 중인 프로젝트에 특수한 체크박스를 하나라도 처리하려면 buildSQLInsert 함수를 수정해야 한다. 이를 시험해보기 위해, 리스트 D의 폼에 간단한 체크박스를 추가하였다. 결론만약, 20개 이상의 필드를 포함하는 폼에 맞춰 SQL 문을 코딩해 본적이 있다면, 지금까지 소개한 방법들이 얼마나 많은 시간을 절약해주는지 실감할 것이다. 미쳐 설명하지 못한 부분이 있다면 SQL 업데이트 문을 작성하는 것과 유사한 함수이다. 그러나 buildSQLInsert 함수를 사용해서 buildSQLUpdate문으로 변경하는 것은 간단한 문제이다. 사실, 약간의 상상력과 주의력만 있다면, 일반적인 검색엔진으로 SQL 선택문을 작성하는데도 이 방법을 쓸 수 있다. 대부분의 유용한 강좌에서도 그랬듯이, 이런 함수를 실제 작성하는 것은 독자의 몫으로 남겨두며 글을 맺는다. @원문 작성일자 : 1999/11/05