Create, Read, Update, Delete
개요[편집 / 원본 편집]
CRUD(크루드)는 데이터베이스나 애플리케이션에서 수행하는 4가지 기본 작업을 의미하는 약어이다.
생성(Create), 읽기(Read), 수정(Update), 삭제(Delete)의 앞글자를 따서 만든 용어로, 프로그래밍이나 데이터베이스 설계에서 가장 기초적이면서도 필수적인 개념이다.[1]
상세[편집 / 원본 편집]
역사[편집 / 원본 편집]
CRUD라는 용어는 1983년 James Martin의 저서 "Managing the Data-base Environment"에서 처음 사용되었다. 이후 데이터베이스 시스템과 RESTful API 설계의 기본 원칙으로 자리잡았다.
재미있게도, SQL에서는 CRUD를 각각 INSERT, SELECT, UPDATE, DELETE라는 명령어로 구현한다. 앞글자를 따면 ISUD가 되는데, 발음하기 어려워서인지 CRUD가 표준 용어로 굳어졌다.[2]
각 작업의 의미[편집 / 원본 편집]
Create (생성)[편집 / 원본 편집]
새로운 데이터를 만드는 작업이다.
예시:
INSERT INTO users (name, email, age)
VALUES ('홍길동', '[email protected]', 25);Read (읽기)[편집 / 원본 편집]
저장된 데이터를 조회하는 작업이다.
예시:
SELECT * FROM users WHERE age >= 20;Update (수정)[편집 / 원본 편집]
기존 데이터를 변경하는 작업이다.
- SQL에서는 UPDATE 문을 사용한다.
- 잘못 사용하면 WHERE 절 빼먹기 사고가 발생할 수 있다.
그러면 모든 데이터가 똑같이 변한다
예시:
UPDATE users
SET age = 26
WHERE name = '홍길동';주의사항: WHERE 절을 빼먹으면...
UPDATE users SET age = 26;
-- 모든 사용자의 나이가 26세가 된다. 끔찍하다.Delete (삭제)[편집 / 원본 편집]
실제 적용[편집 / 원본 편집]
웹 개발에서의 CRUD[편집 / 원본 편집]
거의 모든 웹 애플리케이션은 CRUD를 기반으로 동작한다고 해도 과언이 아니다.
게시판을 예로 들면:
- Create: 게시글 작성
- Read: 게시글 목록 보기, 게시글 상세보기
- Update: 게시글 수정
- Delete: 게시글 삭제
쇼핑몰을 예로 들면:
- Create: 상품 등록, 주문 생성
- Read: 상품 목록 조회, 주문 내역 확인
- Update: 장바구니 수량 변경, 배송지 수정
- Delete: 장바구니 상품 제거, 주문 취소
HTTP 메서드와의 관계[편집 / 원본 편집]
HTTP 메서드는 본래 웹 리소스를 전송하고 조작하기 위한 프로토콜이며, CRUD를 위해 설계된 것이 아니다.[5]
하지만 REST API 설계 방법론이 등장하면서, 관례적으로 CRUD 작업을 HTTP 메서드에 매핑하는 패턴이 널리 사용되고 있다:
| CRUD | 관례적으로 사용되는 HTTP 메서드 |
예시 URL | 비고 |
|---|---|---|---|
| Create | POST | /users | REST API에서 리소스 생성에 주로 사용 |
| Read | GET | /users 또는 /users/1 | HTTP 명세상 안전한(Safe) 메서드 |
| Update | PUT/PATCH | /users/1 | PUT은 전체 교체, PATCH는 부분 수정[6] |
| Delete | DELETE | /users/1 | HTTP 명세상 멱등성(Idempotent)을 가짐 |
주의할 점:
- HTTP 메서드는 원래 리소스의 표현(Representation)을 전송하기 위한 것이다.
- GET은 "데이터를 가져와라", POST는 "서버로 데이터를 보내라"는 의미가 원래 목적이었다.
- REST 아키텍처에서 이를 CRUD와 연결지은 것은 설계 관례일 뿐, HTTP 표준의 원래 의도는 아니다.
- 실제로 POST로 모든 작업(조회, 수정, 삭제)을 처리하는 API도 존재한다.[7]
RESTful API 설계 패턴[편집 / 원본 편집]
2000년 Roy Fielding의 박사 논문에서 제안된 REST 아키텍처 스타일이 유행하면서, CRUD를 HTTP 메서드로 표현하는 것이 사실상의 표준(de facto standard)이 되었다.
REST의 핵심 원칙:
- 리소스를 URL로 표현한다 (/users/123)
- HTTP 메서드로 리소스에 대한 행위를 표현한다
- 상태를 전이시킨다 (Representational State Transfer)
이 과정에서 HTTP 메서드가 CRUD와 우연히도 잘 매칭되어, 개발자들이 자연스럽게 연결지어 사용하게 되었다.[8]
프레임워크에서의 구현[편집 / 원본 편집]
대부분의 웹 프레임워크는 CRUD 작업을 쉽게 구현할 수 있도록 도와준다.
Django의 경우:
# Create
user = User.objects.create(name='홍길동', email='[email protected]')
# Read
users = User.objects.all()
user = User.objects.get(id=1)
# Update
user.age = 26
user.save()
# Delete
user.delete()Spring Boot의 경우:
// Create
userRepository.save(user);
// Read
userRepository.findAll();
userRepository.findById(1L);
// Update
user.setAge(26);
userRepository.save(user);
// Delete
userRepository.delete(user);한계와 비판[편집 / 원본 편집]
CRUD는 매우 유용한 개념이지만, 모든 비즈니스 로직을 CRUD로만 설명하기에는 부족한 면이 있다.
- 복잡한 비즈니스 로직: 단순 CRUD로 표현하기 어려운 복잡한 작업들이 존재한다. 예를 들어, "송금하기"는 단순히 데이터를 생성하거나 수정하는 것 이상의 의미를 갖는다.
- 도메인 주도 설계(DDD): 최근에는 CRUD 중심이 아닌 비즈니스 도메인 중심의 설계가 강조되고 있다.
- 이벤트 소싱: CRUD 대신 모든 변경사항을 이벤트로 기록하는 방식도 존재한다.
- CQRS 패턴: 명령(Command)과 조회(Query)를 분리하는 패턴으로, 단순 CRUD를 넘어선다.
하지만 이런 비판에도 불구하고, CRUD는 여전히 데이터 처리의 기본 개념으로 널리 사용되고 있다.[9]
여담[편집 / 원본 편집]
- "CRUD 개발자"라는 표현이 있는데, 단순히 CRUD만 반복하는 개발자를 다소 비하하는 의미로 쓰인다.
하지만 현실의 대부분 개발자가 하는 일이 CRUD 구현이다[10]
- SQL을 배울 때 가장 먼저 배우는 것이 CRUD 작업이다. 그만큼 기본이자 핵심이다.
- 게임 개발에서도 CRUD 개념이 적용된다. MMORPG에서 아이템을 얻고(Create), 인벤토리를 확인하고(Read), 강화하고(Update), 버리는(Delete) 것이 모두 CRUD다.
- Git에도 비슷한 개념이 있다: add(Create), log/show(Read), commit --amend(Update), rm(Delete)
- 개발자들 사이에서 "오늘도 CRUD나 짜야지"라는 말은 일종의 자조적인 농담으로 쓰인다.
- HTTP와 CRUD를 동일시하는 것은 흔한 오해다. HTTP는 Hypertext Transfer Protocol로 웹 문서를 전송하기 위한 프로토콜이고, CRUD는 데이터베이스 작업 개념이다. 둘이 REST API에서 만났을 뿐이다.[11]
관련 문서[편집 / 원본 편집]
각주[편집 / 원본 편집]
- ↑ 너무 기초적인 나머지 개발자 면접에서 "CRUD가 뭐예요?"라는 질문을 받으면 당황스러울 수 있다.
- ↑ 사실 Create는 INSERT뿐만 아니라 CREATE TABLE 같은 명령도 포함할 수 있어서 더 포괄적인 의미를 갖는다.
- ↑ 당신이 지금 이 문서를 보고 있는 것도 Read 작업이다!
- ↑ 그래서 실무에서는 실제로 삭제하지 않고 'deleted' 플래그만 true로 바꾸는 소프트 삭제(Soft Delete)를 많이 사용한다.
- ↑ HTTP는 1991년 팀 버너스리가 만들었고, CRUD는 1983년부터 쓰인 데이터베이스 용어다. 애초에 목적이 달랐다.
- ↑ 실무에서는 이 구분이 애매하게 쓰이는 경우가 많다.
- ↑ GraphQL이 대표적이다. 모든 요청을 POST로 보낸다.
- ↑ 하지만 HTTP OPTIONS, HEAD, TRACE 같은 메서드는 CRUD와 전혀 상관없다. 애초에 다른 목적이었으니까.
- ↑ 결국 복잡한 시스템도 뜯어보면 CRUD의 조합인 경우가 많다.
- ↑ 물론 CRUD를 잘 구현하는 것도 쉬운 일이 아니다. 성능, 보안, 동시성 등 고려할 것이 많다.
- ↑ 마치 땅콩버터와 젤리가 만나 PB&J 샌드위치가 된 것처럼, 원래는 별개였던 두 개념이 조합되어 새로운 패턴이 탄생했다.