Search
📒

4-1. CRUD란?

어떠한 서비스를 만들던 간에, 기본적인 서비스에 필요한 자원이 존재합니다.
뉴스 기사를 제공하는 서비스를 생각해봅시다. 기본적인 뉴스라는 자원이 있으며, 해당 뉴스라는 자원에는 뉴스의 제목, 본문 내용, 신문사 등의 정보가 기록이 됩니다. 이렇게 정의된 자원은, 필요에 의해 생성, 조회 등의 작업이 가해지게 됩니다.
식당을 운영한다고 생각해 봅시다. 기본적으로 식당에서 제공하는 메뉴에 대한 정보가 있을 것이며, 해당 식당에서 요리를 하게되는 요리사가 존재할 것입니다. 만약 식당을 관리하는 프로그램이 있다면, 식당의 메뉴를 추가하거나 제거하는 기능 등이 존재할 것입니다.
웹 서비스라는 것의 본질은 자원을 제공하는 방법의 제공입니다. 일반적인 웹 서비스를 생각하면, 사용자의 요청에 따라 자원을 생성 또는 제공하는 것이 첫 단계입니다. 해당 자원들을 가지고 새로운 산출물을 만들어 내거나 조합하여 기능을 제공하는 것은 그 이후의 단계입니다.
서비스에서는 자원을 조작하여 사용자에게 전달하게 됩니다. 그리고 자원에 할 수 있는 기초적인 조작법을 4가지로 나누어 생성, 조회, 갱신, 삭제의 기능을 만들게 되며, 이 네가지 기초 조작을 CRUD라고 합니다. Backend 프레임워크를 배우는 과정에서 CRUD를 할 수 있는 API를 구성하는 것이 Backend 공부의 첫단계라고 볼 수 있습니다.
API를 구성하는 것은 HTTP 요청을 받을 수 있는 경로를 구성하는 것과 동일하게 생각할 수 있습니다. 이때 API를 사용하기 위한 해당 경로를 API Endpoint라고 부르기도 합니다.

CRUD 실습

먼저 CRUD를 하기 위한 기초적인 자원을 고안해 봅시다.
public class PostDto { private String title; private String content; private String writer; // 생성자, getter, setter 생략 }
Java
복사
게시글을 작성하고 조회하는 웹 서비스를 생각할때, 가장 기초적인 자원은 게시글을 표현하는 자원입니다. 일반적인 게시글을 생각했을때, 제목, 본문, 작성자 등의 정보가 포함합니다. 댓글과 작성된 게시판 같은 단위는 해당 자원이 아닌, 서로 상호작용하는 자원이라고 생각합니다.
앞서 @Controller 를 사용하는 방법을 배웠습니다. Post 라는 자원을 다루기 위한 경로를 만들어야 하므로, PostController 객체를 생성하고 @Controller 어노테이션을 추가해 줍시다.
@Controller @ResponseBody @RequestMapping("post") public class PostController { private List<PostDto> postList = new ArrayList<>(); ... }
Java
복사
PostController@Controller@ResponseBody 를 붙여준 뒤, @RequestMapping("post") 까지 추가하였습니다. 이러면 @Controller 에 정의된 @RequestMapping 의 경로는 앞쪽에 post 가 추가되게 됩니다. 그리고 현 단계에서 임시로 PostDto 데이터를 담아두기 위한 List 객체 또한 생성해 줍니다.
@PostMapping("create") public void createPost(@RequestBody PostDto postDto){ ... } @GetMapping("read-all") public List<PostDto> readPostAll(){ ... } @GetMapping("read-one") public PostDto readPostOne(@RequestParam("id") int id){ ... } @PostMapping("update") public void updatePost( @RequestParam("id") int id, @RequestBody PostDto postDto ){ ... } @DeleteMapping("delete") public void deletePost(@RequestParam("id") int id){ ... }
Java
복사
우선 간단하게 생각나는데로 RequestMapping 을 구성해 봅시다. 데이터가 표현될 Body가 있어야 하는 생성(Create)와 갱신(Update)의 경우 PostMapping 을 사용하였고, 어떤 역할을 하는지를 경로(”create”, “update”)상에 표현하였습니다. 조회(Read)를 위한 경로는 두가지로 둘다 GetMapping 을 사용, 삭제(Delete)는 DeleteMapping 사용하여 구성하였습니다.
Query Parameter
이제 내부는 List<PostDto> 를 사용하여 채워넣을 수 있습니다.
@PostMapping("create") public void createPost(@RequestBody PostDto postDto){ this.postList.add(postDto); } @GetMapping("read-all") public List<PostDto> readPostAll(){ return this.postList; } @GetMapping("read-one") public PostDto readPostOne(@RequestParam("id") int id){ return this.postList.get(id); } @PostMapping("update") public void updatePost( @RequestParam("id") int id, @RequestBody PostDto postDto ){ this.postList.set(id, postDto); } @DeleteMapping("delete") public void deletePost(@RequestParam("id") int id){ this.postList.remove(id); }
Java
복사
기능적인 측면에서는 잘 작동하는 예시입니다. RequestMapping 을 이용하여 서버의 경로를 다양하게 구성하는 연습또한 가능합니다. 여기에 @RequestParam 을 이용해, URL의 Query Parameter를 활용하여 특정 자원을 구분하고 있습니다. 여기서 이야기하는 id 는, 현재는 Listindex 로 가정합시다.
CRUD라는 말 자체에는 큰 의미를 가지고 있지 않으며, 어떻게 만들어야 하는지가 정의된 개념이 아닙니다. 따라서 위처럼 작성하여도, 저희는 CRUD를 위한 endpoint를 전달하고 있다고 생각할 수 있습니다.