본문 바로가기

Microsoft Azure ChatBot

Microsoft Azure를 활용한 챗봇 만들기 - Azure SQL 데이터베이스 구축

제가 얼마 전 Microsoft와 함께하는 Azure Chatbot 경진대회를 7월4일부터 7월25일까지 진행했었습니다.

애져 챗봇 만들면서 구글링도 많이하고 검색을 엄청 했었는데 정보가 많지 않아 헤맸었기에 이후로 애져 챗봇 만들기를 시도하시는 분들께 조금이나마 도움이 되고자 글을 씁니다.챗봇경진대회 참고 ->

blog.naver.com/formktmkt/221994807603

 

 

기본적으로 이미 애져 계정에 가입이 되어있다고 가정을 하고 시작하겠습니다.

애져 포탈에 들어가셔서 리소스 만들기를 선택합니다.

 

왼쪽 카테고리에서 데이터베이스를 선택하시면 SQL Database가 뜰 것입니다. 이걸 클릭합니다.

SQL Database는 MSSQL을 사용하는 DB입니다.

 

처음에 리소스 그룹을 선택해주어야하는데, 저는 새로 만들었습니다.

 

 

그 다음으로 DB 이름을 설정해주고, 서버를 선택해야합니다.

서버가 만들어진 것이 없다면 새로 만들기로 오른쪽에 서버 이름, 관리자 아이디, 암호, 위치를 작성해줍니다.

서버 아이디와 암호는 나중에 DB연결할 때 쓰이므로 꼭 기억을 잘 해두세요.

 

SQL elastic Pool은 제가 알기로는 DB를 얼만큼 사용하느냐에 따라 스토리지를 할당하고 과금하는 요소인 것으로 알고 있습니다. 제가 만드는 챗봇은 경진대회용 조그마한 챗봇이었기에 사용하지 않고 넘어갑니다.

아래의 컴퓨팅 스토리지 설정도 별다른 변경 없이 넘어갑니다.

 

그 다음에는 네트워킹 설정을 위와 같이 해줍니다.

Azure 서비스 및 리소스가 이 서버에 액세스할 수 있도록 허용해야 다른 리소스들의 접근이 가능해지므로 반드시 예로 선택해주세요. 내 PC에서 DB로 접근하려면 내 클라이언트 IP 주소도 꼭 추가해주어야 합니다.

 

다음으로 중요한 설정입니다. 반드시 데이터 정렬에서 

Korean_Wansung_CI_AI

이 형식으로 바꿔주어야 합니다.  안바꿀 경우 한글 깨짐 현상이 나타납니다.

 

 

배포가 완료되면 다음과 같이 리소스들이 나타납니다.

 

내 리소스 그룹으로 들어가면 서버와 DB가 만들어진 것을 확인할 수 있습니다.

그 다음으로는 server리소스에 들어가서 방화벽 및 가상 네트워크 메뉴를 클릭합니다.

 

 

아까 DB를 만들 때 내 클라이언트 주소를 추가하게 했기때문에 내 주소가 추가되어 있을 것 입니다.

그런데, 애져 챗봇을 게시해서 실행할 때는 .NET으로 작성한 코드로 애져리소스 내에서 DB에 접근할 것이므로 애져 리소스의 IP주소에서 접근할 수 있도록 해주어야 합니다.

 

 

내 IP주소만 추가한다면 내 컴퓨터에서 DB접근 코드를 써서 내 IP로 바로 DB에 접근할 수 있지만, Azure 코어봇같은 봇 샘플과 애져 계정을 연결해서 챗봇을 만든다면 반드시 애져 리소스의 주소를 추가해줘야 합니다.

 

 

아래의 주소로 접속하면 아래 그림과 같이 게이트 웨이 주소가 나타납니다.

https://docs.microsoft.com/ko-kr/azure/azure-sql/database/connectivity-architecture

 

Azure SQL Database 연결 아키텍처 - Azure SQL Database and Azure Synapse Analytics

이 문서에서는 azure 내부 또는 Azure 외부에서의 데이터베이스 연결에 대 한 Azure SQL Database 연결 아키텍처에 대해 설명 합니다.

docs.microsoft.com

 

 

 

 

 

여기에서 만들어둔 챗봇 애져 리소스의 위치를 확인하여 그 위치의 IP주소를 추가해줍니다.

저는 미국 서부로 통일을 했기때문에 미국 서부를 추가했습니다.

추가를 했는데도 잘 접속이 안되는 경우가 있었기에 저는 미국서부2의 IP주소까지 전부 그냥 다 때려박아 넣었습니다...ㅎㅎ

 

 

이제 내 봇의 프로젝트 솔루션으로 돌아와서 실행하고자 하는 소스코드에 DB 연결 코드를 추가할 것입니다.

그전에 sql 패키지를 다운받아야 합니다.

VS 메뉴에서 프로젝트>NuGet 패키지관리 를 클릭하시면 아래와 같이 창이 뜹니다. 

여기서 sql을 검색하시면 System.Data.SqlClient가 뜰 겁니다. 이걸 설치해주시면 됩니다.

 

using System;
using System.Data.SqlClient;
using System.Text;

 

위에 이 코드를 추가해주시고

DB에 접근하고자 하는 함수에 아래의 코드를 넣어줍니다.

try
{
    sqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

	builder.DataSource = "yourServerName.database.windows.net";
	builder.UserID = "yourID";
	builder.Password = "yourPW";
	builder.InitialCatalog = "yourDBname";
	stepContext.Values["phone"] = "010-1234-5678";	//내가 사용하던 변수
    
	using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
	{
		connection.Open();
		string sql_query = $"SELECT * from reservInfo WHERE Phone = '{stepContext.Values["phone"]}'AND reserv_date>current_timestamp;";
        //쿼리문에서 코드 내 변수를 사용하고 싶다면 쿼리문에서 '{변수이름}' 이렇게 중괄호 옆에 따옴표를 붙여주어야합니다.
        
        
        using (var command = new SqlCommand(sql_query, connection))
        {
	        using (SqlDataReader reader = command.ExecuteReader())
        	{
        		while (reader.Read())	//레코드마다 읽어옴
        		{
        		// 애트리뷰트 순서로 (index) 구분해서 bookingDetail 인스턴스에 저장
                // string type은 GetString(해당 애트리뷰트의 열)
                // int type은 GetInt(해당 애트리뷰트의 열)
        			BookingDetails bookingQuery = new BookingDetails();	//미리 만들어둔 예약정보 클래스
        			bookingQuery.ID = reader.GetInt32(0);
        			bookingQuery.Name = reader.GetString(1);
        			bookingQuery.Sex = reader.GetString(2);
        			bookingQuery.Age = reader.GetInt32(3);
        			bookingQuery.Phone = reader.GetString(4);
        			DateTime myDate = reader.GetDateTime(5);
        			string convertedDate = myDate.ToString("yyyy-MM-ddhh:mm");
        			string dateStr = convertedDate.Substring(0, 10);
        			string timeStr = convertedDate.Substring(10);
        			bookingQuery.Date = dateStr;
        			bookingQuery.Time = timeStr;
        			bookingQuery.Center = reader.GetString(6);
					
                    return bookingQuery;
				}
			}
		}
	}
}
catch (SqlException e)
{
	Console.WriteLine(e.ToString());
}

여기서 yourServerName은 내 서버 리소스에서 확인할 수 있습니다.

아이디와 패스워드는 아까 서버를 만들때 입력했던 것으로 채워주시면 됩니다.

 

만약 SQL로 읽어와야하는 값이 없다면 위 코드 중에서 ExecuteReader부분을 ExecuteNonQuery로 바꿔주시면 됩니다.

아래는 id값을 찾아 레코드를 삭제하는 코드 예시입니다. 

string sql = $"DELETE FROM reservInfo WHERE reserv_id = '{ID}';";
using (var command = new SqlCommand(sql, connection))
{
	int rowsAffected = command.ExecuteNonQuery();
	Console.WriteLine(rowsAffected + " = rows affected.");
}

 

이제 실행하시면 됩니다.

제대로 실행됐는지 확인하시려면 내 SQL Database 리소스로 이동해서

 

쿼리편집기에서 로그인 후 보실 수 있습니다. 만약 로그인에서 에러가 난다면 SQL server에서 내 클라이언트 IP 주소를 추가 안한것이기 때문에 서버 리소스>방화벽 및 가상 네트워크 메뉴로 가셔서 내 클라이언트 IP주소 추가를 해주시면 됩니다.

 

여기에서 내가 만든 테이블이 제대로 포함되는지, 쿼리문을 잘 실행하는지 시도해볼 수 있습니다.

 

끝입니다.