성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>윈도우 폰을 위한 Holiyday Calendar 앱 개발</h1> <p> 제가 근무하는 회사에서는 휴가 관리 프로그램을 모바일로 배포하고 있습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Holiday Manager - 아이폰: <a target='tab' href='http://itunes.apple.com/us/app/holiday-manager/id502327711?l=ko&ls=1&mt=8'>http://itunes.apple.com/us/app/holiday-manager/id502327711?l=ko&ls=1&mt=8</a> - 안드로이드폰: <a target='tab' href='https://market.android.com/details?id=com.jennifersoft.holidays.app'>https://market.android.com/details?id=com.jennifersoft.holidays.app</a> </pre> <br /> 대단한 프로그램은 아니고, 단지 날짜 선택해 두고 1년에 몇 개의 날짜가 선택되었는지만 세어주면 끝입니다.<br /> <br /> 사실 회사 직원들만 쓸 용도로 배포하는 것이라서 원래는 직원들의 개개인에 맞는 서비스가 제공되어야 하는데, 아시다시피 '모바일 앱'들이 별도의 '앱스토어' 등을 통해서 배포되다 보니 '범용적'으로 사용할 수 있도록 개발되어져야 합니다.<br /> <br /> 그래서, 회사 직원들의 근속연수에 따른 (+)휴가 일수를 보여준다던가, 그로 인한 남은 휴가 일수를 계산하는 서비스는 불가능하고 단지 '한 개인이 1년에 며칠의 휴가를 냈는가'를 자체적으로 계산할 수 있는 정도의 기능만 제공해 주고 있습니다.<br /> <br /> 이번 글은 그 응용 프로그램을 만들면서 사용한 팁을 소개하는 것입니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> <br /><div style='font-size: 12pt; font-family: Malgun Gothic, Consolas; color: #2211AA; text-align: left; font-weight: bold'>1. 달력 컨트롤</div> <br /> 자... '휴가 관리'가 목적이니, 우선 달력 컨트롤이 있어야 합니다. 아쉽게도 기본 설치되는 "Silverlight for Windows Phone"에는 달력 컨트롤이 제공되지 않으므로 별도의 컨트롤을 다음의 사이트에서 다운로드해 설치해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows Phone Controls ; <a target='tab' href='http://wpcontrols.codeplex.com/releases/view/71749'>http://wpcontrols.codeplex.com/releases/view/71749</a> </pre> <br /> 달력 컨트롤을 사용하는 방법은 간단합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <phone:PhoneApplicationPage x:Class="HolidayManager.MainPage" ...[생략]... xmlns:WPControls="clr-namespace:WPControls;assembly=WPControls" shell:SystemTray.IsVisible="True"> <phone:PhoneApplicationPage.Resources> <span style='color: blue; font-weight: bold'><local:ColorConverter x:Key="ColorConverter"/></span> </phone:PhoneApplicationPage.Resources> <Grid x:Name="ContentPanel" Grid.Row="1"> <WPControls:Calendar HorizontalAlignment="Stretch" <span style='color: blue; font-weight: bold'>ColorConverter="{StaticResource ColorConverter}"</span> Name="calendar1" VerticalAlignment="Top" /> </Grid> </pre> <br /> 특이한 점이라면, 위에서 ColorConverter를 사용하고 있는데요. 목적은 해당 날짜의 문자 색이나 배경색을 바꾸기 위해서입니다. 대충 아래와 같이 하면, 토요일은 문자 색상을 Purple로 지정하고, 일요일은 빨간색, 그리고 '휴가로 지정된 날짜'는 회색으로 배경을 채웁니다. (실제 코드에서는 약간 변경되었습니다.) <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public class <span style='color: blue; font-weight: bold'>ColorConverter : IDateToBrushConverter</span> { public Brush Convert(DateTime dateTime, bool isSelected, Brush defaultValue, BrushType brushType) { if (brushType == BrushType.Background) { if (IsToday(dateTime) == true) { return new SolidColorBrush(Colors.LightGray); } else { return defaultValue; } } else { if (dateTime.DayOfWeek == DayOfWeek.Saturday) { return new SolidColorBrush(Colors.Purple); } else if (dateTime.DayOfWeek == DayOfWeek.Sunday) { return new SolidColorBrush(Colors.Red); } else { return defaultValue; } } } private bool IsToday(DateTime dateTime) { DateTime now = DateTime.Now; return (dateTime.Year == now.Year && dateTime.Month == now.Month && dateTime.Day == now.Day); } } </pre> <br /> <img alt='how_to_dev_holiday_manager_1.png' src='/SysWebRes/bbs/how_to_dev_holiday_manager_1.png' /><br /> <br /> <br /><div style='font-size: 12pt; font-family: Malgun Gothic, Consolas; color: #2211AA; text-align: left; font-weight: bold'>2. SQL Compact Edition 사용</div> <br /> 그다음은 사용자가 지정한 날짜를 '휴가'로 저장해야 합니다. 그렇다면 '저장소'가 필요한데요. 간단한 프로그램이라서 그냥 단순하게 파일로 저장해도 되지만... ^^ 우리의 목표는 '공부'하는 효과도 병행하는 것이기 때문에 '망고 폰'부터 적용되는 "SQL CE"를 사용해 보겠습니다.<br /> <br /> 예전에 간단하게 SQL Compact Edition을 다뤄본 적이 있었는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Pet Shop 4.0 - SQL Server Compact Edition Version - 두 번째 이야기 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/815'>http://www.sysnet.pe.kr/2/0/815</a> </pre> <br /> 망고 폰에서는 데스크톱 App과는 달리 SQL Compact Edition을 사용한다고 해서 별도의 dll을 참조하거나 배포할 일은 없습니다. (망고 폰에 내장되어 있습니다. 아마도 폰의 GAC 같은 곳에 등록되어 있겠지요.) 따라서, 해줄 일은 "System.Data.Linq" 어셈블리를 참조하고 "Enterprise Framework"의 "Code First"와 유사한 방식으로 DataContext를 정의해서 사용하면 됩니다.<br /> <br /> 말이 좀 장황한데, 다음의 글들을 읽어보시면 쉽게 사용할 수 있습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SQL CE 버전으로 날개 단 윈도우폰 7 망고 ; http://www.imaso.co.kr/?doc=bbs/gnuboard.php&wr_id=37900&bo_table=article Mango Sample: Database Part 1:2 ; <a target='tab' href='http://blog.jerrynixon.com/2011/11/mango-sample-database-part-12.html'>http://blog.jerrynixon.com/2011/11/mango-sample-database-part-12.html</a> </pre> <br /> 아래는 위의 글을 읽고 제가 적용한 DataContext 소스입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; ...[생략]... using System.Linq; using System.Data.Linq; using System.Data.Linq.Mapping; using System.ComponentModel; namespace HolidayManager.Db { <span style='color: blue; font-weight: bold'>public class HolidayContext : DataContext</span> { public static string ConnectionString = "Data Source=isostore:/HolidayManager.sdf"; public HolidayContext(string connectionString) : base(connectionString) { } <span style='color: blue; font-weight: bold'>public Table<MyHoliday> MyHolidays;</span> public void InsertMyHoliday(DateTime selectedDate, HolidayType type) { MyHoliday mh = new MyHoliday(); mh.Date = selectedDate; mh.Type = type; RemoveMyHoliday(false, selectedDate); this.MyHolidays.InsertOnSubmit(mh); this.SubmitChanges(); } internal void RemoveMyHoliday(bool commitChanges, DateTime dateToRemove) { var dates = (from entity in this.MyHolidays where entity.Date == dateToRemove select entity ).ToList(); this.MyHolidays.DeleteAllOnSubmit(dates); if (commitChanges == true) { this.SubmitChanges(); } } internal void ToggleHoliday(DateTime dateTime) { var dates = <span style='color: blue; font-weight: bold'>(from entity in this.MyHolidays where entity.Date == dateTime select entity).ToList();</span> if (dates.Count() >= 1) { this.MyHolidays.DeleteAllOnSubmit(dates); } else { InsertMyHoliday(dateTime, HolidayType.Full); } this.SubmitChanges(); } } public enum HolidayType { None, Full, Half, } <span style='color: blue; font-weight: bold'> [Table] public class MyHoliday</span> { public MyHoliday() { } public MyHoliday(DateTime date, HolidayType type) { this.Date = date; this.Type = type; } DateTime date; <span style='color: blue; font-weight: bold'>[Column(IsPrimaryKey = true, DbType = "DATETIME NOT NULL", CanBeNull = false)]</span> public DateTime Date { get { return date; } set { date = value; } } HolidayType type; <span style='color: blue; font-weight: bold'>[Column(DbType = "int NOT NULL", CanBeNull = false)]</span> public HolidayType Type { get { return type; } set { type = value; } } } } </pre> <br /> 이렇게 해서 테이블 규격을 정했으니, 이제 데이터베이스를 생성해야 하는데요. 응용 프로그램이 동작하기 위해 무조건 생성되어 있어야 하니 최초에 한 번은 다음과 같이 꼭 실행해 주어야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void CreateDatabase() { using (HolidayContext db = new HolidayContext(HolidayContext.ConnectionString)) { if (db.DatabaseExists() == false) { <span style='color: blue; font-weight: bold'>db.CreateDatabase();</span> } } } </pre> <br /> SQL CE 쓰는 방법이 그다지 어렵지 않지요? ^^<br /> <br /> <br /><div style='font-size: 12pt; font-family: Malgun Gothic, Consolas; color: #2211AA; text-align: left; font-weight: bold'>3. 격리 저장소의 파일 확인하는 도구</div> <br /> 보통, Database 생성하고 나서 사용하다 보면 가볍게 데이터를 확인하고 싶을 때가 있습니다. 물론, 앱에서 그런 역할을 하는 코드를 넣어주어도 되지만 관리 콘솔이 있었으면 좋겠다는 생각이 드는데요.<br /> <br /> 다행히 약간의 절차를 거치면 확인하는 것이 가능한데, 이를 위해 우선 다음의 도구를 다운로드해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows Phone Power Tools ; <a target='tab' href='http://wptools.codeplex.com/releases/view/73232'>http://wptools.codeplex.com/releases/view/73232</a> </pre> <br /> "Power Tools"의 "file browser" 탭 영역을 이용하면 해당 앱의 폴더 구조를 볼 수 있습니다.<br /> <br /> <img alt='how_to_dev_holiday_manager_2.png' src='/SysWebRes/bbs/how_to_dev_holiday_manager_2.png' /><br /> <br /> "GET" 버튼을 누르면 선택된 파일을 PC로 다운로드 할 수 있고, Visual Studio의 "Server Explorer"를 이용하면 다음과 같이 구조를 탐색하는 것이 가능합니다. (그러게요... 이렇게 꼭 확인해 봐야 마음이 놓인다니까요. ^^)<br /> <br /> <img alt='how_to_dev_holiday_manager_3.png' src='/SysWebRes/bbs/how_to_dev_holiday_manager_3.png' /><br /> <br /> <hr style='width: 50%' /><br /> <br /> 그 외에는, 딱히 떠오르는 '팁' 성격의 항목이 없습니다. 정말 간단한 프로그램이지요. ^^ 아래는 실행 화면! (성태는 올해 2일의 휴가를 냈답니다. ^^)<br /> <br /> <img alt='how_to_dev_holiday_manager_4.png' src='/SysWebRes/bbs/how_to_dev_holiday_manager_4.png' /><br /> <br /> 마지막으로 남은 작업은 '배포'인데,,, 이건 '마켓플레이스'에 정상적으로 등록되고 나면 마저 쓰도록 하겠습니다. <br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=711&boardid=331301885'>"Holiday Calendar"에 대한 소스 코드는 이 글에 첨부</a>되어 있으니 참고하세요. ^^)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6052
(왼쪽의 숫자를 입력해야 합니다.)