Perfect 미니 프로젝트 [2]
1. 서버 객체 생성 및 라우팅
2. mongoDB 연결하기
본격적으로 API 서버 만들기에 돌입합니다!!
참고
2017년 7월 현재 Swift 3 / Perfect 최신버전 2.0.x 환경에서 진행함을 알려드립니다.
* Swift 최신 버전 확인(https://github.com/apple/swift/releases)
* Perfect 최신 버전 확인(https://github.com/PerfectlySoft/Perfect/releases)
서버 객체 생성 및 라우팅
서버 객체와 라우팅에 대한 설명은 지난 글에서 했으므로, 작성한 코드만 설명합니다.
2017/05/24 - [Swift/Perfect] - Perfect 라우팅
우선, 프로젝트 폴더의 Sources폴더의 handlers.swift 파일을 생성합니다.
> vi Sources/handlers.swift
혹시 Xcode로 프로젝트를 진행하고 있다면 파일 생성시 타깃을 ImageBoard로 설정해주세요.
handlers.swift 파일에 아래 코드를 입력합니다.
import PerfectHTTP struct ContentsType { static let json = "application/json; charset=utf-8" static let formData = "multipart/form-data" } // 사진 게시물 목록 func articleListHandler(request: HTTPRequest, response: HTTPResponse) { response.setHeader(.contentType, value: ContentsType.json) // 첫 번째 테스트를 위해 임시로 response body 생성 do { try response.setBody(json: ["hello":"test"]) response.completed() } catch { response.completed(status: .internalServerError) } } // 사진 게시물 등록 func postArticleHandler(request: HTTPRequest, response: HTTPResponse) { response.setHeader(.contentType, value: ContentsType.json) response.completed() } // 사진 게시물 수정 func modifyArticleHandler(request: HTTPRequest, response: HTTPResponse) { response.setHeader(.contentType, value: ContentsType.json) response.completed() } // 사진 게시물 삭제 func deleteArticleHandler(request: HTTPRequest, response: HTTPResponse) { response.setHeader(.contentType, value: ContentsType.json) response.completed() } // 사진 게시물 정보 func articleInfoHandler(request: HTTPRequest, response: HTTPResponse) { response.setHeader(.contentType, value: ContentsType.json) response.completed() }
라우팅을 위한 핸들러 생성을 미리 해둔 것입니다.
핸들러 생성을 모두 마쳤으면 이제 서버 객체를 생성하고 구동할 차례입니다. main.swift 파일로 이동합니다.
> vi Sources/main.swift
이전 포스팅에서 모두 설명한 내용이므로 따로 코드설명은 하지 않아도 아실 것이라 생각합니다.
import PerfectLib import PerfectHTTP import PerfectHTTPServer let articleURI = "/article" let subArticleURI = articleURI + "/*" var routes = Routes() routes.add(method: .post, uri: articleURI, handler: postArticleHandler(request:response:)) routes.add(method: .get, uri: articleURI, handler: articleListHandler(request:response:)) routes.add(method: .post, uri: subArticleURI, handler: modifyArticleHandler(request:response:)) routes.add(method: .delete, uri: subArticleURI, handler: deleteArticleHandler(request:response:)) routes.add(method: .get, uri: subArticleURI, handler: articleInfoHandler(request:response:)) let server = HTTPServer() server.addRoutes(routes) server.serverPort = 8080 do { try server.start() } catch PerfectError.networkError(let error, let message) { Log.error(message: "Error: \(error), \(message)") } catch { Log.error(message: error.localizedDescription) }
자 이렇게 코드 작성을 마쳤으면, 동작 테스트를 해봐야죠! ImageBoard 애플리케이션을 실행 한 후 접속하여 제대로 동작하는지 확인합니다.
이렇게 응답이 온다면 제대로 동작하고 있다고 볼 수 있지요 :)
제대로 응답이 온다면 다음 스텝으로!
mongoDB 연결하기
이번엔 몽고디비를 연결해보려고 합니다. 사실 이 미니 프로젝트는 여러 데이터베이스를 사용할 필요도, 여러 콜렉션을 사용할 필요도 없습니다. 그래서 단일 데이터베이스의 단일 콜렉션을 사용하려고 합니다. 몽고 데이터베이스 이름은 "image_board", 콜렉션 이름은 "articles"라고 사용하겠습니다.
몽고디비 관련한 내용을 작성할 소스코드 파일 mongo.swift를 생성합니다.
> vi Sources/mongo.swift
mongo.swift 파일에 아래 코드를 작성합니다.
import Foundation import MongoDB import PerfectLib struct DB { static var client: MongoClient? static var database: MongoDatabase? static var collection: MongoCollection? static func connect(uri: String, database: String, collection: String) throws { do { self.client = try MongoClient(uri: uri) } catch { throw error } self.database = DB.client?.getDatabase(name: database) self.collection = DB.database?.getCollection(name: collection) } static func disconnect() { self.collection?.close() self.database?.close() self.client?.close() } }
그리고 main.swift 파일로 이동해서 아래 코드로 업데이트 해줍니다.
> vi Sources/main.swift
/// 더 위의 코드는 생략 do { try DB.connect(uri: "mongodb://localhost", database: "image_board", collection: "articles") try server.start() } catch PerfectError.networkError(let error, let message) { Log.error(message: "Error: \(error), \(message)") } catch { Log.error(message: "\(error)") } DB.disconnect()
이제 데이터베이스 연결까지 준비를 마쳤습니다.
다음 번에는 실제로 데이터베이스에 쓰고 읽는 작업까지 해보려 합니다~
다음에 또 만나요! :D
참고문서
by yagom
facebook : http://www.facebook.com/yagomSoft
facebook group : https://www.facebook.com/groups/yagom
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기
↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓
'Swift > Perfect' 카테고리의 다른 글
사진 게시판 API 만들기 [4] (0) | 2017.08.30 |
---|---|
사진 게시판 API 만들기 [3] (0) | 2017.08.09 |
사진 게시판 API 만들기 [1] (6) | 2017.06.27 |
Perfect 라우팅 (0) | 2017.05.24 |
Perfect 시작하기 (0) | 2017.05.17 |