
오늘은 데이터 처리의 기본인 CRUD에 대해 알아보려고 한다.
CRUD란
CRUD란, 데이터를 처리하는 기본 작업 4가지를 말한다.
1. Create : 데이터를 생성(추가)하는 작업
2. Read : 데이터를 읽거나 조회하는 작업
3. Update : 기존 데이터를 수정하는 작업
4. Delete : 데이터를 삭제하는 작업
CRUD가 왜 중요한가?
CRUD 기능은 데이터 관리의 기본이며, 모든 데이터 기반 애플리케이션에서 필수적으로 구현되어야 한다. 이 기능을 통해 사용자는 데이터를 효율적으로 조작하고, 애플리케이션은 데이터의 일관성과 무결성을 유지할 수 있다.
왜냐하면 CRUD 작업을 통해 데이터의 정확성을 보장하고, 사용자의 요구를 만족시키는 동시에 데이터 보안을 강화할 수 있기 때문이다. 또한, CRUD 기능의 구현은 애플리케이션의 유지 보수와 확장성에도 중요한 영향을 미친다.
애플리케이션의 데이터 처리 로직이 명확하고 효율적일수록, 개발자는 새로운 기능을 추가하거나 기존 기능을 개선하는 데 더 쉽게 접근할 수 있다. 따라서, CRUD 기능은 소프트웨어 개발의 기본이자, 효과적인 데이터 관리를 위한 핵심 요소이다.
CRUD와 HTTP 메서드의 관계
CREAT(생성)
- HTTP 메서드 : POST
- 예시 : 새로운 사용자를 생성하는 경우
- 요청 : POST /users
- 요청 본문(body): 새로운 사용자의 정보를 포함하는 JSON 또는 XML 데이터
- 응답: 새로운 사용자의 ID와 함께 성공 메시지 또는 적절한 상태 코드 (예: 201 Created)
READ(읽기)
- HTTP 메서드 : GET
- 예시 : 모든 사용자 목록을 가져오는 경우
- 요청 : GET /users
- 응답: 모든 사용자의 목록을 포함하는 JSON 또는 XML 데이터 또는 적절한 상태 코드와 함께 성공 메시지 (예: 200 OK)
UPDATE(갱신)
- HTTP 메서드 : PUT 또는 PATCH
- 예시 : 특정 사용자의 정보를 업데이트 하는 경우
- 요청 : PUT /users/{id} 또는 PATCH /users/{id}
- 요청 본문 : 업데이트할 사용자의 정보를 포함하는 JSON 또는 XML 데이터
- 응답 : 적절한 상태 코드와 함께 성공 메시지 또는 업데이트된 사용자의 정보
DELETE(삭제)
- HTTP 메서드 : DELETE
- 예시 : 특정 사용자를 삭제하는 경우
- 요청: DELETE /users/{id}
- 응답: 적절한 상태 코드와 함께 성공 메시지 또는 삭제된 사용자의 정보
CRUD API 예제 (Spring boot + JPA)
기본 파일 구조
src/
└── main/
├── java/
│ └── com.example.crud/
│ ├── CrudApplication.java
│ ├── controller/
│ │ └── PostController.java
│ ├── entity/
│ │ └── Post.java
│ ├── repository/
│ │ └── PostRepository.java
Post.Java (Entity)
package com.example.crud.entity;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
}
- DB의 테이블과 1:1로 매핑되는 자바 클래스 (Post라는 클래스가 있으면 DB에는 Post 테이블이 생김)
PostRepository.java (Repository)
package com.example.crud.repository;
import com.example.crud.entity.Post;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostRepository extends JpaRepository<Post, Long> {
}
- JpaRepository를 상속받아서 CRUD 메서드를 자동으로 제공해줌
- 직접 SQL을 쓰지 않아도 findAll(), save(), deleteById() 같은 걸 쓸 수 있음.
PostController.java (Controller)
package com.example.crud.controller;
import com.example.crud.entity.Post;
import com.example.crud.repository.PostRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/posts")
public class PostController {
private final PostRepository repo;
public PostController(PostRepository repo) {
this.repo = repo;
}
// Create
@PostMapping
public Post create(@RequestBody Post post) {
return repo.save(post);
}
// Read all
@GetMapping
public List<Post> getAll() {
return repo.findAll();
}
// Read one
@GetMapping("/{id}")
public Post getOne(@PathVariable Long id) {
return repo.findById(id).orElse(null);
}
// Update
@PutMapping("/{id}")
public Post update(@PathVariable Long id, @RequestBody Post post) {
Post existing = repo.findById(id).orElseThrow();
existing.setTitle(post.getTitle());
existing.setContent(post.getContent());
return repo.save(existing);
}
// Delete
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
repo.deleteById(id);
}
}
- 사용자 요청을 받아서 처리하고 응답을 돌려주는 역할
- @RestController, @RequestMapping, @PostMapping 같은 어노테이션을 HTTP로 요청받음.
@PostMapping
public Post create(@RequestBody Post post) {
return repo.save(post);
}
- 사용자가 POST /posts로 요청을 보내면, 이 메서드가 실행되고 PostRepository의 save()가 호출되어 Entity를 DB에 저장함.
CrudApplication.java
package com.example.crud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CrudApplication {
public static void main(String[] args) {
SpringApplication.run(CrudApplication.class, args);
}
}
- @SpringBootApplication이 붙어 있는 진입점.
- 여기서 애플리케이션을 실행하면 Spring이 모든 컴포넌트를 자동으로 스캔하고 연결해줌.
Reference
[개발상식] CRUD란?
CRUD란 무엇이고 예시와 함께 알아보자. REST API에서의 CRUD, DB에서의 CRUD에 대해 알아보자.
idkim97.github.io
'spring boot' 카테고리의 다른 글
| 스프링부트(spring boot) 기본기 다지기 (0) | 2025.05.27 |
|---|