본문 바로가기
백엔드/spring&springboot

[내일배움캠프_Spring Boot 입문주차] 메모장 프로젝트 만들기

by alswlfl 2026. 6. 24.

메모장 프로젝트 설계

프로젝트 생성 후 실행

HTML 파일 작성, 이미지 저장

프로젝트 초기 세팅 및 실행

  • 브라우저에 기본 요청(/)을 하면 내부 설정에 의해 static 폴더 아래에 있는 index.html을 찾아 반환함(default 설정)

메모장 기능 설계

  1. 접속 시 메모 전체 목록 조회
    • GET API 사용해 메모 목록 불러오기
  2. 메모 생성
    • POST API 사용해 메모 신규 생성하기
    • 생성된 메모 반환
  3. 메모 변경
    • PUT API 사용해 메모 내용 변경하기
    • 사용자가 클릭한 메모가 DB에 존재하는지 확인하기
    • 해당 메모 내용 변경
  4. 메모 삭제
    • DELETE API 사용해서 메모 삭제하기
    • 사용자가 삭제하려는 메모가 DB에 존재하는지 확인하기
    • DB에서 해당 메모 삭제

API 테이블

기능 Method URL Return
메모 생성하기 POST /api/memos MemoResponseDto
메모 조회하기 GET /api/memos List<MemoResponseDto>
메모 변경하기 PUT /api/memos/{id} Long
메모 삭제하기 DELETE /api/memos/{id} Long

Create, Read 구현하기

DTO(Data Transfer Object)란 무엇인가?

데이터 전송 및 이동을 위해 생성되는 객체를 의미

DTO

 

  • Client에서 보내오는 데이터를 객체로 처리할 때 사용
  • 서버의 계층간의 이동에도 사용
  • DB와의 소통을 담당하는 Java 클래스(=엔티티)를 그대로 Client에 반환하는 것이 아니라 DTO로 한번 변환 후 반환할 때 사용
  • 데이터베이스와 소통하는 클래스(=엔티티)는 굉장히 조심스럽게 다루어야 하기 때문에 DTO 사용함!
🗣️ Request의 데이터를 처리할 때 사용되는 객체는 RequestDto, Response를 할 때 사용되는 객체는 ResponseDto라는 이름을 붙여 DTO 클래스를 만들 수 있음
- 절대적인 규칙은 아니기 때문에 조직에 따라 규칙이 다를 수 있음

엔티티와 DTO 생성

Memo 엔티티 생성

package com.sparta.memo.entity;

import com.sparta.memo.dto.MemoRequestDto;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Memo {
    private Long id;
    private String username;
    private String contents;

    public Memo(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }
}

 

MemoResponseDto 생성

package com.sparta.memo.dto;

import com.sparta.memo.entity.Memo;
import lombok.Getter;

@Getter
public class MemoResponseDto {
    private Long id;
    private String username;
    private String contents;

    public MemoResponseDto(Memo memo) {
        this.id = memo.getId();
        this.username = memo.getUsername();
        this.contents = memo.getContents();
    }
}

 

MemoRequestDto 생성

package com.sparta.memo.dto;

import lombok.Getter;

@Getter
public class MemoRequestDto {
    private String username;
    private String contents;
}

메모 등록 API 구현

package com.sparta.memo.controller;

import com.sparta.memo.dto.MemoRequestDto;
import com.sparta.memo.dto.MemoResponseDto;
import com.sparta.memo.entity.Memo;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class MemoController {

    private final Map<Long, Memo> memoList = new HashMap<>(); // 데이터베이스 저장소 대신 사용

    @PostMapping("/memos")
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
        // RequestDTO -> Entity
        Memo memo = new Memo(requestDto);

        // Memo Max ID Check
        // 현재 데이터베이스의 마지막 값 구하기
        Long maxId = !memoList.isEmpty() ? Collections.max(memoList.keySet()) + 1 : 1;
        memo.setId(maxId);

        // DB 저장
        memoList.put(memo.getId(), memo);

        // Entity -> ResponseDto
        MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
        
        return memoResponseDto;
    }
}

메모 조회 API 구현

package com.sparta.memo.controller;

import com.sparta.memo.dto.MemoRequestDto;
import com.sparta.memo.dto.MemoResponseDto;
import com.sparta.memo.entity.Memo;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("/api")
public class MemoController {

    private final Map<Long, Memo> memoList = new HashMap<>(); // 데이터베이스 저장소 대신 사용

    ...

    @GetMapping("/memos")
    public List<MemoResponseDto> getMemos() {
        // Map To List
        List<MemoResponseDto> responseList = memoList.values().stream()
                .map(MemoResponseDto::new).toList();
        
        return responseList;
    }
}

결과

결과 화면
Postman 이용


Update, Delete 구현하기

메모 수정 API 구현

Memo 엔티티 내에 update 메서드 추가

package com.sparta.memo.entity;

import com.sparta.memo.dto.MemoRequestDto;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Memo {
    private Long id;
    private String username;
    private String contents;

    ...

    public void update(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }
}

 

Update API 구현

package com.sparta.memo.controller;

import com.sparta.memo.dto.MemoRequestDto;
import com.sparta.memo.dto.MemoResponseDto;
import com.sparta.memo.entity.Memo;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("/api")
public class MemoController {

    private final Map<Long, Memo> memoList = new HashMap<>(); // 데이터베이스 저장소 대신 사용

	...

    @PutMapping("/memos/{id}")
    public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto memoRequestDto) {
        // 해당 메모가 DB에 존재하는지 확인
        if(memoList.containsKey(id)) {
            // 해당 메모 가져오기
            Memo memo = memoList.get(id);

            // memo 수정
            memo.update(memoRequestDto);

            return memo.getId();
        } else {
            throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
        }
    }
}

메모 삭제 API 구현

package com.sparta.memo.controller;

import com.sparta.memo.dto.MemoRequestDto;
import com.sparta.memo.dto.MemoResponseDto;
import com.sparta.memo.entity.Memo;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("/api")
public class MemoController {

    private final Map<Long, Memo> memoList = new HashMap<>(); // 데이터베이스 저장소 대신 사용

	...

    @DeleteMapping("/memos/{id}")
    public Long deleteMemo(@PathVariable Long id) {
        // 해당 메모가 DB에 존재하는지 확인
        if(memoList.containsKey(id)){
            // 해당 메모 삭제하기
            memoList.remove(id);
            return id;
        } else {
            throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
        }
    }
}

결과

결과 화면