SNS 어플리케이션 - 2011 졸업작품최종보고서 2011. 09. 15 성명조성경 소속전자통신컴퓨터공학부 학년 4 학번 2005003673 지도교수원유집 ( 인 ) 전자통신컴퓨터공학부 한양대학교
1. 서론 1.1 주제선정배경스마트폰시장의규모가커지면서스마트폰플랫폼을사용하는다양한서비스또한생겨나고있는데, 대표적인서비스로트위터로대표되는 SNS서비스와위치정보기반서비스등이있다. 이번졸업작품으로 Android 단말기의 GPS위치정보를활용하여, 자기위치를글로작성하여지도에표시하고, 이표시를통해사람들이서로메시지를주고받을수있는 SNS 어플리케이션을제작하려고한다. 1.2 목표사용자는특정장소에대한내용을글과사진으로남길수있다. 데이터는먼저 Phone의내부저장소에저장되고, 원할경우다른사람들과공유할수있는데, 이때서버에데이터를전송한다. 또다른사람들이메시지를남긴장소를열람할수있으며, 이열람정보를통해다른사용자에게직접메시지를전달할수있다. 서버에서는클라이언트로부터데이터를받아서버의 SQL 저장소에저장하고, C2DM서버로 Push 메시지를보내며, 클라이언트의요청에따라 data를전송합니다. 구글이제공하는 C2DM서버를사용함으로써, Android Phone 내부에서별도의서비스를실행할필요없이메시지를전달받을수있도록한다. 별도의서비스를실행하지않으므로단말기의배터리를절약할수있다. < 그림 1> 클라이언트 - 서버통신개요도 >
2. 본론 2.1 개발개괄 2.1.1 개발내용 : SNS 어플리케이션클라이언트 / 서버 2.1.2 개발언어 : Java ( 클라이언트 / 서버 ) 2.1.3 개발도구 - 서버 DB: MySQL MySQL 선택이유 : 무료로사용할수있으며, Java와의연결을편리하게하기위해 JDBC connector를사용할수있고, SQL-Query Browser와 Database관리용도구 MySQL-Workbench 제공한다. - 클라이언트 DB: SQLite Android에서기본제공하는 Database 사용 (MySQL JDBC connector에서제공하는메서드와는차이가있으므로코드작성시주의한다. ( 메서드명, tuple및 column의시작 index 등 ) - IDE: Eclipse Indigo (ADT Plugin을추가하여사용 ) - 기타 : Android DB 조작을위한 SQLite Database Browser 2.2 개발내용 2.2.1 규칙 - 기본적인내용은 Java식명명을따른다. - 클래스멤버변수에접근할때, Getter/Setter 메서드를작성해서사용하지않고, public으로선언한후직접접근한다. Java의정책과정반대되는방법이지만, 모바일환경인 Android에서는오히려성능을저하시킬수도있다. Android 개발가이드라인에서도권고하는바고, 코드가단순해지는효과도있다. (Dev Guide > Avoid Internal Getters/Setters) 2.2.2 클래스개요각클래스는연관도에따라프로젝트의하위패키지로그룹화한다. Article 관련클래스 Article: 사용자가작성한데이터로글, 사진, 날짜, 날씨정보, 위치정보등을포함하는클래스로이어플리케이션에서중요하게사용된다. ArticleAdapter: Article객체를 List에표현하기위한 Adapter
ArticlePreview: Article을미리보여주는다이얼로그 ArticleTable: Article객체에대해 SQLite DB에서관리하는클래스 TabList: 사용자가작성한 Article 이나서버에서받아온 Article 을표시하는리스트 TabWrite: 사용자가글을작성하는 Activity WeatherPreview: 날씨를수동으로선택하는경우표시하는다이얼로그 Photo 관련클래스 Photo: 메모리절약을위해 Binary Data 대신파일이름만을관리 PhotoAdapter: Gallery에사진을표시하기위한 Adapter PhotoPreview: 사진을미리보여주는클래스 PhotoTable: 사진정보에대해 SQLiteDB에서관리하는클래스 PhotoUtils: 사진관리 static 메서드모음 Map 관련클래스 ArticleOverlayItem: 지도에표시할아이콘오버레이 BalloonLayout: 지도에서아이콘선택시표시되는풍선 BalloonItemizedOverlay: ItemizedOverlay를상속하여지도에아이콘과풍선을표시 LocationSelect: 자신의위치를직접선택하는 Activity TabbedMapActivity: Java에서는다중상속이허용되지않기때문에, MapView를사용하는 Activity인 MapActivity에서하단탭을표시하려면따로구현해야한다. TabMap: 주변 Article을표시하는지도 Activity Message 관련클래스 MessageItem: 메시지아이템 MessageTable: 메시지를 SQLite에관리하기위한클래스 InboxAdapter: 받은메시지어뎁터 ChatAdapter: 채팅어뎁터 TabChat: 다른사용자와주고받은메시지를표시 TabInbox: 메시지를주고받은사용자들을표시 MessageUtil: 메시지관련 static 메서드모음
기타클래스 TabbedActivity: 기존의안드로이드에서제공하는탭위젯대신탭기능을구현하기위해공통으로사용하는내용이담겨있다. 하단탭을표시하려면이 Activity를상속받아야한다. MyTrace: 프로그램이시작하면표시되는화면으로, 하위메뉴를표시하는리스트로구성되어있다. BaseWidget: Activity 내부의 Widget을통합관리하기위한클래스 CommData: 서버와클라이언트통신시사용하는클래스. 하위클래스중하나를선택하여데이터를넣어전송하고, int타입의변수로데이터타입을구분한다. CommRequest: 서버에요청하기위한 static 메소드모음 C2DM_BroadcastReceiver: Google C2DM서버와의통신담당 SNS 연동클래스 WrapFacebook: Facebook을사용하기위한클래스 WrapTwitter: Twitter를사용하기위한클래스 기타 Pref: 설정 Activity를관리하는클래스 Utils: 프로그램전역에서필요한메서드를 static으로정의한클래스 Setting: 어플관련설정관리클래스 SQLiteTable: SQLite DB를관리하는추상클래스 주요클래스세부내용 Article: 사용자가작성한데이터를저장하기위한클래스 멤버변수타입설명 id int Client database(sqlite3) 에서각 article 을구분할 id (SQLite 에서 primary key 는 1 부터시작 ) date long Calendar.getTimeInMillis() 메서드로얻은날짜 title String 제목 ( 내용에서 10 여글자를추출해서사용 ) detail String 내용
latitude int 위도 10 longitude int 경도 10 address String 위의위도, 경도값으로역지오코딩 (Reverse Geocoding) 하여얻은주소 weather String Google 날씨에서얻어온데이터를저장 (ex: Partly Cloudy) photos ArrayList<String> 첨부한사진의 Uri 목록 ( 실제경로명 ) uploadid String 업로드후서버에서받아오는 id - Article 클래스는 Activity간전송을하기위해 Parcelable을구현한다. Java의직렬화 (Serializable) 와유사하다. - 내부적으로위치좌표 latitude와 longitude 값은 double로관리된다. 그러나위치좌표의값은소수점이하 6째자리까지사용되는것이보통이므로, 편의를위해 10 을곱한후정수형태로저장하여사용한다. GeoPoint클래스에서는이미 int형태로관리하고있다. - 사진의경우 Android DB 저장소는대부분의기기에서협소한편이기때문에외부저장소 (SD카드) 에저장을한후그경로명만 ArrayList로관리한다. CommArticle: Article클래스를서버와클라이언트간전송하기위해사용한다. Article 클래스는 Android에서만사용하는 Parcelable 클래스를 implement하기때문에서버와통신시직접사용할수없다. 따라서통신용클래스를따로만들어변환하는과정을거쳐야한다. 멤버변수타입설명 datatype int 아래데이터의타입을구분 data object 전송할데이터 data2 object ( 수신후해당하는 type 으로캐스팅 ) data 에넣어전송할데이터는다음과같다. CommPhoto: 사진데이터를전송하기위한클래스로, byte[] 의 ArrayList 형태로 되어있다.
GPoint: Android 에만있는 GeoPoint 데이터를서버로전송하기위한클래스 Message: 클라이언트에서서버로메시지전송요청을하기위한클래스 null 및 String: 단순한요청및간단한데이터전송시사용 2.2.4 서버와클라이언트간통신 기본적으로 Android 에서서버 / 클라이언트간통신을하는과정은다음과같다. < 통신순서 > 1. 소켓을연다. 2. CommData클래스를생성한후요청플래그설정과데이터를저장하고, 이를 OutputObjectStream 클래스로서버에요청한다. 3. InputObjectStream 클래스로서버에서결과를받아온데이터를처리한다. 4. 소켓을닫는다. ObjectStream() 을사용하면간단하게통신을할수있으나, 이과정에서 int, double 과같은기본데이터형은바로 read/write할수있지만, 직접작성한 class데이터는바로사용할수없다. 따라서, 해당 class의직렬화를구현해주어야한다. 특별히작성할메서드는없고, implements Serializable를선언하고 serialversionuid멤버변수만생성해주면 Java에서별어려움없이사용할수있다. 통신시사용하는 CommData의데이터형은다음플래그로판단한다. Data Type 내용 클라이언트 -> 서버 REQ_ARTICLE_LIST REQ_MARKER_LIST REQ_MESSAGE_SEND REQ_DELETE_ARTICLE REQUEST_PHOTO Article 리스트를요청지도에표시할 Marker 리스트요청 Google C2DM 서버로메시지전송을요청업로드한 Article 삭제를요청다운받은 Article에해당하는사진을요청 REQUEST_PHOTO_THUMB Article 의미리보기그림을요청 UPLOAD_ARTICLE Article 을업로드 서버 -> 클라이언트 SEND_* 각요청에해당하는응답 각 Flag 를설정한후요청은 Utils 클래스의해당하는메서드를사용하여처리한다.
2.2.5 SNS 연동이프로젝트에서는사용자가외부 SNS(Twitter, Facebook) 와연동하여사용할수있게하였다. 2.2.5.1 Twitter Twitter는 Twitter4J라는라이브러리를사용하는데, 인증방식에는 oauth, xauth방식이있다. xauth의경우직접 ID/PW를입력받아인증하는방법으로구현이간단하지만부정사용방지를위해 Twitter의사전인증이필요하므로, 여기서는 oauth 를사용한다. oauth방식은앱에서직접 ID/PW로로그인하지않고, 트위터인증페이지를통해인증하는방식이다. < Twitter 인증순서 > 1. Comsumer Key, Comsumer Secret Key로 Request Token을생성한후 Callback URL과같이전송한다. 2. 안드로이드웹브라우저의트위터인증페이지에서사용자가직접이메일과비밀번호를입력하여인증한다. 3. 인증후 Callback URL을통해인증된결과, Access Token, Access Token Secret을받아온다. 여기서 Consumer Key, Consumer Secret Key는사전개발자인증을통해받을수있고, 인증후전달받은 Access Token, Access Token Secret은저장해두면재인증받을필요없이사용할수있다. 트위터는텍스트전용서비스이므로사진을같이전송하려면외부서비스를사용해야하는데여기서는 TwitPic서비스를이용하기로했다. TwitPic은 Twitter4J media support 라이브러리에서지원하므로, 프로젝트에추가하고 TwitPic Developer 페이지에서 API키를발급받아사용하면된다. 2.2.5.2 Facebook Facebook의경우라이브러리보다는 Facebook에서직접제공하는 SDK를사용할수있다. 프로젝트에서 Facebook SDK를 import해서사용하는데, Twitter와같이 Facebook 페이지를통해서인증을받는다. 다만, SDK내부에서 WebView를사용하여인증한다는점이약간다르다.
< 인증순서 > 1. AppID, SecretCode Key를발급받은후, 페이스북로그인다이얼로그가열린다. 2. 사용자가직접인증한다. 3. Sesson, SessionExpires를받아온다. Facebook의경우 Token을 Session으로칭하고, 이 Session에는기간제한이있다. 다만, Twitter와같이 Session에기간제한없이사용할수있는데, 인증요청시 Permission에 offline_access를추가하면 SessionExpires 값이 0이되어제한없이사용할수있다. 페이스북도사진을업로드할수있지만, 사진을업로드하면담벼락이아닌사진첩에저장된다. 담벼락에사진을업로드하려면메시지와함께 picture 태그에사진의주소를지정하면되지만다음과같은문제점이있다. < picture 태그사용시문제 > 1. TwitPic 에사진을업로드후주소사용 - 글과사진이다른서비스에저장되므로관리가어려움. 2. Facebook 사진첩에업로드후주소사용 - Facebook 서버의사진을사용하면다음과같은오류가발생한다. ((#100) FBCDN image is not allowed in stream) 따라서여기에서는약간돌아가는방법을사용하였다. < Facebook 담벼락에사진업로드 > 1. Facebook 사진첩에사진을업로드한다. 2. 업로드한주소를 URL 주소줄이기서비스를이용하여줄인다. 3. 줄인주소를 picture 태그에넣어담벼락에업로드한다. 이방법을사용하면원하는대로담벼락에업로드할수있고, 사진을이중으로 관리하지않아도된다. 다만, URL 주소줄이기서비스가종료되면사진링크가깨지 게된다. 그러나원본은사진첩에저장되어있으므로데이터유실은되지않는다.
2.2.6 서버이프로젝트에서사용할서버는 MySQL에데이터를저장하고 Java를사용하여구현한다. 서버는 while((clientsocket = serversocket.accept())!=null) 문에서클라이언트의접속을기다리고, 클라이언트에서요청이있으면서비스를처리하는스레드를생성하여처리한후다시대기상태로돌아간다. 스레드에서는전달받은 CommData클래스의데이터타입을기준으로해당하는메서드를호출하여요청을처리한다. < 스레드내부 > ois = new ObjectInputStream(socket.getInputStream()); CommData receiveddata = (CommData)ois.readObject(); switch(receiveddata.datatype){ case CommData.REQ_ARTICLE_LIST:{ processrequestarticle(receiveddata.data); break; } case CommData.REQ_MARKER_LIST:{ processrequestmarker(receiveddata.data, receiveddata.data2); break; } case CommData.REQ_MESSAGE_SEND:{ processrequestsendmessage(receiveddata.data); break; } case CommData.UPLOAD_ARTICLE:{ processuploadarticle(receiveddata.data, receiveddata.data2); break; } case CommData.REQUEST_PHOTO:{ processrequestpicture(receiveddata.data); break; }} 데이터는 JDBC Connector를통해 MySQL 데이터베이스에저장하는데, 다음 Table 을사용한다. - article: 클라이언트에서업로드한 article을저장 - photo: 클라이언트에서업로드한 article의사진을 BLOB 형태로저장 - c2dm_id: 메시지전송시사용될 Client ID와 C2DM ID를저장
3. 결과 3.1. 메인화면 선택한메뉴의 Activity 로이동한다. 하드웨어메뉴키터치시하단옵션메뉴표시 앱실행시최초로표시할화면으로, ListView 위젯을사용하여메뉴를표시한다. 각메뉴를선택하면해당하는화면으로이동한다. 휴대전화의메뉴버튼을누르면사용할수있는옵션을표시한다. ( 모든화면공통 ) 각기기를구분하기위해 Unique ID를생성해야하는데, 이를구분할수있는값과각각의문제점은다음과같다. - IMEI, 전화번호 : 가장확실한값이지만전화기가아닌 Device에서는얻을수없다. 또 READ_PHONE_STATE 권한이필요하기때문에좋은선택은아니다. - Mac Address 및 Bluetooth 고유번호 : 위의항목만큼 Unique하지만, 일부기기에서는 WiFi가켜져있지않으면올바른 Mac Address를리턴하지않는다. 그리고모든기기에 WiFi나 Bluetooth가장착되었는지알수없다. - Serial Number: Android 2.3부터는 android.os.build.serial가 Unique한값을리턴하도록되어있다. 하지만 OS 버전 2.2 이하기기에서는동작하지않는다. - G-mail Account: 안드로이드마켓을사용하기위해서는필히 Google 계정이필요하다. 따라서거의모든안드로이드기기에서기기를구분하는좋은방법이다. 다만, 한사용자가두기기에같은계정을사용하는경우, 두기기를구분할수없다.
또한, IMEI, 전화번호, G-mail계정은 개인정보이므로 관리 소홀로 유출될 경우 문제가 발생할 수 있다. 모든 방법이 하나만 사용하여서는 조건을 충족시키지 못 하므로 여기서는 다음과 같은 방법을 사용하였다. Client ID = (G-mail Account 문자열의 hashcode()) * Calendar.getTimeInMillis() Hash Code는 Java에서 객체마다 서로 다른 값을 갖는다. 이 값에 현재 시간을 곱하면, 설사 Hash Code가 같더라도 현재 시간 값은 매 순간 다르므로 Unique한 값을 얻을 수 있다. 추가적으로 랜덤 값을 생성해서 곱해 줄 수도 있다. 이 과정은 복호화가 필요 없는 일종의 암호화로 생각할 수 있다. 어차피 메일 주소를 수집할 것도 아니고 기기를 구분하는 용도로만 사용할 것이기 때문에, 숫 자화된 형태로 저장하여 사용한다. 3.2 글 목록 특정 검색어를 입력하면 2~3초 대기 후, 서 버에서 검색한 후 글을 받아옴 최신 목록으로 업데이트 선택한 글을 표시 하단에 다음 목록 10개를 표시 ImageButton으로 탭을 구현 이 Activity에는 서버에 등록된 글을 리스트하거나 로컬에 저장된 글을 리스트하는 데 사용한다. Activity를 호출할 때 어디에서 자료를 가져 올지 intent정보에 저장하여 호출한다. 서버의 글을 다운로드 받아 표시하는 경우, 서버에서는 전체 목록을 전달하는 것 이 아니라, 가장 최신 목록으로 정렬해서 10개씩 전달한다. 리스트에는 Header와
Footer가달리는데, Header를터치하면리스트목록전체를새로고침, Footer를터치하면마지막글다음 10개를서버에요청하여받아온다. 반면, 로컬자료를표시하는경우 DB검색에큰부하가걸릴것이라고는생각하지않기때문에 Header와 Footer는추가하지않는다. 리스트각아이템의오른쪽에는미리보기사진이표시된다. 처음에는 Gallery를추가할예정이었으나, ListView Item의 Focus를 Gallery에서가로채는현상이발생하고작은공간에배치하기에효율적이지않다는판단에서 ImageView로대체하였다. 상단의검색박스는특정키워드를입력하여 DB로부터검색한다. 하단의탭은 Android에서제공하는탭위젯을사용하지않고 ImageButton을사용하여구현하였다. 레이아웃을새로만들고, ImageButton과 TextView를나란히배치한후, 다른레이아웃 XML에서 include 태그를사용하여불러와사용할수있다. 탭위젯사용시의제약없이좀더다양한디자인을사용할수있으나, 몇가지사소한문제가있어서처리해주어야한다. - 버튼이눌렸을때어떤 Activity가호출될것인지정해져야하기때문에, 각 Activity에서탭을사용하는것을 TabbedActivity에서미리알고있어야한다. - 하단의선택된버튼이컨텍스트메뉴호출후선택해제되는문제가있는데 onresume메서드에서눌림설정을해주면된다.
3.3 새로운 글 작성 날짜 자동 설정 터치 : 날짜 설정 Dialog 표시 날씨를 자동 설정 터치 : 자동 날씨 업데이트 길게 터치: 수동 선택 Dialog 표시 텍스트 입력 텍스트 글자 수 표시(트위터) 위치정보 사용시 - 위치 자동선택 - 주소 표시 - 위치 직접 지정 사진 정보 사용시 - 사진 추가 버튼(촬영/갤러리) - 추가한 사진 미리보기 (선택시 미리보기Dialog 표시) 기능 사용/미사용(Toggle Button) - 위치정보 사용 - 사진 첨부 - Twitter 내보내기 - Facebook 내보내기 이 Activity에서는 서버와 외부 SNS에 업로드 할 글을 작성하고 사진을 첨부한다. Activity 시작 시 날씨정보 및 현재 위치, 주소는 Google API를 사용하여 자동으로 얻어온다. 만일 변경하고 싶거나 정확한 정보가 아닌 경우 직접 수정하는 것도 가 능하다. 사진을 첨부하려면 사진 오른쪽 위에 보이는 추가 아이콘을 터치하면 카메 라에서 촬영하거나, 사용하는 갤러리 앱에서 선택하여 사진을 첨부할 수 있다. 외부 SNS에 내보내기를 하기 위해서는 먼저 계정 인증이 필요하다. Twitter/Facebook 계정이 설정되어 있지 않다면, 설정 페이지로 넘어가게 된다. Twitter의 경우 입력 글자 수를 140자로 제한하고, 사진이나 위치정보를 추가하는 경우 입력한 글 뒤에 덧붙인다. Facebook은 담벼락 에 사진과 메시지가 동시에 올라가지 않으므로, 2.2.5.2에서 설 명한 방법을 사용한다.
저장 및 업로드 버튼을 누르면 다음과 같은 Dialog가 표시되며 저장 프로세스를 보여준다. 저장 프로세스를 아이콘으로 표시 3.4. 지도 간략한 내용 및 사진 Dialog 표시 터치 : 글 미리보기 Dialog 표시 글이 있는 위치 표시 터치 : 풍선 표시 서버에 등록된 글 목록을 지도 위에 표시한다. 클라이언트가 현재 화면 중앙의 좌표 A와 표시 범위를 서버에 전송하면 서버에서는 좌표 A에서 표시 범위 내에 있
는 글을 검색하여 결과를 클라이언트에 전달한다. 지도 위의 아이콘을 선택하면 풍선이 표시되고, 간략한 내용과 사진 미리보기를 제공한다. 풍선을 선택하면 미리보기 Dialog를 호출한다. 3.5. 미리보기 다른 사용자가 작성한 텍스트 내용 첨부한 사진 표시 터치: 사진 미리보기 화면 표시 다른 사용자가 포스트한 글과 사진을 보여준다. 사진의 경우 크기가 크기 때문에 어플 전용 캐시 폴더(/data/data/패키지이름/cache/)에 글번호_사진번호 이름을 갖는 캐시파일을 만들고, 다시 열었을 때 캐시를 먼저 사용하도록 한다. 하단의 아이콘을 선택하여 포스트한 사용자에게 메시지를 보낼 수 있다.
3.6. 메시지 최신메시지표시터치 : 채팅화면으로이동 채팅내역표시왼쪽 : 상대방오른쪽 : 자신 지정한사진표시 받은메시지를최근에받은순서로표시한다. DB의 message Table에서 GROUP BY 문을사용하여쿼리하면상대별로최신메시지를얻을수있다. 이때, 쿼리결과가 MySQL에서는 id순으로얻어지지만, SQLite에서는 id의역순으로얻어진다. 버그인지의도된것인지는알수없으나, 이렇듯다른부분이생각보다많으므로, 이러한차이를인지하고주의해야한다. 메시지전송은, 현재 C2DM을사용하고있는데, 한번에최대 1024byte까지전송가능하다. 4. 결론이어플리케이션은앱기반 SNS를구현하고자하였다. 앱에서특정내용을요청하면서버는그요청에대해서비스하는것이기본구조이다. 서버와클라이언트는각각 Database에정보를저장하고, 서로간의통신은마치택배를보내는것처럼통신클래스를만들어사용했다. 메시지전송은 C2DM서버에요청하여전달한다. 안드로이드어플리케이션개발은 Java 언어를사용하기때문에처음에는어렵지않을것이라생각했다. 그러나안드로이드플랫폼이아직성숙하지않아서개발자에대한지원이좋은편이아니다. API에대한부연설명이없거나, 버전에따라 API가다른경우도있었다. 또단순한어플리케이션이아닌서버와클라이언트로동작하는만큼시행착오가많았고테스트또한쉽지않았다. 또같은 Java를사용
하지만미묘하게다른경우가많아어려움이많았다. (MySQL 과 SQLite 의메서드명, tuple 의시작 index 번호차이등 ) 5. 참고문헌안드로이드 2.3 프로그래밍 / 이준호 / 위키북스단계별예제로배우는안드로이드프로그래밍 / 한동호 / 제이펍알짜만골라배우는안드로이드프로그래밍, 마크머피지음, 에이콘안드로이드펍 : http://www.androidpub.com 안드로이드개발자사이트 : http://developer.android.com/index.html Twitter4j: http://twitter4j.org/en/index.html Facebook SDK: http://developers.facebook.com/ 6. 졸업작품후기주제선정을하는데시간이오래걸려프로젝트를늦게시작하게되었다. Android 휴대전화는능숙하게사용하고있었지만 Android 어플리케이션개발경험은별로없었다. 그러나이번프로젝트를시작하면서막연하게생각하였던 Java와 Android 개발능력이크게향상되었다는것을느꼈다. 특히 Java와 Eclipse는거의처음접하는상황에서시행착오도많았지만, 기존 C++ 과제경험을바탕으로어렵지않게적응할수있었다. 또 Subversion을사용하여기초적인형상관리방법을공부할수있었다. 전공과목으로수강하였던과목들이직ᆞ간접적으로많은도움을주었다. 특히데이터베이스과목의 MySQL관련어플리케이션작성과제는이번프로젝트에서 Database를사용하는데큰도움이되었다. 학부생활동안이렇게한프로그램을오랫동안작성해본적이없었다. 그래서처음에는부담도많이되었지만, 이제는큰프로젝트를접하더라도막연한두려움을갖지않게될것같다.
부록 1. 소스코드관련소스코드가약 40여개파일과총 7000여라인인관계로코드내용은문서에첨부하지않고파일로첨부한다. 또는프로젝트를 Google Code에등록하였으므로다음명령으로 Checkout하면코드를다운로드받을수있다. 클라이언트 : svn checkout http://mytrace.googlecode.com/svn/trunk/ mytrace-read-only 서버 : svn checkout http://mytraceserver.googlecode.com/svn/trunk/ mytraceserver-read-only GUI 또는 IDE에서접근하려면 Subversion플러그인설치후위의주소에접근한다.