Bot Framework라는것 자체가 인공지능이라던지 그런건 아니었습니다. 단지 Web API로 개발한 서비스를 채팅 API와 연결해 주는 역할 정도랄까요 ? 단순히 웹브라우저나 자체적으로 앱을 만들어서 해당 서비스를 제공할 경우에는 큰 의미가 없겠지만, 우리가 개발한 서비스를 Facebook Messanger 나 카카오톡, 라인, Slack, 텔레그램 등... 을 통해서 서비스 가능하게 해주는 역할을 하는 것입니다.
모임시간에는 간단한 에코봇과 샌드위치 주문을 받아주는 봇을 만들어 보았습니다.
Telegram에서 @LunaSampleBot에게 말을 걸면 예제를 직접 실행해 보실 수 있습니다.
전통적인 방식의 경우 SQL을 이용하여 Database에 Table을 생성한 다음 Application에서 개발을 시작합니다. Code First방식이란 Domain Class의 명세를 이용하여 Application 실행 시 해당 Table이 없는 경우 자동으로 생성을 해주는 방식을 말합니다.
Entity Framework 4.1 이후부터 지원해주는 방식이며, Domain Driven Design의 경우 유용합니다.
School은 Standard의 참조를 가지고 있으며, Standard는 School의 집합을 가지고 있습니다.
3. Entity Framework Context 정의
using System.Data.Entity;
DbContext를 사용하기 위해서는 System.Data.Entity를 using해주면 편합니다.
classSchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; }
}
2개의 Domain Model을 DbSet Property로 정의합니다.
특정 Database로의 접근을 원할 경우 DbContext의 생성자로 Connection String를 전달하도록 생성자를 정의해주면 됩니다. Console Application Project에서 default일 경우 Visual Studio와 함께 설치된 LocalDB로 연결 됩니다.
4. Context 실행
classProgram
{
staticvoidMain(string[]args)
{
using (var context = new SchoolContext())
{
Student s = new Student() { StudentName = "New Student" };
context.Students.Add(s);
context.SaveChanges();
}
}
}
Database에 따로 Table을 생성하지 않고 위 Code를 실행하면 자동으로 Table이 생성됩니다.
그림에서 확인되는 것을 보면 Standard에는 Student에 대한 항목이 없으며, Student에는 Standard_StandardID라는 Foreign Key가 추가 된 것이 확인됩니다.
개발 또는 운영 중 새로운 Table이 추가 될 경우에는 Domain Model을 선언하고 Context의 DbSet Property를 선언해주면 됩니다.
ASP.NET에서는 Razor Engine을 이용하여 View를 조금 더 편하게 작성 할 수 있습니다. (.cshtml) Razor Engine이 무엇인지 간단하게 얘기하자면 View (HTML page) 작성시 C# 문법과 .NET Framework를 사용할 수 있습니다. Layout, Partial View를 이용하여 특정 영역만 따로 rendering 하는 것도 가능하며, 각종 Helper method를 제공하여서 반복적인 HTML TAG 작성 작업을 줄여주며, 직접 Helper method를 작성하여서도 활용 할 수 있습니다.
View의 기본적인 사용법은 Controller and Action 절에서 예제 작성시 간단히 언급했으므로 생략하도록 하겠습니다.
Layout (주로 _Layout.cshtml 식의 명칭) 내부에는 section을 제공해 줍니다.
@RenderBody() : 해당 Layout을 사용하는 View의 내용이 이 위치에 삽입됩니다.
@RenderSection("Name") : View 에서 @section Name { ... } 의 내용이 해당 section에 삽입됩니다.
Layout에서 선언한 @RenderSection("...")이 View에서 사용하지 않으면 오류가 발생합니다. 해당 section에 선택적으로 사용을 하려면 (View에서 사용하지 않아도 오류가 발생하지 않게 하려면) @RenderSection("...", false)로 선언을 하면 됩니다.
위의 경우 List.cshtml에서 Partial.cshtml의 Partial view를 사용하였는데, Partial view 내부를 보면 ActionLink를 Controller 이름을 명시하지 않았습니다. Partial View를 Rednering하는 곳이 List.cshtml 내부이기 때문에 해당 Controller를 기준으로 동작합니다.
Partial View도 ViewModel을 가질 수 있습니다. (Strongly Typed Partial View)
그럴 경우 @Html.Partial(...) 의 두번째 인자로 ViewModel을 전달해 줘야 합니다.
Partial2.cshtml
@model IEnumerable<string>
...
List.cshtml
...
@Html.Partial("Partial2", new [] { "Luna" , "Star" } )
3. Child Action
View 에서 호출되는 Action Method를 의미합니다. @Html.Action(...) helper method를 사용하면 모든 Action method를 View에서 호출이 가능하지만, [ChileActionOnly] 이란 attribute를 붙이면 Routing System에서 사용되지 않고 순수히 View에서 호출할 경우에만 동작하는 것을 의미합니다.
HomeController.cs
...
[ChildActionOnly]
public ActionResult Time()
{
return PartialView(DateTime.Now);
}
다른 방법으로는 도구(Tools) -> Nuget package manager -> Package Manager Console 로 가셔서 아래와 같이 입력하시면 됩니다.
PM> Install-Package Newtonsoft.Json
사용시 소스코드에서 아래의 namespace를 추가해 주시면 됩니다.
using Newtonsoft.Json.Linq;
2. 간단한 특징 설명
2개의 Object를 이용해서 사용하시면 됩니다.
JObject : JSON Object 입니다.
JObject 자체가 name값을 가질 수는 없습니다.
(key, value) pair 들을 가질 수 있습니다.
key : string 값입니다.
value : JToken 타입이며 대부분의 premitive type들과 DateTime, TiemSpan, Uri 값을 직접대입 가능하며, 기타 Object도 입력이 가능합니다.
value에 다른 JObject나, JArray를 넣을 수 있습니다.
JArray : JSON Array 입니다.
JObject와 특징이 거의 비슷하나 key 없이 value 들을 가지고 있습니다.
즉, JObject나 Jarray 자체는 name을 가질 수 없으나, 다른 JObject에 value로 소속될 경우에는 key값을 가져야 하며, 다른 JArray에 소속될 경우에는 key값 없이 입력됩니다
3. JObject 사용법
너무나 간단하기 때문에 별도 설명은 필요 없을듯 합니다.
생성 : new JObject()
Element 추가 : .add(key, value)
바로 예제를 보도록 하겠습니다.
3.1 Element 추가
3.1.1 기본적인 사용법
var json = new JObject();
json.Add("id", "Luna");
json.Add("name", "Silver");
json.Add("age", 19);
Console.WriteLine(json.ToString());
{
"id": "Luna",
"name": "Silver",
"age": 19
}
3.1.2 JSON 형식의 문자열로 생성
var json2 = JObject.Parse("{ id : \"Luna\" , name : \"Silver\" , age : 19 }");
json2.Add("blog", "devluna.blogspot.kr");
Console.WriteLine(json2.ToString());
var jFriends = new JArray();
jFriends.Add(json);
jFriends.Add(json2);
jFriends.Add(json3);
jFriends.Add(json4);
Console.WriteLine(jFriends.ToString());