don't stop believing

Perfect 구조 잡기 (BasicController와 API) 본문

Swift/Perfect

Perfect 구조 잡기 (BasicController와 API)

Tongchun 2017. 10. 12. 20:50

Perfect와 PostgreSQL을 이용한 데이터 API 서버 기본 개발을 학습했는데요.  이번에는 Perfect서버의 기본 구조를 잡아보겠습니다. 

이전 학습에서는 main.swift 에서 Perfect 서버 구동과 데이터 호출을 하고 dataTreat.swift에서 데이터를 불러오는 함수들을 만들었습니다.

이번엔 아래와 같이 구조를 잡아보겠습니다.

  • main.swift : Perfect 서버 구동
  • BasicController.swift : API 호출에 의한 request, response 처리
  • WordsAPI.swift : DB 데이터 처리
  • Words.swift : DB (words) 데이터 모델

먼저 기존에 없었던 BasicController.swift와 WordsAPI.swift파일을 생성하고 xcode 프로젝트 파일을 생성합니다.

$ touch Sources/BasicController.swift
$ touch Sources/WordsAPI.swift
$ swift package generate-xcodeproj
$ open nGleServer013.xcodeproj/

xCode를 실행시키고 먼저 BasicController.swift에 아래와 같이 main.swift에 있던 Route.add() 항목들을 작성합니다.

import Foundation
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer

final class BasicController {

    var routes: [Route] {
        return [
            Route(method: .get, uri: "/", handler: testWord),
            Route(method: .get, uri: "/allData", handler: allWord),
            Route(method: .post, uri: "/saveNew", handler: postSaveNew),
            Route(method: .post, uri: "/getByID", handler: postGetByID),
            Route(method: .post, uri: "/findByString", handler: postFindByStringAny),
            Route(method: .get, uri: "/findBySelect/{searchWord}", handler: getFindBySelect),
            Route(method: .post, uri: "/findUpdate", handler: postFindUpdate),
            Route(method: .post, uri: "/findDelete", handler: postDelObjByID)
        ]
    }
}

그리고 handler의 method들도 BasicController.swift로 이동합니다.

그 다음 main.swift파일은 아래와 같이 수정합니다.

BasicController 클래스를 초기화 하고 server.addRoutes()에 파라메타로 추가한 형태입니다.

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer

import StORM
import PostgresStORM

PostgresConnector.host = "192.168.0.6"
PostgresConnector.username = "tongchun"
PostgresConnector.password = "tongchun"
PostgresConnector.database = "tongchun"
PostgresConnector.port = 5432

let setupObj = Words()
try? setupObj.setup()

let server = HTTPServer()
server.serverPort = 8080

let basic = BasicController()
server.addRoutes(Routes(basic.routes))

do {
    try server.start()
} catch PerfectError.networkError(let err, let msg) {
    print("Network error thrown: \(err) \(msg)")
}

여기까지 변경하고 빌드 후 실행해 확인합니다.

$ swift build
$ .build/debug/nGleServer013

WordsAPI.swift 파일에는 아래와 같이 WordsAPI 클래스를 생성해 줍니다.

WordsAPI 클래스 안의 method들은 static으로 생성해 줍니다.

import Foundation

class WordsAPI {
    static func saveNew(word: String, means: String, example: String) throws -> Words {

        let obj = Words()
        obj.word = word
        obj.means = means
        obj.example = example

        do {
            try obj.save {id in obj.equipid = id as! Int }
        } catch {
            throw error
        }

        print("Object created with new id of \(obj.word)")
        return obj
    }

}

BasicController 클래스에서 호출하는 method들을 WordsAPI 클래스의 것들로 변경합니다.


이렇게 main.swift, BasicController, WordsAPI, Words로 구분하여 구조를 잡을 수 있습니다.




Comments