기록

[튜토리얼] spring boot 게시판 curd 본문

Web/Spring

[튜토리얼] spring boot 게시판 curd

youngyin 2022. 8. 29. 10:00

1. 개요

최소한의 어노테이션과 기능을 사용하여 게시판의 curd api를 구현하였다. 추후에 여러가지를 추가 삭제하여 더 나은 구조를 만들어나가고자 한다.

2. 구조

일반적인 서비스에는 뷰와 데이터데이스가 붙어 아래처럼 구성되어 있으나, 현재까지의 프로젝트에서는 Contorller, Service, Dao만을 사용하고 있다.

3. 코드

기존의 프로젝트(2022.08.22 - [backend] - [튜토리얼] intellij/create spring boot project)에 다음과 같이 파일들을 생성한다.

VO

@Getter
@Setter
@ToString
@AllArgsConstructor
public class NoticeVo {
    private Long id;
    private String title;
    private String content;
}

Controller

@RestController
@RequestMapping("/notice")
public class NoticeController {
    private Map<Long, NoticeVo> noticeVoMap = new HashMap<>();
    private final NoticeService noticeService;

    public NoticeController() {
        noticeVoMap.put(1L, new NoticeVo(1L, "title1", "content1"));
        noticeVoMap.put(2L, new NoticeVo(2L, "title2", "content2"));
        noticeVoMap.put(3L, new NoticeVo(3L, "title3", "content3"));

        this.noticeService = new NoticeService(new NoticeDao(noticeVoMap));
    }

    @PostMapping
    public void create(@RequestBody NoticeVo notice){
        noticeService.create(notice);
    }

    @PutMapping
    public void update(@RequestBody NoticeVo notice){
        noticeService.update(notice);
    }

    @GetMapping
    public List<NoticeVo> read(){
        return noticeService.read();
    }

    @DeleteMapping("/{noticeId}")
    public void delete(@PathVariable("noticeId") Long id){
        noticeService.delete(id);
    }
}

Service

public class NoticeService {
    private final NoticeDao noticeDao;

    public NoticeService(NoticeDao noticeDao) {
        this.noticeDao = noticeDao;
    }

    public void create(NoticeVo notice){
        noticeDao.create(notice);
    }

    public void update(NoticeVo notice){
        noticeDao.update(notice);
    }

    public List<NoticeVo> read(){
        return noticeDao.read();
    }

    public void delete(Long id){
        noticeDao.delete(id);
    }
}

Dao

public class NoticeDao {
    private final Map<Long, NoticeVo> noticeMap;

    public NoticeDao(Map<Long, NoticeVo> noticeMap) {
        this.noticeMap = noticeMap;
    }

    public void create(NoticeVo notice){
        noticeMap.put(notice.getId(), notice);
    }

    public void update(NoticeVo notice){
        noticeMap.replace(notice.getId(), notice);
    }

    public List<NoticeVo> read(){
        return noticeMap.keySet().stream()
                .map(noticeMap::get)
                .collect(Collectors.toList());
    }

    public void delete(Long id){
        noticeMap.remove(id);
    }
}

4. 결과

postman을 사용하여 직접 만든 api를 테스트했다. 삽입, 수정, 조회, 삭제가 의도한대로 동작하는 것을 확인할 수 있었다.

Create

Update

update 방식에는 데이터 전체를 갈아끼우는 put방식과 일부만을 교체하는 patch방식이 있다. 이번에는 put방식으로 update함수를 구현했다.

Read

Delete

5. 마무리하면서

파일구조를 다시 살펴보면, 컨트롤러는 서비스를 서비스는 다오를 호출하고 있다. 기존에 안드로이드에서 DI를 접할 일이 있었는데, 한번에 이해하기는 어려웠다. 스프링을 다시 공부하면서 Controller, Service, Dao간 의존성에 주입에 대해 공부할 수 있었고, 이를 통해 DI를 활용하는 경험을 할 수 있었다. 다음 포스팅에서는 여러 방법으로 의존성 주입을 하는 방법을 다뤄보고자 한다.

Comments