본문 바로가기

알쓸지식

[백엔드] CRUD에 대해 알아보자_with Spring-Boot

* CRUD란?

Create, Read, Update, Delete의 약자이다. 대부분의 시스템에 적용되는 개념으로 데이터 관리, 클라이언트와 서버간의 통신에 관한 시스템을 만들 때 사용된다.

 

* RESTful API에서의 CRUD

CRUD HTTP METHOD
Create POST
Read GET
Update PUT
Delete DELETE

ex) 글 작성(C) / 글 조회 (R) / 글 수정(U) / 글 삭제 (D)

 

* SpringBoot에서의 구현 방식

우선 데이터는 json방식으로 전달한다.

{
        "name" : "이치지",
        "job" : "교사"
}

 

  • Controller
  • Model
  • Repository
  • Service

위와같은 구조로 이루어진 코드를 살펴보자

TestController.java

@RestController
@RequestMapping("/test-api")
@RequiredArgsConstructor
public class TestController {

    private final TestService testService;

    //POST는 암호화가 됩니다.
    @PostMapping("/test")
    public TestResponse create(@RequestBody Test test) {
        Test ret = testService.create(test);

        //가져온 ID와 네임 추가
        return new TestResponse(ret.getId(),ret.getName());
    }

    //http 레벨에서 get은 암호화가 안되어있다.
    @GetMapping("/test")
    public TestResponse read(@RequestParam long id) {
        Optional<Test> ret = testService.read(id);

        // Null에서 Id나 name을 가져올 수 없기 때문에 500Error 발생.
        // .orElse(null) 이거 대신에 위처럼 Optional<Test> 사용
        return ret
                .map(it -> new TestResponse(it.getId(),it.getName()))
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Entity not found"));
                // Error:500을 Error:404로 바꿔서 보이게하기
    }

    @PutMapping("/test")
    public TestResponse update(@RequestBody Test test) {
        Optional<Test> ret = testService.update(test);

        return ret
                .map(it -> new TestResponse(it.getId(),it.getName()))
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Entity not found"));
    }

    @DeleteMapping("/test")
    public void delete(@RequestParam long id) {
        testService.delete(id);
    }
}

TestService.java

@Service
@RequiredArgsConstructor
public class TestService {

    private final TestRepository testRepository;

    public Test create(Test test) {
//        Test test = new Test();
        test.setAge(10);
        test.setSex("test sex");

        //h2 DB에 저장
        return testRepository.save(test);

        //h2-console을 통해 보면되니 이거 안슴 (/resources/application.yaml)
//        List<Test> ret = testRepository.findAll();
    }

    public Optional<Test> read(long id){
        return testRepository.findById(id);
    }
    public Optional<Test> update(Test test) {
        return testRepository
                .findById(test.getId())
                .map((savedTest) ->{
                    savedTest.setName(test.getName());
                    savedTest.setEmail(test.getEmail());

                    return testRepository.save(savedTest);
                });
    }

    public void delete(long id) {
        testRepository.deleteById(id);
    }
}

Test.java / TestResponse.java / TestRepository.java는 생략했다.

 

위 코드를 실행시키고 https://localhost8080/test 를 브라우저로 접속하면 자동으로 GET요청이 수행된다. 그 외의 POST, PUT, DELETE요청을 수행하기 위해서는 프론트엔드에서 작업을 해주거나 테스트만을 목적으로 할 경우 POSTMAN을 이용해 api테스트를 해볼 수 가 있다.

 

이번에는 간단하게 json형태의 데이터를 저장, 불러오기, 수정, 삭제 할 수 있는 RESTful api를 작성한 것이다. 이런 형태를 기반으로 백엔드의 시스템이 동작한다고 알면 편할 것이다.