'Swift/Perfect'에 해당되는 글 5건

  1. 2017.07.11 사진 게시판 API 만들기 [2]
  2. 2017.06.27 사진 게시판 API 만들기 [1] (2)
  3. 2017.05.24 Perfect 라우팅
  4. 2017.05.17 Perfect 시작하기
  5. 2017.04.03 우분투(Ubuntu)에 스위프트 설치하기


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


이전 포스팅에서 모두 설명한 내용이므로 따로 코드설명은 하지 않아도 아실 것이라 생각합니다.

2017/05/17 - [Swift/Perfect] - Perfect 시작하기


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 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (2) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom


Perfect 미니 프로젝트 [1]

1. 프로젝트 개요
2. mongoDB 설치 

3. 패키지 설치 



우분투에 스위프트 설치를 시작으로 이후 두 포스팅에 걸쳐 퍼펙트에 대해 조금 알아보았습니다.



2017/04/03 - [Swift/Perfect] - 우분투(Ubuntu)에 스위프트 설치하기

2017/05/17 - [Swift/Perfect] - Perfect 시작하기

2017/05/24 - [Swift/Perfect] - Perfect 라우팅


이번 부터는 실질적으로 퍼펙트를 사용하여 작은 미니프로젝트를 해보려합니다.

아... 물론 이런 허접한 구성은 실제 서버에서 사용하면 안되지만 간단한 예제로 감만 잡아보는 겁니다. 인증도 없고, 뭐도 없고, 보안도 안되고... 뭐... 암것도 없어요. 그러나 한 번 작은 프로젝트 해보는데에 의의를 가지는 것이니 나중에 삘받으면 하나하나 덧붙여 가면 됩니다.

그저 DB 연결해보고, API로 클라이언트와 핑퐁 해보는 것이 전부이긴 하지만, 그래도 감잡기는 좋을 것 같아요 :)

이 감 말고요... 'ㅁ' 아하핳


프로젝트 개요

간단한 사진게시판을 위한 REST API 서버를 만들어보겠습니다.

API 

HTTP Method 

URI 

사진 게시물 등록 

POST 

/article 

사진 게시물 목록

GET 

사진 게시물 수정 

POST 

/article/{article_id}

사진 게시물 삭제 

DELETE

사진 게시물 정보 가져오기 

GET


사진 게시물 등록

요청(Request)

  • HTTP Method : POST
  • Content-Type: multipart/form-data

 매개변수

자료형 

값의 범위/기본 값 

비고 

 필수여부

image 

binary data

 

이미지 데이터 

user_name

string 

 

사용자 이름 

Y

description

string 

 

이미지 설명 

N

title

string 

 

이미지 제목 

Y


응답(Response)

Key 

자료형 

비고 

필수여부 

article_id 

string 

업로드된 게시물 고유 식별자 


사진 게시물 목록

요청(Request)

  • HTTP Method : GET
  • Content-Type: application/json

 매개변수

자료형 

값의 범위/기본 값 

비고 

 필수여부

page

integer

조회하고자 하는 페이지 번호

user_name

string 


특정 사용자의 게시물만 받아오고자 할 때

N

articles_per_page

integer

1~100 / 10 

각 페이지 당 게시물 수 

N


응답(Response)

Key 

자료형 

비고 

필수여부 

articles 

json object array (string) 

게시물 정보 배열 

Y

articles_per_page

integer

각 페이지 당 게시물 수

 Y

current_page

integer 

전송된 페이지 

total_page

integer 

전체 페이지 수 

Y

articles item object 형태

Key 

자료형 

비고 

필수여부 

image_url

string

이미지 URL

Y

user_name

string

업로드한 사용자 이름 

description

string 

이미지 설명 

title

string 

이미지 제목 

article_id

string 

게시물 고유 식별자


사진 게시물 수정

요청(Request)

  • HTTP Method : POST
  • Content-Type: multipart/form-data

 매개변수

자료형 

값의 범위/기본 값 

비고 

 필수여부

image 

binary data

이전 데이터

이미지 데이터 

N

user_name

string 


사용자 이름이 이전 사용자 이름과 일치하지 않으면 수정에 실패

Y

description

string 

이전 데이터

이미지 설명 

N

title

string 

이전 데이터

이미지 제목 

N


응답(Response)

Key 

자료형 

비고 

필수여부 

article_id 

string 

수정된 게시물 고유 식별자


사진 게시물 삭제

요청(Request)

  • HTTP Method : DELETE
  • Content-Type: application/json

매개변수 없음


응답(Response)

Key 

자료형 

비고 

필수여부 

article_id

string

삭제된 게시물 고유 식별자

Y


사진 게시물 정보 가져오기 

요청(Request)

  • HTTP Method : GET
  • Content-Type: application/json

매개변수 없음


응답(Response)

매개변수 

자료형 

비고 

필수여부 

image_url

string

이미지 URL

Y

user_name

string

업로드한 사용자 이름 

description

string 

이미지 설명 

title

string 

이미지 제목 

article_id

string 

게시물 고유 식별자



모든 응답데이터는 JSON 형식을 사용합니다.

이 정도를 구현해 볼건데요, 데이터베이스가 필요할테니 쓸만한 데이터베이스가 무엇이 있을지 찾아봅니다.


현재(2017년 6월) 퍼펙트에서 공식적으로 제공하는 데이터베이스 커넥터 목록입니다.

  • SQLite
  • MySQL
  • MariaDB
  • PostgreSQL
  • FileMaker
  • MongoDB
  • Working with BSON
  • Apache CouchDB
  • LDAP
  • Kafka
  • Mosquitto
  • ZooKeeper
  • Hadoop

와우... 많네요!! 저는... 몽고디비를 써봐야겠습니다. 



mongoDB 설치

그러려면 먼저 mongoDB를 설치해봐야겠지요.

설치방법은 아래 링크에 친절히 나와있으니 참고하시면 되겠습니다 :)


퍼펙트에서 몽고디비를 사용하기 위해서는 mongo-c 라이브러리를 사용해야합니다. 

먼저, mongo-c 드라이버를 설치합니다. mongo-c와 관련된 설명은 Perfect의 문서를 참고하셔도 좋습니다.


macOS

HomeBrew를 먼저 설치(링크)하신 후, 터미널에서 아래 명령어를 입력합니다.

> brew install mongo-c-driver


ubuntu

아래 명령어를 입력합니다.

> sudo apt-get install libmongoc


패키지 설치

그리고 이제 새로운 프로젝트를 시작하기 위해서 프로젝트를 진행하길 원하는 위치에서 프로젝트 폴더를 생성합니다. 프로젝트 폴더 이름은 ImageBoard라고 하겠습니다.

> mkdir ImageBoard
> cd ImageBoard


그 다음 스위프트 패키지 매니저를 통해 패키지 초기화를 합니다. 스위프트 패키지 매니저는 지난 포스트[우분투(Ubuntu)에 스위프트 설치하기]에서 설치했었죠?

> swift package init --type executable 


swift package init 명령어를 실행 후 폴더에 생성된 Package.swift 파일을 열어서 Perfect 패키지 의존성을 추가합니다.

> vi Package.swift


Package.swift 파일에 아래 코드를 작성합니다.  (우리는 새로운 프로젝트를 만들면서 함께 mongo-c 패키지도 설치할거예요.)

import PackageDescription let package = Package( name: "ImageBoard", targets: [], dependencies: [ .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", versions: Version(0,0,0)..<Version(10,0,0)), .Package(url:"https://github.com/PerfectlySoft/Perfect.git", versions: Version(0,0,0)..<Version(10,0,0)), .Package(url:"https://github.com/PerfectlySoft/Perfect-MongoDB.git", versions: Version(0,0,0)..<Version(10,0,0)) ] )

위 패키지 설명은 Perfect HTTP Sever, Perfect, Perfect MongoDB 커넥터 패키지를 버전 0부터 10까지 중 최신 버전을 가져오도록 합니다. (현재시점으로 모두 2.x.x 버전)


소스를 저장하고 나와서 패키지를 설치합니다.

> swift package update


만약에 맥에서 Xcode 프로젝트를 생성해주고 싶다면

> swift package generate-xcodeproj

해주시면 해당 폴더에 Xcode 프로젝트가 생성됩니다. 그러면 이후 코딩을 Xcode 프로젝트로 진행할 수 있습니다.



이제 프로젝트 준비가 완료되었습니다!

다음부터는 실질적으로 코딩을 해봅니다 :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 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (2) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom

Perfect 라우팅

Swift/Perfect 2017.05.24 11:00


Perfect 라우팅

1. Routes 
2. HTTP Method, URI 지정 
3. 
Web Root 디렉터리 설정
4. JSON 응답



지난 번에는 Perfect 서버 애플리케이션을 처음 구동해 보았습니다. 

2017/05/17 - [Swift/Perfect] - Perfect 시작하기

이번에는 라우팅 하는 방법에 대해서 알아보려고 합니다 :)


* 참고 *

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

* Swift 최신 버전 확인

* Perfect 최신 버전 확인


Routes

HTTP 요청에 의해 여러 메서드, URI에 따른 동작을 처리하려면 Routes라는 구조체를 사용합니다.

지난 번 main.swift파일에 서버 포트를 지정해 주었던 server.serverPort = 8080 코드 아래에 routes 변수에 Routes 인스턴스를 하나 할당해줍니다.

var routes = Routes()


HTTP Method, URI 지정

Routes인스턴스를 생성할 때, 원하는 HTTP Method와 URI를 지정할 수 있으며, 요청이 온 경우 handler 클로저를 통해 요청을 처리합니다. 이후, addRoutes() 메서드를 통해 서버에 라우트 정보를 추가해줍니다.

routes.add(method: .get, uri: "/blog", handler: { request, response in
	response.setBody(string: "Blog handler was called")
	response.completed()
})
server.addRoutes(routes)

이렇게 지정하고 실행하면 8080포트blog 경로를 지정하여 요청하면 "Handler was called" 문자열이 돌아오게 될 것입니다.


handler 클로저의 내부에서 request 인스턴스에서 param(name:) 등 많은 메서드를 통해 HTTP 요청 정보를 읽어낼 수도 있습니다. 
routes.add(method: .get, uri: "/blog", handler: { request, response in
    
    let pageToResponse: Int
    
    if let page = request.param(name: "page"), let pageNumber = Int(page) {
        pageToResponse = pageNumber
    } else {
        pageToResponse = 0
    }
    
    response.setBody(string: "Handler was called page number:  \(pageToResponse)")
    response.completed()
})


Web Root 디렉터리 설정

연습을 해봤으니 실질적으로 HTML 응답과 JSON 응답을 해보려합니다. 먼저 웹의 데이터를 모아 둘 WebDocuments 폴더를 사용자 디렉터리의 하위폴더로 생성해줍니다.
> mkdir ~/WebDocuments

WebDocuments 폴더를 생성하면 블로그 메인페이지로 사용할 index.html 파일을 넣어줍니다. (파일을 이동하거나 복사하는 방법에 대해서는 따로 설명하지 않겠습니다... 'ㅁ')

이제 WebDocuments 폴더를 웹서버의 Root 폴더로 지정합니다. 

사용자 디렉터리의 주소를 가져오기 위해 Foundation 프레임워크를 이용했습니다. main.swift 파일 상단에 import Foundation을 통해 Foundation 프레임워크를 불러와주세요.


그리고 아래 코드를  server.addRoutes(routes) 라인 아래에 작성해주세요.

if let homeURL = URL(string: NSHomeDirectory()) {
    var rootPath = homeURL.appendingPathComponent("WebDocuments", isDirectory: true).absoluteString
    
    try Dir(rootPath).create()
    
    server.documentRoot = rootPath
}

이렇게 설정하고 하위 경로 없이 접속하면 WebDocuments 폴더의 index.html 파일을 자동으로 메인 페이지로 볼 수 있습니다.




JSON 응답

이번에는 단순히 HTML 웹페이지가 아닌 JSON 응답을 줘보려고 합니다. 먼저 응답을 제어하기 위한 handler 클로저를 따로 함수로 구현하려 합니다. 가독성 면에서도 그게 좋을 것 같아요.


서버 인스턴스 생성코드 let server = HTTPServer() 전에 handler 함수를 구현해봅니다. 

func jsonHandler(request: HTTPRequest, response: HTTPResponse) {
    
    var jsonDictionary: [String: Any] = [:]
    jsonDictionary["name"] = "yagom"
    jsonDictionary["languages"] = ["Swift", "Objective-C"]
    jsonDictionary["age"] = 10
    jsonDictionary["alive"] = true
    
    do {
        response.setHeader(.contentType, value: "application/json; charset=utf-8")
        try response.setBody(json: jsonDictionary)
        response.completed()
    } catch {
        response.completed(status: .internalServerError)
    }
}


그리고 경로를 지정해주기 위해서 server.addRoutes(routes) 코드 위에 아래 코드를 작성합니다.

routes.add(method: .get, uri: "/json", handler: jsonHandler(request:response:))



다시 실행해서 /json 경로로 GET 요청을 하면 아래와같이 JSON 문자열을 응답한 것을 확인할 수 있습니다.




정리

지금까지 작성한 main.swift 파일 코드

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
import Foundation

func jsonHandler(request: HTTPRequest, response: HTTPResponse) {
    
    var jsonDictionary: [String: Any] = [:]
    jsonDictionary["name"] = "yagom"
    jsonDictionary["languages"] = ["Swift", "Objective-C"]
    jsonDictionary["age"] = 10
    jsonDictionary["alive"] = true
    
    do {
        response.setHeader(.contentType, value: "application/json; charset=utf-8")
        try response.setBody(json: jsonDictionary)
        response.completed()
    } catch {
        response.completed(status: .internalServerError)
    }
}

let server = HTTPServer()

server.serverPort = 8080
var routes = Routes()
routes.add(method: .get, uri: "/blog", handler: { request, response in
    
    let pageToResponse: Int
    
    if let page = request.param(name: "page"), let pageNumber = Int(page) {
        pageToResponse = pageNumber
    } else {
        pageToResponse = 0
    }
    
    response.setBody(string: "Handler was called page number:  \(pageToResponse)")
    response.completed()
})

routes.add(method: .get, uri: "/json", handler: jsonHandler(request:response:))

server.addRoutes(routes)


if let homeURL = URL(string: NSHomeDirectory()) {
    var rootPath = homeURL.appendingPathComponent("WebDocuments", isDirectory: true).absoluteString
    
    try Dir(rootPath).create()
    
    server.documentRoot = rootPath
}

do {
    try server.start()
} catch PerfectError.networkError(let error, let message) {
    Log.error(message: "Error: \(error), \(message)")
}


---------------------------------

물론 이 외에도 정말 많은 응용 방법과 라우트 하는 방법, 더 다양한 기능들이 있지만 모두 설명할 수 없으므로 정말 간단하게 감을 잡을 수 있는 정도만 해봤습니다. 차후에 간단한 프로젝트를 통해서 필요한 부분은 조금씩 더 설명하려고 합니다.


이정도 만들어 봤으면 대강 핑퐁은 해봤으니, 작은 미니 프로젝트 한 번 시작해 봐도 되지 않을까요?

다음 번에는 미니 프로젝트를 시작해볼 예정입니다~


다음에 또 만나요! :D


참고문서

* PerfectDocs - Routing

* PerfectDocs - HTTPResponse

* PerfectDocs - JSON Converter



by yagom

facebook : http://www.facebook.com/yagomSoft

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

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

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 




저작자 표시 비영리 변경 금지
신고

'Swift > Perfect' 카테고리의 다른 글

사진 게시판 API 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (2) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom


Perfect 시작하기

1. Perfect 패키지 설치
2. 서버 실행해보기



지난 번에 우분투에 스위프트를 설치해보았는데요, 

2017/04/03 - [Swift/Perfect] - 우분투(Ubuntu)에 스위프트 설치하기

이번엔 우분투에 퍼펙트를 설치 해볼 요량입니다. 

맥의 터미널에서도 동일(하거나 유사)한 명령어로 진행이 가능하니 맥에서 진행하셔도 무방합니다 :)


* 참고 *

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

Swift 최신 버전 확인

Perfect 최신 버전 확인


리눅스 패키지 설치

우분투에서 Perfect를 사용하려면 OpenSSL, libssl-dev, uuid-dev가 필요합니다.
설치해줍니다. (맥에서는 설치할 필요가 없습니다.)

> sudo apt-get install openssl libssl-dev uuid-dev


프로젝트 폴더 생성

리눅스 패키지 설치를 완료하면 Perfect 프로젝트를 시작하고 싶은 위치에 프로젝트 폴더를 생성합니다.
> mkdir FirstPerfect

그리고 그 폴더 안으로 이동해주세요.
> cd FirstPerfect


Perfect 패키지 설치

Swift 3.0 이상부터는 Swift Package Manager를 통해 여러 패키지(라이브러리라고 생각하시면 편할 듯 합니다)의 의존성관리를 할 수 있습니다. 

스위프트 패키지 매니저를 사용하기 위해 초기화 해줍니다. --type excutable 옵션은 빌드 후 실행가능한 실행파일을 생성해달라는 옵션입니다.
> swift package init --type executable

swift package init 명령어를 실행하면 폴더에 Package.swift 파일도 함께 생성이 되었을텐데요, Package.swift 파일을 열어서 Perfect 패키지 의존성을 추가합니다.

> vi Package.swift


Package.swift 파일에 아래 코드를 작성합니다.

import PackageDescription

let package = Package(
    name: "FirstPerfect",
    dependencies: [
        .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2)
	]
)


저장하고 나와서 패키지를 설치합니다.
> swift package update

만약에 맥에서 Xcode 프로젝트를 생성해주고 싶다면
> swift package generate-xcodeproj
해주시면 해당 폴더에 Xcode 프로젝트가 생성됩니다. 그러면 이후 코딩을 Xcode 프로젝트로 진행할 수 있습니다.


Perfect 프로젝트 실행

프로젝트 폴더의 Source/main.swift 파일을 열어봅니다.
> vi Source/main.swift

코드를 입력해봅니다.

import PerfectLib import PerfectHTTP import PerfectHTTPServer let server = HTTPServer() server.serverPort = 8080 do { try server.start() } catch PerfectError.networkError(let error, let message) { Log.error(message: "Error: \(error), \(message)") }


저장을 하시구요, 이제 빌드를 하고 실행을 해볼 차례입니다.
> swift build 
> ./.build/debug/FirstPerfect

만약 Xcode를 사용하고 있다면 타겟을 아래와 같이 변경 후 실행해 보세요.

실행하면 아래와 같은 정보가 출력됩니다.

[INFO] Starting HTTP server  on 0.0.0.0:8080

웹 브라우저에서 8080 포트로 접속해보시면 아래와 같은 메세지를 볼 수 있습니다.


서버 애플리케이션이 정상적으로 동작하고 있는 것입니다!


이제 처음으로 실행해 보았으니 이것저것 한 번 해봐야겠지요? 
다음 번에는 간단한 라우팅을 해볼게요~ 다음에 또 만나요! :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 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (2) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom


Ubuntu에 Swift 설치하기

1. 우분투 서버에 스위프트(Swift) 언어 라이브러리 설치

2. 간단한 스위프트 프로그램 작성/실행


안녕하세요 야곰입니다.


애플의 새로운 언어 스위프트는 맥 운영체제 외에도 리눅스(우분투)에서 사용할 수 있습니다.

우분투에서 스위프트를 사용하기 위해 설치하고, 스위프트 프로그램을 간단히 작성해봅니다.


# 사전 준비지식


본 포스팅을 함께 해보기 위해 필요한 기초 사전지식입니다.

  • vi 사용법
  • 기초 리눅스 명령어(옵션)
  • ssh 사용법(옵션)


# 사전 준비


우분투(Ubuntu Server 16.04.2 LTS 64bit) 에 스위프트를 설치해 보겠습니다.


우분투 설치방법은 아래글을 참고하세요.


또, 미래에 이 글을 보고계실 여러분께서 현재 스위프트가 어떤 리눅스 버전에서 지원하는지, 스위프트 최신 버전이 몇인지 먼저 체크하시기 바랍니다.


[여기서 체크]



2017년 3월 현재 

  • 지원 리눅스 버전 : Ubuntu 16.04, Ubuntu 14.04 [64bit]
  • 최신 스위프트 버전 : 3.0.2


만약 가상머신을 사용하여 설치한 분께서는 혹시모를 꼬임에 대비하여 작업시작 전 스냅샷을 남겨두시길 권합니다


저는 mac 터미널에서 우분투 서버로 ssh 접속을 하여 작업을 진행하였습니다.



# 스위프트 설치


필요 패키지 설치

의존성 관리도구를 통해 필요한 패키지(clang, libicu-dev)를 먼저 설치합니다.

아래 명령어를 통해 설치할 수 있습니다.


sudo apt-get install clang libicu-dev


암호를 입력하면 패키지가 설치가 됩니다. 설치 확인 물음에서 Y를 입력해주면 됩니다.




다음으로 스위프트 소스를 다운로드 받습니다.


이건 옵션사항인데, 저는 리눅스에서 바로 스위프트 패키지를 다운로드 받고 싶어서 wget을 사용합니다.

혹시 wget이 설치되어 있지 않을 수 있으니 설치해봅니다.


sudo apt-get install wget



저는 이미 최신버전이 설치되어있다고 나오네요~


스위프트 패키지 설치

먼저 스위프트 패키지를 다운로드 할 경로로 이동합니다. (현재 폴더에서 다운로드 받으려면 이동하지 않아도 됩니다)


mkdir ~/swift_package
cd ~/swift_package



현재 Swift 3.0.2 버전의 소스는 [https://swift.org/builds/swift-3.0.2-release/ubuntu1604/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz] 주소로 배포되어 있는데, 버전에 따라 주소가 달라질 수 있습니다. 애플의 릴리즈 링크를 참고하세요.


아래 명령어를 통해 다운로드 받습니다. (만약 wget을 설치하지 않았다면 다른 방법을 통해 리눅스로 파일을 전달하면 됩니다)


wget https://swift.org/builds/swift-3.0.2-release/ubuntu1604/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz





처음으로 Swift를 설치한다면 다운로드 후에 GPG 키를 추가해주어야 합니다. 이미 다운로드 받고 Swift를 사용한 적이 있다면 다음 단계로 넘어가도 됩니다.


wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -





아까 다운로드한 스위프트 패키지의 압축을 풀어줍니다. 다운로드한 버전에 따라 파일명은 다를 수 있습니다. 자신이 다운로드한 파일을 확인하고 압축을 해제해주세요.


tar xzf swift-3.0.2-RELEASE-ubuntu16.04.tar.gz





압축을 해제하면 폴더가 생성되는데 이 폴더를 /opt 폴더로 이동시킬거예요. 이동시키면서 폴더명도 조금 간단하게 swift-3.0.2로 바꿔줍니다.


sudo mv swift-3.0.2-RELEASE-ubuntu16.04 /opt/swift-3.0.2


/opt 폴더로 이동하여 제대로 이동이 되었는지 확인합니다.


cd /opt
ls




이제 swift 명령어를 사용하기 위해 환경변수에 추가합니다.


export PATH=/opt/swift-3.0.2/usr/bin:"${PATH}"


swift 명령어를 설치된 스위프트 버전을 확인해봅니다.


swift --version




그런데 서버를 재시작 하고나면 swift 명령어를 사용할 수 없습니다. export 환경변수를 다시 등록해줘야 하기 때문인데요, 매우 귀찮으므로 재시작 되어도 문제없도록 환경변수를 등록해둡니다.


sudo vi /etc/profile




맨 아랫줄에 


export PATH=/opt/swift-3.0.2/usr/bin:"${PATH}"
를 추가해줍니다.



이제 서버를 재시작해도 문제없이 swift 명령어를 사용할 수 있습니다.



# 스위프트 작성/실행


이제 스위프트 REPL을 사용하기 위해 swift 명령어를 입력해 봅니다.




앗차 그런데 이게 무슨일입니까? 실행이 되질 않아요!! 파이썬이 없다네요... 망할... 설치해주어야죠?


sudo apt-get install libpython-dev





설치가 끝나고 다시 swift 명령어를 입력하면 REPL이 실행됩니다.

간단히 코드를 입력하여 동작하는지도 확인해봅니다.




간단한 스위프트 파일을 생성하여 실행도 해봅니다.


vi test.swift


swift test.swift





이렇게 우분투에 스위프트를 설치하고 간단한 프로그램도 작성해 보았습니다.


이제 스위프트를 설치해 봤으니, 스위프트를 가지고 서버를 만들어 볼까요?

후헿


기대됩니다~ 곧 스위프트로 API 서버를 만들어 봅시다요!


by yagom

facebook : https://facebook.com/yagomsoft

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

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

RSS Feed 받기   



저작자 표시 비영리 변경 금지
신고

'Swift > Perfect' 카테고리의 다른 글

사진 게시판 API 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (2) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom


티스토리 툴바