Programing/Vapor

💧Vapor💧 MySQL DB에 연결하기

5주년 2020. 5. 8. 03:14

안녕하세요 5anniversary에요~!

 

이번 시간에는 저번 시간에 이어서 Vapor를 이용해 서버를 구축하기 위해서 MySQL DB에 연결해 볼 거예요~!

 

우선 MySQL을 사용하기 위해서 필요한 패키지를 받아줘야겠죠??

 

저희가 사용할 패키지는 fluent-mysql-driver 를 사용해 줄 거예요 Fluent에 대해서 알아보자면 

 

Fluent (vapor/fluent) is a type-safe, fast, and easy-to-use ORM framework built for Swift. It takes advantage of Swift's strong type system to provide an elegant foundation for building database integrations.

Fluent는 Swift를 위한 type-safe가 지원되고, 빠르고, 사용하기 쉬운 객체 관계 매핑을 지원해주는 프레임워크입니다. - 출처

 

라고 설명이 되어있네요!!

 

사용할 패키지를 알아봤으면 이제 한 번 패키지를 받아보도록 할까요??

 

import Vapor

let package = Package(
    name: "Hello", // 프로젝트 이름
    dependencies: [
        /// Any other dependencies ...
        .package(url: "https://github.com/vapor/fluent-mysql-driver.git",
                 from: "3.0.0"), // git 그리고 버전
    ],
    targets: [
        .target(name: "App", dependencies: ["FluentMySQL", ...]),
        .target(name: "Run", dependencies: ["App"]),
        .testTarget(name: "AppTests", dependencies: ["App"]),
    ]
)

Package.swift

 

이렇게 Package.swift 파일에 작성해준 이후 

 

터미널로 돌아가

vapor xcode -y

를 해주시면 바로 패키지를 받아온 프로젝트가 펼쳐지게 됩니다.

 

우선 간단한 유저 모델을 작성해주겠습니다.

 

import Vapor
import FluentMySQL

struct User {
    var id: Int?
    var name: String?
}

extension User: Content {}
extension User: Migration {}
extension User: MySQLModel {
    typealias Database = MySQLDatabase
}

User.swift

MySQL의 모델을 가지고 있으려면 id값은 기본 pk로 설정되어있어 건드리지 않는 편이 좋습니다.

 

또한, Content는 request를 다뤄줄 때 사용, Migration은 모델링을 해두면 해당 모델을 가지고 DB에 migration을 통해 자동 모델링을 해줄 때 사용되기 때문에 상속받아야 합니다. 

 

그다음 MySQL과 연결을 해줄 건데요

import FluentMySQL
import Vapor

public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    // Register providers first
    try services.register(FluentMySQLProvider())

	...code...
    
	var databases = DatabasesConfig()
    let hostname = "localhost"
    let username = "디비 사용자 명"
    let password = "디비 비밀번호"
    let databaseName = "접속 디비 이름"
    let databaseConfig = MySQLDatabaseConfig(
      hostname: hostname,
      port: 3306, // 기본 디비 포트가 3306 일거입니다.
      username: username,
      password: password,
      database: databaseName)

    let database = MySQLDatabase(config: databaseConfig)
    databases.add(database: database, as: .mysql)
    services.register(databases)

    var migrations = MigrationConfig()
    migrations.add(model: User.self, database: DatabaseIdentifier<MySQLDatabase>.mysql)
    services.register(migrations)
}

configure.swift

 

configure.swift를 통해 DB설정을 해줍니다.

 

이다음 실행을 해주시면

원하는 모델대로 테이블이 생성된 것을 볼 수 있습니다.

 

테이블에

유저를 추가시켜준 다음

import Vapor

public func routes(_ router: Router) throws {

	// ...code...

    router.get("users") { req in
        return User.query(on: req).all()
    }

}

routes.swift

 

라우터를 추가시켜준다음 실행시켜주시면

와 같은 결과를 얻어볼 수 있습니다.

 

git link 에서 여기까지 해놓은 코드의 링크를 첨부 합니다.

 

그리고, 다음 시간에는 오늘 결과로 좀 더 나아가 heroku에 배포도 진행해보도록 하겠습니다.