안녕하세요 후르륵짭짭 입니다.
이번에는 저번에 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/
이제 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/
theswiftdev.com/get-started-with-the-fluent-orm-framework-in-vapor-4/
blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220847310053
yongbeomkim.github.io/sql/psql-01-startup/
postgresql.kr/docs/9.4/sql-dropschema.html
(public schema 테이블 접근 방법 ) : stackoverflow.com/questions/15238034/why-psql-cant-find-relation-name-for-existing-table
소스 코드 :
github.com/HururuekChapChap/Xcode_TestProj/tree/master/Vapor/VaporTutorial/VaporTutorial/Sources/App
'Server > Vapor - ServerSide' 카테고리의 다른 글
Vapor) Heroku를 사용해서 웹 사이트를 만들어보자 (0) | 2020.10.26 |
---|---|
Vapor ) Vapor과 PostgreSQL을 이용해서 READ를 구현하자! (0) | 2020.10.16 |
Vapor ) Vapor와 Leaf로 웹 사이트를 만들어보자 2부 (1) | 2020.10.12 |
Vapor ) Vapor와 Leaf로 웹 사이트 만들어보자 1부 (0) | 2020.10.12 |
Vapor ) Vapor - Swift의 ServerSide 언어 (0) | 2020.10.08 |
댓글