본문 바로가기
Server/Vapor - ServerSide

Vapor ) Postgresql을 사용해서 DataBase를 구축하자!

by 후르륵짭짭 2020. 10. 13.
728x90
반응형

안녕하세요 후르륵짭짭 입니다.

이번에는 저번에 Leaf로 웹 사이트를 구축하는 것에서 조금 벗어나서

서버의 데이터 베이스를 구축하는 방법에 대해 알아보도록 하겠습니다.

 

일단 Vapor에서 데이터베이스를 PostgreSql / MySql / SQLite 등 여러가지를 지원 합니다.

하지만 권장하는게 객체지향형 데이터 베이스를 권장해서 PostgreSql을 사용했습니다.

(객체지향형 데이터베이스는 처음이라,,, 많이 고생했습니다 ㅠㅠ)

 

www.youtube.com/watch?v=lPiJmh0jM_A

이 유튜버를 통해 기초를 다졌습니다.

그럼 바로 시작해보도록 하겠습니다.

 

** PostgreSql 설치 **

일단 시작에 앞서 PostgreSql을 다운 받아줘야합니다.

 brew install postgresql

터미널에 위의 명령을 적어주세요!

그리고 설치가 완료 되면 아래 명령을 쳐서 실행 시켜줍니다!

pg_ctl -D /usr/local/var/postgres start

//brew 환경
brew services start postgresql

// 재실행
brew services restart postgresql

이렇게 되면 됩니다!!.

 

** PostgreSql 기본 문법 **

psql postgres -> PostgreSql 접속

postgres=# \l -> 모든 데이터베이스 조회

postgres=# \c (데이터베이스) -> ()해당 데이터베이스로 이동

\q -> PostgreSql 접속 해제

template1=# create database test1; -> 데이터베이스 생성

 

** Xcode에 Postgresql 의존성 추가 **

이렇게 의존성을 추가 해줍니다!

더욱 자세한 내용은 Vapor 공식 자료에 있습니다!!! (한국에는 큰 자료가 없기 때문에,,,, 영어 공부좀 열심히 해야겠습니다.)

docs.vapor.codes/4.0/fluent/overview/

 

Vapor: Fluent → Overview

Fluent Fluent is an ORM framework for Swift. It takes advantage of Swift's strong type system to provide an easy-to-use interface for your database. Using Fluent centers around the creation of model types which represent data structures in your database. T

docs.vapor.codes

 

이제 Configure.swift 파일로 이동 하고 아래 코드를 추가해주세요!

 //configure postgresql - 데이터베이스 등록
 
    app.databases.use(.postgres(hostname: "localhost",
    					username: "Postgresql에 Owner 이름을 추가 해주세요", 
                        password: "", 
                        database: "데이터 베이스 이름"), as: .psql)

이렇게 넣어줍니다!!

그리고 Xcode를 종류 하고 Vapor Build를 해줍니다!!!

 

** 모델 생성 **

PostgreSql의 장점은 Sql 구문을 작성 할 필요가 없다는 것 입니다.

그런데 객체지향형 데이터 베이스이기 때문에 Model이 Struct가 아니라 Class로 되어 있어야 합니다.

그리고 객체지향형 데이터베이스 구조이기 때문에 Model이라는 프로토콜을 상속 받고 

JSON 타입이기 때문에 Content로 Codable을 해줍니다.

// 모델의 이름이 될 것 입니다. 즉, 테이블 이름이라 생각하시면 됩니다.
static let schema: String = "testSchema"
//속성의 고유 아이디가 됩니다. 이렇게 하면 자동생성이 되고 탐색할 때 이 id로 탐색하게 됩니다.
@ID(key: .id)
var id : UUID? 
// UUID를 보면 아 고유 아이디가 되는 것을 알수 있고 optional 타입이기 때문에 존재 안할 수도 있습니다.
//우리가 저장할 속성입니다.
@Field(key: "name")
var name : String
init(){}

//초기화 과정 필수 입니다!
init(id : UUID? = nil , name : String, job : String) {
        self.id = id
        self.name = name
        self.job = job
}

 

이렇게 Model을 구성해줍니다!

하지만 이렇게 구성한다고 테이블이 생성이 되는 것이 아닙니다!

Migration (이주) 를 통해서 이제 실제 데이터 베이스에 변환해서 넣어줘야합니다.

그게 Migration이라 하는 것 입니다.

따라서 Migration 폴더를 생성해주고 아래와 같이 코드를 작성 해줍니다.

//Prepare는 Migration을 했을 때 생성하는 요소 입니다.
//즉 테이블을 초기에 구성하는 거라 생각 하면 편합니다.
func prepare(on database: Database) -> EventLoopFuture<Void> {
        database.schema("testSchema")
            .id()
            .field("name" , .string , .required)
            .field("job", .string) //추가한 요소
            .create()
    }
    
    
 //삭제하는 것
 func revert(on database: Database) -> EventLoopFuture<Void> {
        database.schema("testSchema").delete() 
 }
    

 

자 이제 이 모든 과정을 마쳤으면 configure.swift 파일로 돌아가서 아래와 같이 적어줍니다.

//테이블 추가
app.migrations.add(CreateTestModel())

위 코드를 적어주면서 Xcode가 실행 될 때, 자동으로 테이블을 생성하고 연결 시켜주게 됩니다!

 

그리고 터미널을 켜서 아래 명령어를 쳐줍니다!! 

 vapor run migrate

그러면 이제 PostgreSql에 테이블이 생성된 것을 확인 할 수 있습니다.

만약에 아래와 같은 오류가 발생했다면

Migrate Command: Prepare
[ ERROR ] role "postgres" does not exist (InitializeSessionUserId)
[ ERROR ] server: role "postgres" does not exist (InitializeSessionUserId)
Fatal error: Error raised at top level: server: role "postgres" does not exist (InitializeSessionUserId): file /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ErrorType.swift, line 200

configure.swift 파일 내부 코드 중 app.databases.use 에서 오류가 발생 한 것 입니다!!!

정상적으로 잘 됐으면 아래와 같이 나올 것 입니다.

vapor run migrate

[4/4] Linking Run
Migrate Command: Prepare
The following migration(s) will be prepared:
+ App.CreateTestModel on default
Would you like to continue?
y/n> y
Migration successful

 

이제 routes.swift 파일에 가서 아래와 같이 코드를 작어주시기 바랍니다.

 app.post("test"){ req -> EventLoopFuture<TestModel> in
        
        //decode로 json 파일을 해독한다.
        let exist = try req.content.decode(TestModel.self)
            
    	//그리고 Model을 상속 받고 있는 exist에서
        //create 함수를 호출해서 데이터 베이스를 추가 합니다.
        //그리고 map 과정을 통해 받은 것을 다시 반환 합니다.
        return exist.create(on: req.db).map { (result) -> TestModel in
            return exist
        }
        
        
    }

 

 app.get("testAll"){ req -> EventLoopFuture<[TestModel]> in
 		//TestModel 테이블에 존재하는 모든 정보를 가저오게 됩니다.
        return TestModel.query(on: req.db).all()
    }

 

최종 결과를 봐도 데이터가 잘 추가 된 것을 확인 할 수 있습니다!!

 

사실,,,, ORM도 처음이고 Vapor도 처음이였기 때문에,,, 아직 어려운게 너무 많습니다...

그래서 쫌 내용이 부실한 것이 많은데,,, 나중에 여유러울 때 더욱 자세하게 다뤄 보도록 하겠습니다.

다음은 Parent와 Child 등 내부에 내부를 넣는 방식을 공부 해보도록 하겠습니다.

 

참고 사이트 : 

docs.vapor.codes/4.0/fluent/overview/

 

Vapor: Fluent → Overview

Fluent Fluent is an ORM framework for Swift. It takes advantage of Swift's strong type system to provide an easy-to-use interface for your database. Using Fluent centers around the creation of model types which represent data structures in your database. T

docs.vapor.codes

theswiftdev.com/get-started-with-the-fluent-orm-framework-in-vapor-4/

 

Get started with the Fluent ORM framework in Vapor 4 - The.Swift.Dev.

Learn how to use the Fluent ORM framework. Migrations, schemas, relations powered by PostgreSQL, written in Swift.

theswiftdev.com

 

blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220847310053

 

89. [PostgreSQL] PostgreSQL 설치 및 사용 방법 정리 (리눅스 기준)

이번 포스트는 PostgreSQL을 사용하는 방법에 대해서 공부해봤다. 어쩌다 보니 연구실에서 PostgreS...

blog.naver.com

yongbeomkim.github.io/sql/psql-01-startup/ 

 

PostgreSQL 01 - 시작하기

sqlite3로 대충 버텨 왔지만 서비스를 구축하기 위해서는 DB를 운영을 해야하는현실에 직면해 있고,

yongbeomkim.github.io

postgresql.kr/docs/9.4/sql-dropschema.html

 

DROP SCHEMA

DROP SCHEMA 제목 DROP SCHEMA -- 스키마를 삭제한다 요약 DROP SCHEMA [ IF EXISTS ] 이름 [, ...] [ CASCADE | RESTRICT ] 설명 DROP SCHEMA 명령은 현재 데이터베이스에서 지정한 스키마를 삭제한다. 이 명령은 해당 스�

postgresql.kr

(public schema 테이블 접근 방법 ) : stackoverflow.com/questions/15238034/why-psql-cant-find-relation-name-for-existing-table

 

Why psql can't find relation name for existing table?

Here' my current state. Eonil=# \d+ List of relations Schema | Name | Type | Owner | Size | Description --------+------------+-------+-------+------------+---...

stackoverflow.com

 

소스 코드 : 

github.com/HururuekChapChap/Xcode_TestProj/tree/master/Vapor/VaporTutorial/VaporTutorial/Sources/App

 

HururuekChapChap/Xcode_TestProj

My Xcode Test Projects. Contribute to HururuekChapChap/Xcode_TestProj development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글