Swift 서버 사이드 프레임워크 Vapor, Perfect, Kitura

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 뚭니
      참가자
      • 글작성 : 9
      • 답글작성 : 17

      Swift 서버 사이드 프레임워크 Vapor, Perfect, Kitura 로 서버 생성하기

      2020.03.14

      ‘swift 서버 사이드’라고 구글에 검색하면 2017년도에 야곰님께서 작성하신 비교 분석 글이 제일 상단에 올라오는데,

      각 프레임워크마다 어떤 형태로 생성이 되는지 궁금하여 hello world 서버를 생성해보기로 했다.

       

      Contents

       

      0 단계  Swift 의 서버 사이드 프레임워크

      Swift 서버 사이드 프레임워크에는 Vapor, Perfect, Kitura, Zewo, SwiftExpress 등이 있는데, 이 중에서 SwiftExpress 는 다루지 않겠다. 안 유명해서

      1. 프레임워크 비교 분석

      2020.03.14 00:57 기준

      스크린샷 2020-03-31 오후 3 29 41

      코드 퀄리티는 Awesome iOS 를 참고했다.
      평가는 Lumnify 에서 한 것으로 Level 1 이 가장 낮은 퀄리티, Level 5 이 가장 높은 퀄리티의 코드라고 한다.
      * 초반에는 Perfect 가 시작이 빨랐던 만큼, 가장 많은 DBMS 를 지원하면서 스타도 가장 많았지만 요즘에는 Vapor 가 대세인 듯 하다.
      * Vapor가 다른 Swift 웹프레임워크보다 우월한 것은 아니지만 처음 사용법을 익히는 것이 쉽다고 한다. 한번 직접 사용해보겠다.

       

      1 단계 Vapor 로 서버 만들기

      1. Vapor 설치 및 프로젝트 생성
      1. vapor는 Swift 4.1+ 를 요구하기 때문에 터미널에 swift –version 을 쳐서 버전을 확인한다. ~~(나의 버전은 5.1.2 였다.)~~
      2. vapor 패키지 저장소를 추가하기 위해 brew tap vapor/tap 명령어를 입력한다.
      3. vapor 패키지를 설치하기 위해 brew install vapor/tap/vapor 명령어를 입력한다.

      스크린샷 2020-03-14 오전 2 01 18 설치가 정상적으로 완료되었다.

      1. 작업할 폴더를 생성하기 위해 vapor new [Project Name] 명령어를 입력한다.
      2. 작업 폴더로 이동해서 cd [Project Name] vapor프로젝트 실행하려면 vapor xcode 명령어를 입력한다.

      스크린샷 2020-03-14 오전 2 06 34

      • ISSUE #1 Vapor 설치 과정 중 brew 명령어 없다는 에러
      • brew 명령어를 사용하려면 그 전에 Homebrew 가 맥에 설치되어있어야 한다.
      • 그렇지 않다면 아래 명령어를 터미널에 입력해 Homebrew 를 설치한다.
      /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
      

       

      • ISSUE #2 Vapor Xcode 프로젝트 생성이 안되는 에러

      스크린샷 2020-03-14 오전 2 21 03

      • 만약 vapor xcode 명령어를 입력해서 xcode 파일이 생성되었다는 메시지가 뜨는데도 열리지 않는다면 아래 명령어를 입력한다. 문제가 해결될 것이다.
      sudo xcode-select -s /Applications/Xcode.app
      vapor build
      vapor xcode
      
      1. 서버 동작시키고 “Hello, world!” 띄우기
      2. 서버를 동작시키는 방법에는 터미널 창에 vapor run 명령어를 입력하는 방법과 Xcode 상에서 Run 스킴으로 바꾸고 빌드하는 방법이 있다.

      [http://localhost:8080 접속화면]
      스크린샷 2020-03-14 오전 2 33 15

      [첫번째 방법]
      스크린샷 2020-03-14 오전 2 27 04

      [두번째 방법]
      스크린샷 2020-03-14 오전 2 23 07 스크린샷 2020-03-14 오전 2 23 41

      1. Project > Sources > routes.swift 파일에 가면 get 메소드를 return 하는 값이 보인다. 현재는 http://localhost:8080/hello 경로로 이동해야 “Hello, world!” 가 출력되도록 설정되어있다.
      import Vapor
      
      /// Register your application's routes here.
      public func routes(_ router: Router) throws {
      // Basic "It works" example
      router.get { req in
      return "It works!"
      }
      
      // Basic "Hello, world!" example
      router.get("hello") { req in
      return "Hello, world!"
      }
      
      // Example of configuring a controller
      let todoController = TodoController()
      router.get("todos", use: todoController.index)
      router.post("todos", use: todoController.create)
      router.delete("todos", Todo.parameter, use: todoController.delete)
      }
      
      1. baseURL 로 접속하자마자 “Hello, world!” 가 뜨도록 코드를 변경하고 샘플코드는 삭제했다.
      import Vapor
      
      /// Register your application's routes here.
      public func routes(_ router: Router) throws {
      // Basic "It works" example
      router.get { req in
      return "Hello, world!"
      }
      }
      

      스크린샷 2020-03-14 오전 2 36 47

       

      2 단계 Perfect 로 서버 만들기

      1. Perfect 프로젝트 생성
      1. perfect 는 Swift 3.0.1+ 를 요구하기 때문에 터미널에 swift –version 을 쳐서 버전을 확인한다.
      2. Terminal을 열고 mkdir [Project Name] 명령어를 입력해 생성하려는 프로젝트 명으로 폴더를 만듭니다.
      3. 작업 폴더로 이동해서 cd [Project Name] 패키지를 초기화합니다. swift package init –type executable

      스크린샷 2020-03-14 오전 2 50 42

       

      2. Perfect 설치
      1. Package.swift 안의 Dependencies에 perfect 추가한다.

      [Package.swift]
      
      ...
      
      dependencies: [
      // Dependencies declare other packages that this package depends on.
      // .package(url: /* package url */, from: "1.0.0"),
      // 아래 Perfect 패키지코드를 추가합니다.
      .package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", from: "3.0.0")
      ],
      
      ...
      
      • 구글링 해보면 Perfect package 설치하는 dependency 작성법이 아래와 같이 많이 나올텐데 2018. 1. 2 기준 버전이 바뀌면서 명령어가 에러를 발생시킨다.
      • 정확한 설치법을 다음 링크에서 참고하였다. https://github.com/iexploits/Perfect-Init
      dependencies: [
      .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2)
      ]
      
      1. 저장하고 나와서 터미널 창에다가 swift package update 명령어를 입력한다.

      스크린샷 2020-03-14 오전 3 09 18

      1. Sources > [Project Name] > main.swift 파일을 열어 다음과 같이 작성한다.
      [./Sources/[Project Name]/main.swift]
      
      import PerfectLib
      import PerfectHTTP
      import PerfectHTTPServer
      import Foundation
      
      // server 상수 선언
      let server = HTTPServer()
      
      // server 속성 정의. serverPort : 포트 번호 , documentRoot : web 진입디렉토리
      server.serverPort = 8080
      server.documentRoot = "./src"
      
      // 해당 git 에는 라우팅과 핸들러 예제 또한 정의되어있습니다.
      
      // server 시작
      do {
      try server.start()
      } catch PerfectError.networkError(let error, let message) {
      Log.error(message: "Error: \(error), \(message)")
      }
      
      1. 아까 사용했던 swift package generate-xcodeproj 명령어를 입력하여 xcode 프로젝트를 재생성하고 빌드한다.
      > swift build
      > ./.build/debug/[프로젝트 명]
      [INFO] Starting HTTP server on 0.0.0.0:8080
      

       

      3 단계 Kitura 로 서버 만들기

      1. Kitura 프로젝트 생성 및 설치
      2. 폴더를 생성하고 package 매니저를 만드는 과정 모두 Perfect 패키지를 설치하는 방법과 동일합니다.
      3. Package.swift 안의 Dependencies에 kitura를 추가한다.
      [Package.swift]
      
      ...
      
      dependencies: [
      // Dependencies declare other packages that this package depends on.
      // .package(url: /* package url */, from: "1.0.0"),
      // 아래 Kitura 패키지코드를 추가합니다.
      .package(url: "https://github.com/IBM-Swift/Kitura.git", from: "2.6.0")
      ],
      
      ...
      
      dependencies: [
      .Package(url: “https://github.com/IBM-Swift/Kitura.git", majorVersion:1)
      .Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 7)
      ]
      
      1. 저장하고 나와서 터미널 창에다가 swift package update 명령어를 입력한다.

      스크린샷 2020-03-14 오전 4 40 05

      1. Sources > [Project Name] > main.swift 파일을 열어 다음과 같이 작성한다.
      import Kitura
      
      // Create a new router
      let router = Router()
      
      // Handle HTTP GET requests to /
      router.get("/") {
      request, response, next in
      response.send("Hello, World!")
      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()
      
      1. swift build 명령어로 컴파일하고 실행시킨다.

       

      애로사항

      Perfect 와 Kitura 는 swift build 명령어를 입력했을 때 타겟을 제대로 import 하지 못해 서버 생성에 어려움이 있었다.

      결국 제대로 생성된 것은 Vapor 뿐..

       

      Perfect Error Message


      warning: dependency 'PerfectHTTPServer' is not used by any target <unknown>:0: error: PCH was compiled with module cache path '/Users/ttub_nii/HelloPerfect/.build/x86_64-apple-macosx/debug/ModuleCache/32OB1KJ0M0EHM', but the path is currently '/Users/ttub_nii/Documents/GitHub/Study-ttub/HelloPerfect/.build/x86_64-apple-macosx/debug/ModuleCache/32OB1KJ0M0EHM' <unknown>:0: error: missing required module 'SwiftShims'

       

      Kitura Error Message


      warning: dependency 'Kitura' is not used by any target /Users/ttub_nii/Documents/GitHub/Study-ttub/HelloKitura/Sources/HelloKitura/main.swift:1:8: error: no such module 'Kitura'
      • 이 게시글은 뚭니에 의해 4 years, 8 months 전에 수정됐습니다.
      • 이 게시글은 뚭니에 의해 4 years, 8 months 전에 수정됐습니다.
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      크으… 매 번 양질의 퀄리티에 감탄합니다! 👏

      Kitura나 Perfect는 스위프트 패키지 매니저를 통해 배포하고 Vapor는 Home brew를 통해서 배포하는군요.
      스위프트 패키지 매니저가 아직 부실해서 오류가 나는건지 어쩐건지 모르겠네요…^^;
      저도 기회되면 Vapor 한 번 써봐야겠어요
      저도 가르쳐주세요 ㅎㅎ

      Zewo는 시도해보지 않았나요? 아직 기능이 좀 부족한가요? ‘ㅁ’

      • 이 답변은 야곰에 의해 4 years, 8 months 전에 수정됐습니다. 이유: 태그추가
      • 뚭니
        참가자
        • 글작성 : 9
        • 답글작성 : 17

        매번 부족한 TIL 글을 읽고 답글 남겨주시는 노고에 감사드립니다.

        제가 야곰님께 Vapor 를 알려드릴 실력은 아니지만 앞으로 더 사용해보고 친숙해져보도록 하겠습니다. ㅎㅎ

        Node.js 의 Express 프레임워크와 비슷해서 Express 로 웹 개발을 하셨던 분들께는 꽤 익숙할 것이라고 하더군요. (블로그 후기에서 보았습니다.)

         

        Zewo 역시 스위프트 패키지 매니저로 배포합니다!

        사용해보았으나 18년도 4월 13일에 release한 버전이 있고 그 이후로 아직까지 업데이트가 이뤄지지 않아 Swift 4.0. 버전까지만 호환이 되는 것 같습니다.

        Swift 5 지원이 안되고 사용 및 설치 방법에 대해 Zewo 깃헙이나 홈페이지에서도 별다른 설명이 없어 조금 어려운 점들이 있었습니다.

        Zewo 깃헙에서 패키지 소스코드를 다운받아 설치해보았는데 에러사항이 많아 글로 다듬어서 포스팅하지 못하였습니다.

         

        Zewo 에서는 당사 프레임워크의 장점에 대해 Go 언어 스타일의 동시성과 동기식 API를 지원하여 더 이상의 콜백 지옥을 해결할 수 있다고 하는데요,

        개인적으로는 서버 사이드 프레임워크들 중 가장 아기지만 코드 퀄리티에 무척 신경을 많이 쓴 것 같아 최신 업데이트가 된다면 사용해보고 싶습니다.

         

        혹시 궁금하실 것 같아 소스 링크를 첨부하겠습니다. https://github.com/Zewo/Zewo/releases

        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 579

          그렇군요! 자세한 답변 고맙습니다 🙂

          스위프트 서버 아직 갈길이 멀죠! ㅎㅎ

          우리가 많이 써보고 피드백을 줘야 빨리 발전할 것 같아요 ㅎ

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom