CRUD
Create (생성)
Read (읽기)
Update (갱신)
Delete (삭제)
를 묶어서 일컫는 말이다.
Controller란?
Controller는 요청(CRUD)에 대한 응답을 반환하는 메소드를 그룹화 하기 좋은 수단이다.
Controller 만들기
1️⃣ Controllers 폴더에 <SchemaName>Controller.swift 파일을 생성한다.
2️⃣ RouteCollection 프로토콜을 채택하는 구조체를 만든다.
struct MovieController: RouteCollection {
func boot(routes: Vapor.RoutesBuilder) throws { }
}
RouteCollection 프로토콜은 boot(routes:) 메소드 구현을 요구한다. boot(routes:) 메소드는 CRUD 메소드를 다 구현한 후에 구현하겠다.
3️⃣ Create 메소드 구현
HTTP POST 메소드에 대응하는 Create(생성) 메소드를 구현한다.
func create(req: Request) throws -> EventLoopFuture<Movie> {
let exist = try req.content.decode(Movie.self)
return exist.save(on: req.db).map{ (result) -> Movie in
return exist }
}
✅ save(on:) 메소드는 create(on:) 메소드로 대체할 수 있다.
4️⃣ Read 메소드 구현
HTTP GET 메소드에 대응하는 Read(읽기) 메소드를 구현한다.
func read(req: Request) throws -> EventLoopFuture<[Movie]> {
return Movie.query(on: req.db).all()
}
5️⃣ Update 메소드 구현
HTTP PUT, PATCH 메소드에 대응하는 Update(갱신) 메소드를 구현한다.
func update(req: Request) throws -> EventLoopFuture<Movie> {
let exist = try req.content.decode(Movie.self)
return Movie.find(exist.id, on: req.db)
.unwrap(or: Abort(.notFound))
.flatMap { item in
let title = exist.title
let genre = exist.genre
let actor = exist.actor
item.title = title
item.genre = genre
item.actor = actor
return item.update(on: req.db).map { return item }
}
}
요청 값으로부터 id를 식별하고 DB에서 해당 id를 기준으로 인스턴스를 찾아 Update 한다.
6️⃣ Delete 메소드 구현
HTTP DELETE 메소드에 대응하는 Delete(삭제) 메소드를 구현한다.
func delete(req: Request) throws -> EventLoopFuture<HTTPStatus> {
let exist = try req.content.decode(Movie.self)
return Movie.find(exist.id, on: req.db)
.unwrap(or: Abort(.notFound))
.flatMap { $0.delete(on: req.db) }
.transform(to: .ok)
}
7️⃣ 등록(Register)하기
위의 과정을 모두 마치면 정상적으로 Controller와 CRUD를 구현한 것이다. 생성한 Controller를 이용하려면 routes.swift 파일의 routes(_:) 메소드에 등록하여 사용한다.
func routes(_ app: Application) throws {
try app.register(collection: MovieController())
}
CRUD 작동 확인
1️⃣ Create
http://127.0.0.1:8080/movies에 생성할 데이터를 JSON으로 작성하여 POST로 요청한다.
응답의 Status가 200번대임을 확인하고, 서버가 요청한대로 응답했는지 확인한다.
데이터베이스에 요청이 정상적으로 처리되었는지 확인한다.
2️⃣ Read
http://127.0.0.1:8080/movies/param에 GET로 요청한다.
응답의 Status가 200번대임을 확인하고, 서버가 요청한대로 응답했는지 확인한다.
3️⃣ Update
http://127.0.0.1:8080/movies에 업데이트할 데이터를 JSON 데이터를 작성하여POST로 요청한다.
응답의 Status가 200번대임을 확인하고, 서버가 요청한대로 응답했는지 확인한다.
데이터베이스에 요청이 정상적으로 처리되었는지 확인한다.
4️⃣ Delete
http://127.0.0.1:8080/movies에 삭제할 데이터를 JSON으로 작성하여 DELETE로 요청한다.
응답의 Status가 200번대임을 확인하고, 서버가 요청한대로 응답했는지 확인한다.
데이터베이스에 요청이 정상적으로 처리되었는지 확인한다.
Update와 Delete시 모든 데이터를 입력해야 메소드가 정상적으로 작동했다.
모든 데이터를 입력하지 않고 특정 내용을 제외하고 응답을 요청하게 하려면 어떻게 해야할까?
다음 글은 이와 관련 된 DTO에 대해 다루어보겠다.
'iOS > Vapor' 카테고리의 다른 글
[Vapor/Database] Fluent Migration (0) | 2023.10.20 |
---|---|
[Vapor/DataBase] Fluent 모델 (0) | 2023.10.19 |
[Vapor/Database] PostgreSQL 시작하기 (1) | 2023.10.18 |
[Vapor/Server] Fluent란? (0) | 2023.10.18 |
[Vapor/Server] Vapor 시작하기 (1) | 2023.10.16 |