CRUD는 데이터 관리를 위한 기본적인 네 가지 작업을 나타내는 약어이다.
CRUD는 데이터 중심 애플리케이션(데이터베이스나 API 설계)의 기본 구조를 설계할 때 사용하는 개념인데,
예를 들어 데이터베이스의 레코드, 파일 시스템의 파일, 웹 애플리케이션의 사용자 데이터를 관리할 때 CRUD 작업을 수행한다고 한다.
CRUD는 데이터를 생성, 읽기, 수정, 삭제하는 기본 작업이 필요할 때 주로 사용된다.
데이터를 관리하는 시스템에서는 거의 필수적인 요소이기 때문에 다양한 상황에서 활용되고 하나 예를 들자면
모바일 애플리케이션이 있다.
모바일 앱에서도 CRUD는 거의 모든 데이터 관련 작업의 중심인데,
예를들어 소셜 미디어 앱의 게시글 관리를 한다고 한다면,
언제 CRUD를 사용하면 좋냐라고 생각한다면
데이터의 생성, 읽기, 수정, 삭제 작업이 필요한 경우이거나,
RESTful API를 설계하거나 데이터베이스를 설계할 때,
사용자와 상호작용하며 데이터를 관리하는 시스템이 필요한 경우 정도로 말할 수 있겠다.
CRUD는 데이터가 존재하는 모든 시스템에서 필수적이기 때문에,
프로그램의 뼈대를 이해하는 데 중요한 역할을 한다.
웹 애플리케이션에서는 CRUD 작업이 보통 HTTP 메서드와 연관된다
CRUD 작업 | HTTP 메서드 | 설명 |
---|---|---|
Create | POST | 새로운 데이터를 생성 |
Read | GET | 데이터를 조회 |
Update | PUT/PATCH | 데이터를 수정 |
Delete | DELETE | 데이터를 삭제 |
1. POST /users → 새로운 사용자 등록 (Create)
2. GET /users → 모든 사용자 조회 (Read)
3. GET /users/1 → ID가 1인 사용자 조회 (Read)
4. PUT /users/1 → ID가 1인 사용자 정보 수정 (Update)
5. DELETE /users/1 → ID가 1인 사용자 삭제 (Delete)
CRUD와 HTTP 메서드를 연결해서 알려주는 이유는 웹 개발에서 데이터 관리를 효율적으로 이해하고 설계하기 위해 두 개념이 밀접하게 연관되어 있기 때문이다.
간단히 말하면, CRUD는 데이터 관리 작업의 개념적 틀이고, HTTP 메서드는 이를 웹에서 구현하기 위한 기술적 수단이라는 말.
엄연히 둘의 역할은 다르다.
CRUC는 데이터를 어떻게 다룰지에 대한 개념적 정의이고 (추상적 개념)
HTTP 메서드는 웹 어플리케이션에서 CRUD를 구현하는 방법이다. (구체적 구현)
웹 어플리케이션에서 데이터를 다룰 때 이 두개를 연결지어 생각하면 데이터처리방식을 설계하기가 쉬워질 수 있다고 한다.
그래서 이걸 이해하게 된다면,
학생 정보를 관리하는 CRUD 예시를 가져왔다.
// 하나의 학생 정보를 담는 데이터 모델
struct Student {
var id: Int // id는 고유 식별자 역할을 함.
var name: String
var grade: Int
}
// 학생 목록을 관리하는 기능 제공
class StudentManager {
// 학생 데이터를 저장하는 배열이고 private으로 선언해서 외부에서 접근x
private var students: [Student] = []
// Create: 새로운 학생 추가
func addStudent(id: Int, name: String, grade: Int) {
let student = Student(id: id, name: name, grade: grade)
students.append(student)
}
// Read: 특정 학생 조회
// 반환값이 옵셔널타입인 이유는 학생이 존재하지 않을 경우에 nil로 반환하기 때문.
func getStudent(byId id: Int) -> Student? {
// id로 특정학생을 찾아낸다. 배열에서 첫 번째로 조건을 만족하는 학생 반환.
return students.first { $0.id == id }
}
// 모든 학생 조회하여 학생목록 전체를 반환함.
func getAllStudents() -> [Student] {
return students
}
// Update: 학생 정보 수정.
// newName과 newGrade는 선택적 매개변수. 값이 nil이면 수정x
func updateStudent(id: Int, newName: String?, newGrade: Int?) {
// 조건에 맞는 학생의 배열 인덱스를 찾음
if let index = students.firstIndex(where: { $0.id == id }) {
// 유효한 인덱스가 있을 경우에만 수정작업 진행
if let newName = newName {
students[index].name = newName
}
if let newGrade = newGrade {
students[index].grade = newGrade
}
}
}
// Delete: 학생 삭제
// id로 특정 학생을 찾아 삭제한다.
func deleteStudent(byId id: Int) {
students.removeAll { $0.id == id }
}
}
// 인스턴스 생성
let manager = StudentManager()
// Create
manager.addStudent(id: 1, name: "Alice", grade: 3)
manager.addStudent(id: 2, name: "Bob", grade: 4)
// Read
// [Student(id: 1, name: "Alice", grade: 3), Student(id: 2, name: "Bob", grade: 4)]
print(manager.getAllStudents())
// Student(id: 1, name: "Alice", grade: 3)
print(manager.getStudent(byId: 1)!)
// Update
manager.updateStudent(id: 1, newName: "Alicia", newGrade: nil)
// Student(id: 1, name: "Alicia", grade: 3)
print(manager.getStudent(byId: 1)!)
// Delete
manager.deleteStudent(byId: 2)
// [Student(id: 1, name: "Alicia", grade: 3)]
print(manager.getAllStudents())
위에서도 주석에 설명했지만 private 배열로 데이터 보호를 했따.
CRUD 메서드를 통한 명확한 작업 분리를 했다.
옵셔널 매개변수로 유연한 업데이트를 제공했다.
updateStudent
메서드에서 newName
과 newGrade
를 옵셔널로 처리하니,필요한 필드만 수정할 수 있게 됐다.CRUD는 데이터베이스뿐만 아니라 사용자 인터페이스(UI) 설계에도 적용되는데,
예를 들어 게시판 애플리케이션에서 사용자가 다음 작업을 수행할 수 있게 된다.
CRUD는 데이터 관리의 기본이다.
이걸 이해하게 되면
CRUD는 모든 데이터 중심 애플리케이션의 기본이라는 걸 알았다.
데이터를 생성하고 읽고 수정하고 삭제하는 작업은 대부분의 소프트웨어에서 반복적으로 사용되는데,
이 네 가지 작업이 기본이라는 점을 알게 되었고, 이를 구조화된 방식으로 이해할 수 있어서 좋았다.
그리고 append, first, firstIndex(where:), removeAll 같은 Swift 배열 메서드를 자연스럽게 활용하기도 했는데,
단순히 배열의 기능을 사용하는 것도 있겠지만 실질적인 데이터 관리를 수행하는 방법을 조금이나마 알게 된 것 같다.
CRUD는 처음에는 어렵긴해도 단순할거라고 생각했는데,
실제로는 데이터 관리의 기본 원리이기도 했고
이걸 기반으로 더 복잡한 시스템을 설계할 수 있다는 점에서 정말 중요한 내용이었다.
코드를 작성하면서도 "이 작업이 CRUD 중 어느 부분에 해당하지?"를 생각해보니 더 체계적으로 코드를 이해하면서 작성해볼 수 있었다.
더 해보고 싶은게 있다면,
CRUD를 기반으로 간단한 RESTful API를 만들어 보고 싶다.
그래서 CRUD와 HTTP 메서드의 연관성을 실질적으로 체험해볼 수 있게..!
.
.
.
.
.
다음편 예고는 진짜 외계어 같은 디코딩 과정
심지어 나는 두번째 봐도 이해가 안가서 한 줄 한 줄 지피티한테 물어보며 해석하는대도
왜 이렇게 짠건지 이해가 안간다 ㅠㅠ
내일 잘 써보면서 이해 꼭 해보길..