관리 메뉴

새로운 시작, GuyV's lIfe sTyle.

닷넷 게시판 만들기 Part 23 - 닷넷과 DB는 아무 관련 없다! 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 23 - 닷넷과 DB는 아무 관련 없다!

가이브 2011. 2. 28. 15:01

2011/02/16 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 20
2011/02/18 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 21
2011/02/18 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 22

1. 닷넷 개발환경 준비, 테스트
2. 닷넷 알아보기 [7/7]
3. asp.net 컨트롤 [10/10]
4. 데이터베이스(DB) [4/..]
지난 주는 바쁜 관계로 강좌가 늦어졌습니다. (__)


이전 시간까지 DBMS(SQL Server)설치와 실행, DB생성을 해보고 실제 DB의 자료를 조작해보았다.

개발자가 DB를 알아야 하는 이유는 DB와 연동을 해야 하기 때문이다. 어떤 프로젝트를 진행할 때 큰 조직에서는 개발자가 DB털끝 하나 건들지 않을 경우가 있지만 기타 중소형 프로젝트에는 모두 개발자의 몫인 경우가 많다. 알아서 해가 될 것 없으니 관심가지도록 하자.

요즘에 개발되는 것들은 대부분 네트워크 기능이 있는 프로그램이다. 중앙 집중으로 데이터를 모아놓고 전국, 전세계의 사용자들이 조회하거나 조작할 수 있게 만드는 형식이다. 일반적으로 웹에서 사용되는 게시판, 쇼핑몰 등등의 대부분 자료도 DB에 저장을 하는 것이 일반적이다. 그렇게 DB에 저장된 자료를 다른 프로그램에서 잘 사용할 수 있게 XML이나 JSON등의 자료 형태로 제공해 주는 형식이다. 요즘 '소셜소셜'하는데 별거 없다. DB자료를 다른 플랫폼 등에서 사용가능하게 다시 뿌려주는 것일 뿐.

이전 시간에 했던 DB에 명령을 내리기 위한 쿼리(query)문인 SELECT, INSERT, UPDATE, DELETE 이렇게 기본적인 DB명령을 메모해두도록 하자. 사용하는 형식 중점으로 숙지하자.
또한 테이블은 누가 만든다고 했던가? 학생관리 프로그램의 DB는 학생관리 프로그램의 기획을 한 사람이 만들 수 있다. 왜? 그 사람이 어떻게 만들지 다 머릿속이나 문서로 이미 만들어놨기 때문이다. 그 자료를 저장하는 DB설계는 자동으로 나오게 되어있다. 또한 프로그램 역시 개발자가 기획한 의도를 파악해서 구조적으로 만들어버리면 될 것이다.

또 하나 중요한 것. DB에 명령을 내리게 되는 쿼리문은 무엇이 기준이라고 했었나? DB이다.
A라는 DB가 있고 테이블 abc, qer 두 개가 있을 때, A라는 DB에 쿼리문을 실행하게 된다. 쿼리문을 직접 해보았듯이 쿼리문 안에 테이블명을 지정하게 된다.


이번 장에서는 다시 asp.net 으로 돌아와보자.
asp.net 은 닷넷(.net framework) 중 웹 어플리케이션을 만들기 위한 녀석이다. 닷넷에서 DB연동은 ADO.NET 이라 불리기도 하는 System.Data 네임스페이스에 속해있는 클래스들을 이용한다. 그러니까, 닷넷 플랫폼을 이용하는 DB연동 방법은 모두 동일하다. 여러분들이 이런 개념을 명확하게 알고 있다면, 더블클릭해서 실행하는 닷넷 윈도우 어플리케이션의 DB연동을 모를 수가 없다. (실제 현업에 경력자가 안해봤다는 이유로 이런 어이없는 답변을 할 때도 있다)

필자는 asp.net 과 DB는 아~무 관련없다고 누차 말하고 있다. 명심하자.
DB연동(연관성 있게 동작)하는 것과, asp.net과는 아무 관련없다.

이전 시간까지 해봐서 아시겠지만 DB는 DB자체로 돌아가고 있다.
id는 sa, 비밀번호는 1234. 시스템 계정을 만들었다. 이 계정으로, DB관리툴을 이용하여 접속하고 다른 계정도 만들 수 있다. 이 강의에서는 이런 단계는 모두 생략하였다. 개발자가 DB와 연동하기 위해 알아야 될 것은,

1. 어떤 DBMS인가? - SQL Server, MySQL, Oracle,..
2. DB 서버가 어디에 있는가? (접속을 어떻게 구성하였나?) - 도메인 서비스 방식연결, IP연결, ..
3. 접속하는 DB명은 무엇인가? aspnet
4. 해당 DB의 권한 ID/PW는 무엇인가? sa, 1234

길게 풀어봤지만 개념을 생각해보자. 닷넷은 대부분 SQL Server를 이용한다. 간혹 다른 DBMS를 이용하기도 한다. 그러나 개발자들은 한 가지 방법만 잘 알면 다른 것 비슷비슷하니 별 신경쓰지 않아도 된다. 또한 앞서 알아본 쿼리문 역시 동일하다. 약간 다른 점이 있지만 우리 초보는 쉽게 가도록 하자. DBMS도 표준 기술이고, 웹도 표준 기술이다. 

DB연동을 하기 위해 ADO.NET 을 이용한다고 했다. ADO.NET 을 이용한다고 함은 단순히 System.Data.XXX 를 사용한다 생각하자. 앞으로 DB연동시에는 기본적으로 System.Data 를 참조하도록 하자. 또한 SQL Server에 연동에 해당되는 클래스를 이용하기 위해 System.Data.SqlClient 네임스페이스도 참조하도록 한다.


db1.aspx

<%@ Page Language="C#" runat="server" %>
<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Data.SqlClient" %>

<script language="C#" runat="server">

 void Page_Load()
 {
 }

</script>


aspx 파일에서 namespace 참조는 위와 같이 선언한다는 것은 알고 있을 것이다.
앞으로 이 파일을 기본으로 하여 DB연동을 하기로 하자. <html>..</html>따위의 디자인 요소는 헷갈리지 않기 위해 과감히 제외하겠다.



위의 그림처럼 일단은 DB서버에 연결을 해야할 것이다.
그리고 쿼리문을 이용해 DB에 명령을 내려서 자료를 넣거나 지우거나 수정하거나 가져올 수 있을 것이다. 그리고 끊어준다. 이 세 가지가 핵심이다.

1. 연결
2. 명령
3. 종료

여기서 1,3 번은 놔두고 2번을 생각해보자.
쿼리문은 총 4가지의 종류가 있었다. 다음 정리한 내용을 보자.

2. 명령

1. SELECT .. FROM [테이블명] ..
   ▶ 결과가 1개인 것, 결과가 2개 이상인 것.
2. INSERT(입력), UPDATE(수정), DELETE(삭제)
   ▶ 결과가 없음.

크게 결과가 있는 SELECT와 그 이외 결과가 없는 쿼리문으로 나누어진다. SELECT 문을 쓰는 이유는 조회하기 위함이니 당연한 말이다. 2번 처럼 넣거나 수정, 삭제하는 쿼리들은 결과가 없지만 해당 쿼리에 의해 적용된 레코드수(n개 삭제, n개 수정 등)를 알 수 있게 된다.

ADO.NET 에서는 이런 DB연동시에 입출력되는 자료의 종류에 따라 몇 가지의 메서드를 제공한다. 결과가 1개밖에 없다고 예상되면 단일 값을 리턴하는 메서드를 이용하고, 결과가 여러개인 것은 덩치가 좀 더 큰 결과를 리턴하는 메서드를 이용해야 한다. 닷넷에서 DB의 특성을 고려해서 이렇게 만들었다고 생각하면 되겠다.

현재 실습을 위해 이전에 설치한 DB를 그대로 이용한다. DB서버 주소는 127.0.0.1 로 사용하면 된다. DB이름은 필자가 만들었던 aspnet 으로(혹은 여러분들이 만든 DB이름으로), 접속하기 위한 계정의 id/pw는 sa/**** 정도가 되겠다. 당연하지만 DB에 접속하기 위한 정보는 알고 있어야된다.

이제 프로그래밍 코드로 DB에 접속해보자.
사용할 DB는 예전의 자료 그대로 이용한다. member_table 이라는 테이블을 만들었을 것이다.
그전에 앞의 그림을 다시보자.



직관적으로, 연결하는 클래스 이름은 SqlConnection 이다. SQL Server용은 Sql이 앞에 붙는다고 생각하자. 실제로 다른 DB는 OleDbConnection 이라고 사용하며 앞서 말했지만 사용법은 다 똑같다.

또한 명령을 위한 클래스도 그림처럼 앞에 Sql을 붙여서 SqlCommand 이다. SqlCommand 로 명령을 내린 결과물이 있을 경우는 그 종류가 앞에서 두 가지 종류가 있다고 했다. 그 중 결과가 하나인 녀석을 제외하고, 여러개가 넘어오는 경우는 그림의 좌측, Dataset 이라는 녀석으로 리턴되는데, 이것은 Data adapter 에 의해 만들어진다. 각각의 클래스 이름은 DataSet, SqlDataAdapter 이다.

1,3 번에 해당하는 연결과 연결끊기를 수행해보자.


db1.aspx

<%@ Page Language="C#" runat="server" %>
<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Data.SqlClient" %>

<script language="C#" runat="server">

 void Page_Load()
 {
  string str_conn = "server=notebook-PC\\STUDY;user id=sa;password=1121;database=aspnet";
  SqlConnection conn = new SqlConnection(str_conn);

  Response.Write ("before: " + conn.State + "<hr>");
  conn.Open();

  Response.Write ("Open(): " + conn.State + "<hr>");  
  conn.Close();

  Response.Write ("close(): " + conn.State + "<hr>");
 }


</script>


SqlConnection conn = new SqlConnection(string 연결문자열);

위 소스에서는 DB서버에 연결하기 위한 클래스인 SqlConnection을 str_conn 이름의 스트링 변수로 지정하였다. 연결문자열의 상수가 지정된 str_conn 변수를 자세히 보자.

server=notebook-PC\\STUDY;
user id=sa;
password=1121;
database=aspnet;

server, user id, password, database 이렇게 네 가지로 지정하여 연결문자열을 구성할 수 있다. 연결 방식이라든가 다른 옵션을 넣어줄 수도 있으나 일단 이렇게만 알고 있자. 필요시에 MSDN을 뒤져 알아낼 때가 있을 것이다.

server 는 일반적으로 IP 또는 도메인이름을 지정하면 되는데, Sql Server 2005 이상 버전에서는 기본 값으로 IP통신인 TCP/IP설정이 꺼져있다. 그래서 이전시간에 접속해봤던 DB관리툴을 실행하면 나오는 이름을 그대로 사용하도록 하자. (IP접속을 가능하게 하는 방법의 설정법은 따로 설명하지 않겠다.)


서버 이름에 나온대로 server=서버명 을 구성하여 자신의 환경에 맞게 연결 문자열을 만들어주면 된다. 이것은 어디 환경이든 마찬가지이다.

SqlConnection conn = new SqlConnection(str_conn);

다시 소스를 보자. 이제 conn 이라는 이름으로 인스턴스화를 하여 DB 연결 관련된 작업을 하게 되는데, 여기까지는 아무리 연결문자열이 잘못 작성되어 있어도 오류는 발생하지 않는다. DB 연동에 꽤 중요한 내용인데, asp.net 에서는 여러분이 연동하려는 DB에 대해 전.혀.알.고.있.지.않.다. 당연한 말이겠지만 str_conn 은 string 형 자료일 뿐, SqlConnection 클래스에서 연결문자열이 알맞는지 모른다는 말이다. 앞으로 수행해볼 쿼리문에 대해서도 말이다. 닷넷에게는 그저 string 형인 자료이고, string형만 잘 넣어주면 오류가 발생하지 않는다.

DB연동시 오류가 발생한다라고 하면, 닷넷 문법에만 잘 맞추어준다면 오류가 발생하지 않으며 오류가 발생한다면 DB서버에서 뿌려주는 오류이다.

어떤 것이든 프로그래밍을 하면서 DB 연동을 할 때는 이 의미를 잊지마시기 바란다.


계속해서..

string str_conn = "server=notebook-PC\\STUDY; user id=sa; password=1121; database=aspnet";
SqlConnection conn = new SqlConnection(str_conn);

Response.Write ("before: " + conn.State + "<hr>");
conn.Open();
Response.Write ("Open(): " + conn.State + "<hr>");
conn.Close();
Response.Write ("close(): " + conn.State + "<hr>");

소스에서 진한 내용을 보자. 한번 DB와 연결을 하고(Open), 다시 닫으면서(Close) 코드 중간중간에 SqlConnection.State 라는 ConnectionState 열거형을 출력해보았다. 
(http://msdn.microsoft.com/ko-kr/library/system.data.connectionstate(v=VS.80).aspx)

인스턴스화가 되었으므로 처음에는 닫힌 상태이다. 그리고 conn.Open() 을 수행한 후 출력을 해보았다. 다음에 강제로 DB연결을 닫고 또 한번 출력한다. 세 줄의 결과가 나올 것이다.


만약 결과로 오류가 발생한다면, 오류메시지를 잘 읽어보자. DB를 찾을 수 없다거나, ●●사용자가 로그인하지 못했다는 등 C# 코드에 대한 오류가 아니라면 연결 문자열이 잘못된 것이다.

DB연동의 첫 걸음을 시작하였다.
만약 Close()로 명시적으로 끊어주지 않으면 웹페이지가 출력이 완료되어 웹 서버와 끊어졌더라도 웹서버와 DB서버의 연결이 일정 시간동안 유지될 것이다. 그 시간동안 불필요한 DB서버 자원(메모리)을 낭비하게 된다. 그러므로 열어주었으면 꼭 끊어주도록 하자.

SqlConnection 클래스(http://msdn.microsoft.com/ko-kr/library/system.data.sqlclient.sqlconnection(v=VS.80).aspx)에 대해서 MSDN에서 멤버를 살펴보고, 따로 수행해보자. 관심과 노력은 결코 배신하지 않는다.



열고 닫는건 간단하게 수행할 수 있다.
다음시간에는 쿼리문을 DB서버로 날려보자.


계속..


반응형
Comments