레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시

2020년 1월 14일 화요일

[C#, Sqlite] C# 에서 Sqlite 쓰는법

C# 에서 sqlite 를 쓸려면 여러가지 방법이 있다.
대표적으로 dll 파일만 참조로 등록하거나, 아예 설치 패키지로 설치하거나, 누겟으로 설치하는 방법이 있다.

이번에는 가장 간편한 방법인 비쥬얼 스튜디오의 누겟 설치.


일단 사용할 프로젝으를 생성.


프로젝트 명은 원하는 대로 설정.


프로젝트를 생성한 후, 누겟 패키지 관리자로 이동한다.


패키지 관리자에서 "sqlite" 로 검색하면 여러가지 패키지가 검색된다. 이 중에서 "system.Data.SQLite" 라는 이름의 패키지를 설치한다. 비슷한 패키지가 제법 많으므로 잘 살펴본뒤 설치 할 것.


저 패키지를 설치하면 관련 패키지들도 일괄 설치된다.


패키지가 설치되면 자동으로 참조에 "System.Data.SQLite" 가 추가된다. 만약 이 참조가 자동으로 설치되지 않으면 패키지를 잘못설치한 것이므로 다시 확인하고 설치해야 한다.


참조에 저 패키지가 등록되어 있어야 프로젝트 내에서 SQLite 패키지를 사용할 수 있다.


sqlite 가 정상적으로 설치되었는지는 "select sqlite_version()" 구문을 실행 해보면 알수 있다.


별 문제가 없다면 create, insert, update 구문은 "ExecuteNonQuery" 명령어를 사용하고 select 구문은 "ExecuteReader" 구문으로 데이터를 조회 할수 있다.


예제를 실행 해보면 콘솔창에 DB 내용이 조회되는것을 볼 수 있다.

private void Form1_Load(object sender, EventArgs e)
{
string connStr = @"Data Source=C:\MyProg\DotNet\sqlite\mysqlite.db";
string stm = "SELECT SQLITE_VERSION()";

var con = new SQLiteConnection(connStr);
con.Open();

var cmd = new SQLiteCommand(con);

cmd.CommandText = @"CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INT)";
cmd.ExecuteNonQuery();

cmd.CommandText = "INSERT INTO cars(name, price) VALUES('내차', 1000000)";
cmd.ExecuteNonQuery();

stm = "SELECT * FROM cars";
cmd = new SQLiteCommand(stm, con);

SQLiteDataReader rdr = cmd.ExecuteReader();

while (rdr.Read())
{
Console.WriteLine($" ## {rdr.GetString(1)} / {rdr.GetInt32(2)}");
}
}


DB 경로를 지정해 놓으면 DB 파일이 없을 경우 자동으로 생성해 주니 궂이 따로 생성할 필요는 없다.


2017년 7월 25일 화요일

C# : Nullable 변수에 값이 들어 있는지 체크는 HasValue 를 쓴다.

C# 에는 숫자 변수 뒤에 물음표(?)를 붙여서 Nullable 변수라는 것을 만들수 있다.

관련링크 : 변수 뒤의 물음표(?) 는 무슨 뜻일까?

이렇게 함으로 해서, 숫자 변수에 "0" 이라는 값이 아닌 아예 "아무것도 없는" 값을 지정할수 있다.

하지만 이 변수에 어떤 값이 지정되어 있는지 아닌지는 어떻게 알수 있을까?
이게 중요한게, 알다시피 "Null" 값이 지정되어 있는 상태에서 뭔가 하려고 하면 (예를 들어 ToString() 같은거...) 오류가 난다.

이때는, 그냥 "변수.HasValue" 로 확인 해 보면 된다.



물론 "if (변수 == null)" 같은걸로도 가능하지만, 좀 있어 보이게 이렇게 쓰는 편이 더 확일하다.

2017년 7월 12일 수요일

C# : 변수 뒤의 물음표(?) 는 무슨 뜻일까?

C# 에서 가끔 변수들 뒤에 물음표(?) 가 달려 있는 경우가 있다.


알고보면 간단한건데, 모를때 모면 이게 무슨 의미인지 알수가 없어 난감한데...
이건 그냥 숫자 변수에 "Null" 이 지정가능하다는 뜻. 즉, "Nullable" 변수라는 뜻이다.


이렇게 원래 Null 값을 가질수 없는 숫자 변수가 물음표(?) 를 붙여 선언하면 Null 값을 지정할 수 있다.


일반적 방식으로 그냥 숫자 변수를 선언하면 숫자 타입의 변수는 "0" 혹은 "임의의값" 을 반드시 가져야 하므로 Null 을 지정하면 오류가 발생한다.


물론 일반적으로 Null 이 아닌 0을 지정하면 되므로 크게 문제가 되지 않는다.
단지 사용상의 문제일뿐.

즉, 파라메타를 넘길때 처럼, 아무런 값이 넘어오지 않을경우 혹은, "0" 일 경우와 아무것도 없는 경우를 구분해서 처리해야 할 경우 등, 필요에 따라 쓰이는 방식이다.

관련링크 : Nullable 변수에 값이 들어 있는지 체크는 HasValue 를 쓴다.

Xamarin.Forms : 간단한 사칙연산 계산기

아주 기본적인 기능만 있는 계산기를 자마린으로 만들어 보자.


일단 프로젝트 하나 생성.


어느걸로 해야 하나 고민되지만, 쉽게 "Xamarin.Forms" 에 "공유 프로젝트" 로 선택.



<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:SonCalc"
             x:Class="SonCalc.MainPage" Title="SonCal">

    <Grid Padding="0" RowSpacing="0" ColumnSpacing="0" BackgroundColor="Black">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Label FontSize="40" x:Name="lblPrintNumber"  BackgroundColor="Black" Text="0" TextColor="White" HorizontalTextAlignment="End" VerticalTextAlignment="Center" Grid.ColumnSpan="4"/>

        <Button Text="AC" Grid.Row="1" Grid.Column="0" BackgroundColor="Silver" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="/" Grid.Row="1" Grid.Column="1" BackgroundColor="Silver" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="*" Grid.Row="1" Grid.Column="2" BackgroundColor="Silver" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="-" Grid.Row="1" Grid.Column="3" BackgroundColor="Orange" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />

        <Button Text="7" Grid.Row="2" Grid.Column="0" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="8" Grid.Row="2" Grid.Column="1" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="9" Grid.Row="2" Grid.Column="2" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="+" Grid.Row="2" Grid.Column="3" Grid.RowSpan="2"  BackgroundColor="Orange" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />

        <Button Text="4" Grid.Row="3" Grid.Column="0" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="5" Grid.Row="3" Grid.Column="1" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="6" Grid.Row="3" Grid.Column="2" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />

        <Button Text="1" Grid.Row="4" Grid.Column="0" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="2" Grid.Row="4" Grid.Column="1" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="3" Grid.Row="4" Grid.Column="2" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="=" Grid.Row="4" Grid.Column="3" Grid.RowSpan="2" BackgroundColor="Orange" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />

        <Button Text="0" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2"  BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
        <Button Text="." Grid.Row="5" Grid.Column="2" BackgroundColor="White" TextColor="Black" FontSize="40" BorderRadius="0" Clicked="btnCal_Clicked" />
    </Grid>
</ContentPage>
  


그냥 화면 하나 짜리 간단 계산기 이므로 계산기 폼만 MainPage.Xaml 에 작성해 준다.


그럼 이렇게 폼이 만들어지는데, 안드로이드에선 이렇게 보이지만...


아이폰에선 이렇게 보인다. 각 디바이스의 버튼 스타일이 달라서 어쩔수가 없음.
암튼 폼은 이렇게 만들면 되고...

코드는...


MainPage.Xaml.cs 에다 이렇게 생성...

using System;
using Xamarin.Forms;

namespace SonCalc
{
    public partial class MainPage : ContentPage
    {
        double? NumBefore;
        double? NumAfter;
        Boolean isClear;
        string strProc;

        public MainPage()
        {
            NumBefore = null;
            NumAfter = null;
            isClear = false;
            strProc = null;

            InitializeComponent();
        }

        private void btnCal_Clicked(object sender, EventArgs e)
        {
            Button getbutton = (sender as Button);
            var lblPrintNumber = this.FindByName<Label>("lblPrintNumber");

            switch (getbutton.Text)
            {
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9":
                case "0":
                    if (lblPrintNumber.Text.Equals("0") || isClear.Equals(true))
                    {
                        if (String.IsNullOrEmpty(strProc))
                        {
                            NumBefore = null;
                        }

                        lblPrintNumber.Text = getbutton.Text;
                        isClear = false;
                    }
                    else
                    {
                        lblPrintNumber.Text += getbutton.Text;
                    }

                    break;

                case ".":    // 소숫점 처리
                    if (!lblPrintNumber.Text.Contains("."))
                    {
                        lblPrintNumber.Text += getbutton.Text;
                        isClear = false;
                    }
                    break;

                case "+":
                case "*":
                case "/":
                case "-":
                    ProcCal();
                    strProc = getbutton.Text;
                    break;

                case "=":
                    ProcCal();
                    strProc = null;
                    isClear = true;
                    break;

                case "AC":
                    NumBefore = null;
                    NumAfter = null;
                    strProc = null;

                    lblPrintNumber.Text = "0";

                    break;
            }

            return;
        }

        /// <summary>
        /// 입력된 값으로 결과값 계산
        /// </summary>
        private void ProcCal()
        {
            if (NumBefore.HasValue)
            {
                NumAfter = Convert.ToDouble(lblPrintNumber.Text);

                if (isClear.Equals(false))
                {
                    switch (strProc)
                    {
                        case "+":
                            NumBefore += NumAfter;
                            break;
                        case "-":
                            NumBefore -= NumAfter;
                            break;
                        case "/":
                            NumBefore /= NumAfter;
                            break;
                        case "*":
                            NumBefore *= NumAfter;
                            break;
                    }

                    NumAfter = null;

                    lblPrintNumber.Text = NumBefore.ToString();
                }
            }
            else
            {
                NumBefore = Convert.ToDouble(lblPrintNumber.Text);
            }

            isClear = true;
        }
    }
}



이렇게 다 만들어 놓고 실행해 보면...



이렇게 간단하게 계산기가 완성된다.
아마 버그도 좀 있을 테고, 에러처리 루틴 같은게 빠져 있지만, 간단한 사칙연산은 별 무리 없이 처리한다.

2017년 6월 14일 수요일

C#, MVC : EntityFramework(DBContext) 로 테이블 생성시 Unique 컬럼 지정

일반적으로 유일키 값은 PK 로 지정하여 사용하고 EntityFramework 에선 Key 속성을 지정하여 설정한다.

하지만, PK 가 아닌 필드로 유일한 값을 가져야 할 필요가 있을수 있는데, DB 에선 Unique 를 설정하여 만들지만, EntityFramework 어떻게 할 까?


그냥 필드를 생성할때 "IsUnique" 를 "True" 로 설정하면 된다.


그럼 이렇게 자동으로 인덱스까지 생성해서 Unique 설정을 해준다.


만약 인덱스 명을 지정하고 싶으면, 인덱스 명을 같이 지정해 주면 지정한 인덱스 명으로 생성해 준다.

주의 할점은 인덱스를 생성할 경우 반드시 MaxLength 속성을 지정하여 필드 크기를 900 바이트 이하로 지정해야 인덱스가 생성되므로 주의 한다.

참고 : 테이블 '***' 에 있는 열 '***' 의 유형이 인덱스에서 키 열로 사용하기에 적합하지 않습니다


2017년 6월 7일 수요일

C#, MVC : in the application's configuration file does not contain the required providerName attribute

MVC 에서 DB 연결을 시도 했더니...

"in the application's configuration file does not contain the required providerName attribute"


... 라는 오류가 난다.

살짝 짜증이 나지만, 컴퓨터 잘못이 아니니, 일단 "Web.config" 를 열어본다.
아마 이런식으로 되어 있을 텐데...


여기에 "providerName" 이 빠져 있어서 그런것이다.
일반적으로 "System.Data.SqlClient" 를 사용하고 EntityFramework 를 사용할 때는 "System.Data.EntityClient" 를 사용한다고 하던데... 그냥 "System.Data.SqlClient" 만 써도 다 되는 것 같다.


하여간 "ConnectionStrings" 에 providerName="System.Data.SqlClient" 를 추가해 주면 오류가 해결된다.


C#, MVC : CS0246 'DbContext' 형식 또는 네임스페이스 이름을 찾을 수 없습니다.


MVC 에서 DB Context 를 사용하려고 하니...

"CS0246 'DbContext' 형식 또는 네임스페이스 이름을 찾을 수 없습니다."

... 라는 오류가 발생한다.

당연히 "using System.Data.Entity;" 가 되어 있는데도 안된다.
보통은 System.Data.Entity 만 Using 에 기록해줘도 되니, 안되면 당황스럽지만, 사실 System.Data.Entity 는 중요한게 아니다.

DbContext 를 사용하려면 "EntityFramework" 가 설치되어 있어야 한다.


NuGet 패키지 관리자에 가보니, 역시나 설치가 안되어 있다.
만약 설치가 되어 있다면, "제거" 나 "업데이트" 버튼이 나와 있었을 것이다.

이걸 설치를 하면...


이렇게 오류가 없어진다.

2017년 5월 31일 수요일

C#, WebForm : 썸머노트(summernote) 에 이미지 업로드 기능 달기


이전에 썸머 노트를 사용해 보았다.

참고 : 위지윅 에디터 (Wysiwyg Editor) 썸머노트(summernote)

문서 작성 까지는 잘 되지만, 이미지를 삽입할때 문제가 된다.


툴 아이콘중 그림 표시를 클릭해보면....


일반적인 이미지 선택창이 나오고 여기서 이미지를 지정하면...


이렇게 이미지가 잘 들어간다.
하지만, 저기 "소스 보기" 아이콘을 클릭하여 html 소스를 보게 되면...


이렇게 일반적인 이미지 링크가 아닌, Base64 로 인코딩된 문자열이 이미지로 삽입되어 있는 것을 볼수 있다.
즉, 문서내에 이미지가 포함되어 있는 것.

이것도 나름 장점이 많은 방식이긴 하지만, 이렇게 하면 전체적으로 데이터가 많이 늘어나는데다, 이미지 관리도 안되고, 특히나 아주 큰 이미지가 첨부되었을 경우 아예 DB 에 넣지도 못하는 경우까지 생길수 있어 좀 골치 아프다.

이걸 일반적인 이미지 업로드해서 이미지 링크가 되게끔 바꿔 보자.
썸머노트에는 이것을 위해 콜백 함수를 지원한다.


현재 이렇게 되어 있을 텐데, 여기에 콜백 함수를 추가한다.


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="BoardEntry.aspx.cs" Inherits="SummerNote_BoardEntry" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
       
    <!-- include libraries(jQuery, bootstrap) -->
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css" rel="stylesheet">
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
    <script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"></script>

    <!-- include summernote css/js-->
    <link href="dist/summernote.css" rel="stylesheet" type="text/css" />
    <script src="dist/summernote.min.js" type="text/javascript"></script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
   
        <div id="summernote">Hello Summernote</div>
   
        <script>
            $(document).ready(function() {
                $('#summernote').summernote({
                    height: 300,
                    callbacks: {
                        onImageUpload: function(files) {
                            sendFile(files[0]);
                        }
                    }
                });

                function sendFile(file) {
                    data = new FormData();
                    data.append("file", file);
                    $.ajax({
                        url: 'GetFile.aspx',
                        data: data,
                        cache: false,
                        type: "POST",
                        contentType: false,
                        processData: false,
                        success: function(url) {
                            $('#summernote').summernote('insertImage', url);
                        }
                    });
                }
            });

            function funcMyHtml() {
                document.getElementById("HiddenField").value = $('#summernote').summernote('code');
            }
       
        </script>

        <asp:HiddenField ID="HiddenField" runat="server" />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="funcMyHtml()" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>

이렇게...

참고로 여기서는 "callBacks : " 이라는 속성으로 콜백 함수를 지정하였는데, 인터넷을 뒤져 보면 대부분 그냥 "callBacks : " 없이 그냥 "onImageUpload() " 를 쓰라고 되어 있을 것이다. 근데 언제 부터인지 그렇게 안된다.

심지어는 "insertImage" 지정하는 방식도 다르다.
언제 부터 바뀌었는지는 모르겠지만, 하여튼 현재 (2017-05-31) 공식배포처에서 다운 받은 파일로는 안된다.

이렇게 해 놓았으면 파일을 서버로 전송할 준비는 다 되었다.

이제 서버측에서 파일을 수신하는 기능을 만들어 준다.


파일 수신받을 aspx 파일을 하나 추가해 주고...
(원래 웹서비스를 만드는게 정석이겠으나... 귀찮으니 그냥 만들자.)


단순히 파일을 서버에 저장하는 페이지 이므로 아무런 내용이 필요 없으니 html 은 모두 삭제 하자. 헤더만 남겨 두면 된다.



using System;
using System.IO;

public partial class SummerNote_GetFile : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        foreach (string upload in Request.Files)
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"upload");
            string filename = Path.GetFileName(Request.Files[upload].FileName);

            if (!Directory.Exists(path)) Directory.CreateDirectory(path);

            Request.Files[upload].SaveAs(Path.Combine(path, filename));

            Response.Write("http://" + Request.Url.Host + ":" + Request.Url.Port + "/web/upload/" + filename);
        }
    }
}

그러고 나서 비하인드 코드에 파일을 저장하는 루틴을 기록.
이렇게 하면 POST 방식으로 전달한 파일을 서버에 저장 할수 있다.


쉽게 말해서 aspx 파일이 아닌 순수 Html 페이지에서 전달한 파일도 받아서 서버에 저장할수 있는 방식이다.
(여기서 FileUpload.htm 파일은 그냥 파일이 잘 업로드 되고 업로드된 경로가 잘 출력되나 테스트해보는 페이지 일 뿐. 즉, 없어도 상관 없는 파일이다.)

이렇게 해 놓고 썸머노트에서 이미지를 다시 삽입해 보면...


이렇게 이미지 태그 방식으로 이미지가 삽입된 것을 볼수 있다.
(참고로 완전한 Url 이 아니면 아예 이미지가 삽입되지 않는다.)

C#, WebForm : 위지윅 에디터 (Wysiwyg Editor) 썸머노트(summernote)

웹페이지를 구축할때 웹 에디터는 이제 빠질수 없는 구성요소다.
그런데, 예전에는 제법 많은 무료 에디터들이 있었지만, 이젠 거의 개발이 중단되었거나, 유료화 되어 버려 아쉽다. (네이버와 다음에서 공개한 에디터들을 많이 썼지만, 지금은 거의 업데이트가 안되고 있다.)

뭐, 돈많은 개발자들이야 좋은 유료 에디터를 갖다 쓰겠지만... ㅠㅠ... 돈이 없으니, 아쉬운대로 무료 에디터를 찾아 써야 한다.

그 중에서 무려 "국내" 개발진에서 개발하고 있는 무료 에디터가 있으니, "Summernote" 이다.

배포처 : http://summernote.org/


디자인도 성능도 여타 다른 에디터에 뒤지지 않는다.
쓰는 방법도 간단한데, 간단이 위의 다운로드 이미지를 클릭해서 다운 받거나...


"Getting Started" 페이지로 이동해 거기서 "Downloaded compiled" 버튼을 클릭해 다운 받아도 된다. 두 곳의 다운로드 파일은 약간의 차이가 있는데...


초기 페이지에서 다운 받을수 있는 파일 "summernote-master.zip" 는 기능 파일과 예제가 포함되어 있는 파일이고, 다운로드 페이지에서 받을수 있는 파일인 "summernote-0.8.4-dist.zip" 는 기능파일만이 포함되어 있는 파일이다.

물론 "summernote-master.zip" 에서 기능 폴더인 "dist" 폴더만 갖다 써도 된다. 어차피 같은 파일이니까. 하지만, "summernote-0.8.4-dist.zip" 에 있는 파일이 약간이나마 용량이 적으니, 실 서버에 사용할 때는 그쪽을 이용하는 것이 좋을 것이다.

에디터를 사용하려면, 사용하려는 페이지에 다운 받은 파일들을 복사해 넣은 후, jQuery 와 bootstrap 을 링크 시켜 줘야 한다.

그런 다음에는 에디터를 적용할 <div> 의 id 를 지정하여 주기만 하면 끝.


이렇게 하고 페이지를 로드해 보면...


이렇게 에디터가 적용이 된다.
적용이 되기는 하는데, 기본 크기가 너무 작으니 좀 키워 보자.


이렇게 초기 값을 지정해 놓고 다시 페이지를 로드해 보면...


이렇게 높이가 커진 에디터를 볼수 있다.

이 에디터에서 작성한 내용을 C# 에서 받아 볼려면, 여러가지 방법이 있겠지만, 제일 간단한 방법으로 <hidden> 필드를 이용하는 것을 추천한다.


이렇게 HiddenField 를 하나 두고, 버튼을 클릭시 자바스크립트를 이용해서 summernote 의 값을 세팅해두면...


이렇게 비하인드 코드에서 썸머노트의 값을 가져 올수 있다.
반대로 비하인드 코에서 썸머노트에 내용을 로드하게끔 할수도 있는데...


이렇게 초기화 함수에 히든필드 값을 읽어 오도록 지정해 놓고...


이렇게 비하인드 코드에서 히드필드의 값을 지정하면 ...


이렇게 특정 값이 세팅되게 할수도 있음.
이제 이렇게 하고, DB 연결만 해주면 게시판은 쉽게 만들수 있음.