don't stop believing

[swift] Kitura Web Server 기본 시작하기 본문

Swift/Kitura

[swift] Kitura Web Server 기본 시작하기

Tongchun 2017. 8. 22. 16:15

Swift Server Framework은 여러가지가 있습니다.

그 중 Kitura를 이용해 Web Server를 만들어 보겠습니다.


Terminal을 열고 프로젝트를 만들 적당한 곳으로 이동합니다. 그리고 프로젝트명으로 폴더를 만듭니다.

$ cd Document/JakeWork
$ mkdir nGleServer001

 package를 초기화 합니다.

$ swift package init --type executable

package.swift 파일과 몇개의 폴더가 생성된 것을 확인 할 수 있습니다.

이제 package.swift 파일을 열고 Kitura를 추가합니다.

import PackageDescription

let package = Package(
    name: "nGleServer001",
    dependencies: [
        .Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 7),
        .Package(url: "https://github.com/IBM-Swift/HeliumLogger.git", majorVersion: 1, minor: 7)
    ]
)

Kitura를 dependencies에 추가하면 Kitura 외 SwiftyJSON 등 Kitura와 버전을 맞춘 framework들이 추가됩니다.

  • https://github.com/IBM-Swift/Kitura.git
  • https://github.com/IBM-Swift/Kitura-net.git
  • https://github.com/IBM-Swift/SwiftyJSON.git
  • https://github.com/IBM-Swift/Kitura-TemplateEngine.git
  • https://github.com/IBM-Swift/LoggerAPI.git
  • https://github.com/IBM-Swift/BlueSocket.git
  • https://github.com/IBM-Swift/CCurl.git
  • https://github.com/IBM-Swift/BlueSSLService.git


이제 Source/main.swift 파일을 아래와 같이 수정합니다.

import Kitura
import HeliumLogger

// Initialize HeliumLogger
HeliumLogger.use()

// Create a new router
let router = Router()

// Handle HTTP GET request to /
router.get("/") {
    request, response, next in
    response.send("Hello, nGle!")
    next()
}

// Add an HTTP server and connect it to the router
Kitura.addHTTPServer(onPort: 8080, with: router)

// Start the Kitura runloop (this call never returns)
Kitura.run()

저장을 하고 Terminal에서 빌드를 합니다.

$ swift build

빌드가 성공했다면 서버를 실행합니다.

$ .build/debug/nGleServer001

브라우저를 열고 서버를 호출해 봅니다.

http://localhost.com:8080


브라우저에 Hello, nGle! 가 보이면 성공

xCode에서 개발하기 위해 xCodeProject도 생성해 봅시다.

$ swift package generate-xcodeproj

finder에서 프로젝트 파일을 클릭해 xCode로 실행할 수 있습니다.


개발이 진행되면 파일도 많아지고 그에따른 클래스나 함수들도 많아지죠. 파일과 swift 모듈에 대한 구조를 잡아봅시다.

먼저 Source 폴더 안에 nGleServer 라고 폴더를 하나 만듭니다. nGleServer에는 Server 실행에 대한 내용을 작성하겠습니다. 그리고 Source 폴더 안에 nGleRouter 라고 폴더를 하나 더 만듭니다. nGleRouter에는 실제 request와 response에 대한 데이터 처리를 작성하겠습니다.


nGleServer 폴더안에 main.swift파일을 이동시킵니다. 그리고 nGleRouter에는 nGleRouter.swift 파일을 새로 생성합니다. nGleRouter.swift 파일에 아래와 같이 작성합니다.

SampleRouter 구조체 안에 create() 함수를 생성하고 main.swift에 있던 router 초기화와 get 메써드 부분을 넣습니다. 그리고 create() 함수는 Router를 반환합니다.

import Foundation
import Kitura

public struct SampleRouter {
    public static func create() -> Router {
        let router = Router()

        router.get("/") {
            request, response, next in
            response.send("Hello, nGle!")
            next()
        }

        return router
    }
}

그 다음 main.swift 파일의 Router 초기화와 get 메써드 부분을 삭제하고 아래 코드를 추가합니다.

SampleRouter 구조체의 create() 함수를 router 변수에 초기화 하는 코드입니다.

import nGleRouter

// Create a new router
let router = SampleRouter.create()

이 상태에서 빌드를 하게되면 에러가 납니다.

Swift Package Manager (SPM)를 이용한 프로젝트의 경우 Source 폴더 안에 subdirectory가 있을경우 Module이 됩니다. 따라서 Package.swift 파일에서 Target을 잡아줘야 합니다.

Package.swift 파일을 아래와 같이 추가합니다.

import PackageDescription

let package = Package(
    name: "nGleServer001",
    targets: [
        Target(name: "nGleServer",
               dependencies: [.Target(name: "nGleRouter")]),
        Target(name: "nGleRouter")
    ],
    dependencies: [
        .Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 7),
        .Package(url: "https://github.com/IBM-Swift/HeliumLogger.git", majorVersion: 1, minor: 7),
    ]
)

이제 다시 빌드를 하고 실행을 해봅니다.

빌드를 하고나면 실행파일명이 변경된 것을 확인할 수 있습니다. Source폴더 안에 main.swift 파일만 있다면 빌드 후 실행파일 명은 프로젝트명과 동일하게 됩니다. 하지만 Source 파일 안에 있는 폴더가 있다면 Module로 처리되며 main.swift 파일이 있는 폴더명은 실행파일명이 됩니다.

$ swift build
$ .build/debug/nGleServer

다시 브라우저에서 http://localhost:8080을 호출하면 Hello, nGle! 이 보이게 됩니다.


Comments