이번에는 Swift로 작성된 웹 프레임워크인 Vapor를 이용하여 서버를 구성하고 Heroku를 통해 배포하는 과정을 다루어 보겠습니다. 본 포스팅은 macOS를 기준으로 작성되었습니다.
Vapor를 이용하기 위해서는 다음과 같은 요구사항이 만족되어야 합니다.
Xcode가 설치되어 있지 않으시다면 App Store를 통해 설치하시면 되고, 이미 설치되어 있으신 경우에는 Xcode를 실행하신 후 화면 상단의 메뉴바에서 Xcode → About Xcode를 선택하셔서 버전을 확인하실 수 있습니다.
Swift 버전은 터미널에서 swift --version
명령을 통해 확인하실 수 있습니다.
// 출력 결과
Apple Swift version 5.4.2 (swiftlang-1205.0.28.2 clang-1205.0.19.57)
Target: x86_64-apple-darwin20.5.0
Toolbox는 Homebrew를 통해 배포되고 있습니다. Homebrew 설치는 잘 알려져 있으니 생략하고 brew 명령을 통해 Toolbox를 설치해보겠습니다.
brew install vapor
설치 완료 후 잘 설치되었는지 확인하기 위해 아래 명령어를 입력해보세요.
vapor --help
이 섹션은 Vapor Toolbox를 이용해 새 Vapor 프로젝트를 만들고, 빌드하고 서버를 실행하는 내용을 다룹니다.
vapor --help
명령을 통해 살펴보았던 vapor new
명령을 통해 새 프로젝트를 생성하실 수 있습니다.
vapor new hello -n // 모든 설정을 no로 설정하고 새 프로젝트를 생성
vapor new hello // 설정사항을 사용자에게 질문하며 새 프로젝트를 생성
-n
플래그를 붙이지 않고 프로젝트를 생성하면 아래와 같은 사항들을 질문합니다.
모든 옵션을 no로 선택하고 프로젝트를 생성하면 아래와 내용이 나타나며 프로젝트 생성이 완료됩니다.
Generating project files
+ Package.swift
+ main.swift
+ configure.swift
+ routes.swift
+ .gitkeep
+ AppTests.swift
+ Dockerfile
+ docker-compose.yml
+ .gitignore
+ .dockerignore
Creating git repository
Adding first commit
Xcode를 통해 프로젝트 생성 시 만들어진 Package.swift
파일을 실행합니다. 실행 후 의존성 관리도구인 Swift Package Manager (SPM)을 통해 의존하고 있는 도구들 (의존성, dependencies)을 다운로드하기 시작할 것입니다. 작업이 완료되면 Build and run
과 Stop
버튼 우측에 있는 Set the activate scheme
버튼을 My mac
으로 설정하고 실행합니다.
실행이 완료되면 Xcode 하단부 콘솔에 아래와 같은 내용이 출력될 것입니다.
[ NOTICE ] Server starting on http://127.0.0.1:8080
아래 Localhost 페이지들을 방문해보시면 지정된 문구가 페이지에 출력될 것입니다.
Vapor의 폴더 구조는 SPM의 폴더 구조에 기반하여 아래와 같이 구성되어 있습니다.
.
├── Public
├── Sources
│ ├── App
│ │ ├── Controllers
│ │ ├── Migrations
│ │ ├── Models
│ │ ├── configure.swift
│ │ └── routes.swift
│ └── Run
│ └── main.swift
├── Tests
│ └── AppTests
└── Package.swift
이 폴더는 FileMiddleware
가 활성화된 경우 앱에서 제공하는 Images, style sheets, browser scripts와 같은 공용 파일을 가지고 있습니다. Vapor가 공용 파일을 서비스하려면 먼저 configure.swift
파일에서 FileMiddleware
를 활성화해야 합니다.
// Serves files from `Public/` directory
let fileMiddleware = FileMiddleware(
publicDirectory: app.directory.publicDirectory
)
app.middleware.use(fileMiddleware)
프로젝트의 Swift 소스 파일을 가지고 있는 폴더입니다. 최상단 폴더에는 SPM menifest로 선언되어 패키지 모듈을 반영하는 App
과 Run
폴더가 위치해 있습니다.
애플리케이션 로직이 들어가는 곳입니다.
컨트롤러에는 애플리케이션 로직을 그룹화하여 위치시키는 것이 좋습니다. 예를 들어, 요청을 수신하고 의도한 응답을 반환하는 기능을 가질 수 있습니다.
Fluent
를 사용할 경우 데이터베이스 마이그레이션이 위치하는 곳입니다.
Content
구조 또는 Fluent Model
들을 저장하기 좋은 장소입니다.
새롭게 생성된 Application
을 구성하기 위해 main.swift
가 호출하는 configure(_:)
메서드를 가진 파일입니다. routes, databases, providers 등과 같은 서비스를 등록하는 곳입니다.
Application
에 routes를 등록하기 위해 configure(_:)
말미 부근에서 호출되는 routes(_:)
메서드를 가진 파일입니다.
애플리케이션을 시작하고 실행하는 데 필요한 코드만 포함하고 있는 폴더입니다. 주요 실행 대상인 main.swift
가 위치하고 있습니다.
사용자가 구성한대로 Vapor Application
의 인스턴스를 생성하고 실행해주는 파일입니다.
Run과 같은 실행 대상이 아닌 Source
폴더에 대응되는 폴더입니다. 패키지를 테스트할 수 있도록 XCTest
모듈을 가지고 있습니다.
App
모듈에 대한 유닛 테스트 코드를 가진 폴더입니다.
SPM의 package manifest입니다.
Package.swift
의 내용과 구조를 설명하고 있습니다.
Xcode에서 프로젝트 실행 시 나타나는 Custom Working Directory 에러를 해결하는 방법을 설명하고 있습니다. 프로젝트의 root folder를 scheme의 run - options - Working Directory
옵션을 통해 custom working directory를 입력함으로써 에러를 해결할 수 있음을 소개하고 있습니다. 터미널에서 pwd
(print working directory) 명령을 통해서도 프로젝트의 root 위치를 얻을 수 있습니다.
에러 없이 깔끔해진 콘솔을 확인하실 수 있습니다.