귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 실제 적용 == === 웹 개발에서의 CRUD === 거의 모든 웹 애플리케이션은 CRUD를 기반으로 동작한다고 해도 과언이 아니다. '''게시판을 예로 들면:''' * '''Create''': 게시글 작성 * '''Read''': 게시글 목록 보기, 게시글 상세보기 * '''Update''': 게시글 수정 * '''Delete''': 게시글 삭제 '''쇼핑몰을 예로 들면:''' * '''Create''': 상품 등록, 주문 생성 * '''Read''': 상품 목록 조회, 주문 내역 확인 * '''Update''': 장바구니 수량 변경, 배송지 수정 * '''Delete''': 장바구니 상품 제거, 주문 취소 === HTTP 메서드와의 관계 === [[HTTP]] 메서드는 본래 '''웹 리소스를 전송하고 조작하기 위한 프로토콜'''이며, CRUD를 위해 설계된 것이 아니다.<ref>HTTP는 1991년 팀 버너스리가 만들었고, CRUD는 1983년부터 쓰인 데이터베이스 용어다. 애초에 목적이 달랐다.</ref> 하지만 [[REST API]] 설계 방법론이 등장하면서, '''관례적으로''' CRUD 작업을 HTTP 메서드에 매핑하는 패턴이 널리 사용되고 있다: {| class="wikitable" ! CRUD !! 관례적으로 사용되는<br/>HTTP 메서드 !! 예시 URL !! 비고 |- | Create || POST || /users || REST API에서 리소스 생성에 주로 사용 |- | Read || GET || /users 또는 /users/1 || HTTP 명세상 안전한(Safe) 메서드 |- | Update || PUT/PATCH || /users/1 || PUT은 전체 교체, PATCH는 부분 수정<ref>실무에서는 이 구분이 애매하게 쓰이는 경우가 많다.</ref> |- | Delete || DELETE || /users/1 || HTTP 명세상 멱등성(Idempotent)을 가짐 |} '''주의할 점:''' * HTTP 메서드는 원래 '''리소스의 표현(Representation)을 전송'''하기 위한 것이다. * GET은 "데이터를 가져와라", POST는 "서버로 데이터를 보내라"는 의미가 원래 목적이었다. * REST 아키텍처에서 이를 CRUD와 연결지은 것은 '''설계 관례'''일 뿐, HTTP 표준의 원래 의도는 아니다. * 실제로 POST로 모든 작업(조회, 수정, 삭제)을 처리하는 API도 존재한다.<ref>[[GraphQL]]이 대표적이다. 모든 요청을 POST로 보낸다.</ref> === RESTful API 설계 패턴 === 2000년 Roy Fielding의 박사 논문에서 제안된 [[REST]] 아키텍처 스타일이 유행하면서, CRUD를 HTTP 메서드로 표현하는 것이 '''사실상의 표준(de facto standard)'''이 되었다. '''REST의 핵심 원칙:''' * 리소스를 URL로 표현한다 (/users/123) * HTTP 메서드로 리소스에 대한 행위를 표현한다 * 상태를 전이시킨다 (Representational State Transfer) 이 과정에서 HTTP 메서드가 CRUD와 '''우연히도 잘 매칭'''되어, 개발자들이 자연스럽게 연결지어 사용하게 되었다.<ref>하지만 HTTP OPTIONS, HEAD, TRACE 같은 메서드는 CRUD와 전혀 상관없다. 애초에 다른 목적이었으니까.</ref> === 프레임워크에서의 구현 === 대부분의 웹 프레임워크는 CRUD 작업을 쉽게 구현할 수 있도록 도와준다. '''[[Django]]의 경우:''' <syntaxhighlight lang="python"> # Create user = User.objects.create(name='홍길동', email='hong@example.com') # Read users = User.objects.all() user = User.objects.get(id=1) # Update user.age = 26 user.save() # Delete user.delete() </syntaxhighlight> '''[[Spring Boot]]의 경우:''' <syntaxhighlight lang="java"> // Create userRepository.save(user); // Read userRepository.findAll(); userRepository.findById(1L); // Update user.setAge(26); userRepository.save(user); // Delete userRepository.delete(user); </syntaxhighlight> 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림)