사진 게시판 API 만들기 [2]

Perfect 미니 프로젝트 [2]

  1. 서버 객체 생성 및 라우팅
  2. mongoDB 연결하기

본격적으로 API 서버 만들기에 돌입합니다!!

참고

2017년 7월 현재 Swift 3 / Perfect 최신버전 2.0.x 환경에서 진행함을 알려드립니다.

서버 객체 생성 및 라우팅

서버 객체와 라우팅에 대한 설명은 지난 글에서 했으므로, 작성한 코드만 설명합니다.

우선, 프로젝트 폴더의 Sources폴더의 handlers.swift 파일을 생성합니다.

vi Sources/handlers.swift

혹시 Xcode로 프로젝트를 진행하고 있다면 파일 타깃을 ImageBoard로 설정해주세요.

아래 코드를 입력합니다.

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

아래 코드를 작성합니다.

import Foundation
import MongoDB
import PerfectLib

struct DB {
    static var client: MongoClient?
    static var database: MongoDatabase?
    static var collection: MongoCollection?
}

func connectToDB(uri: String, database: String, collection: String) throws {

    do {
        DB.client = try MongoClient(uri: uri)
    } catch {
        throw error
    }

    DB.database = DB.client?.getDatabase(name: database)
    DB.collection = DB.database?.getCollection(name: collection)
}

func disconnectToDB() {
    DB.collection?.close()
    DB.database?.close()
    DB.client?.close()
}

그리고 main.swift 파일로 이동해서 아래 코드로 업데이트 해줍니다.

vi Sources/main.swift

/// 더 위의 코드는 생략

do {
    try connectToDB(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)")
}

disconnectToDB()

이제 데이터베이스 연결까지 준비를 마쳤습니다.

다음 번에는 실제로 데이터베이스에 쓰고 읽는 작업까지 해보려 합니다~

다음에 또 만나요! 😀

참고문서

by yagom


facebook : https://www.facebook.com/yagompage
facebook group : https://www.facebook.com/groups/yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기   

댓글 남기기

Close