Spring/강의

[📕 기초 Spring] 5-3. 메모장 프로젝트 - ver1 (CRUD 실습, MVC 패턴 적용)

가지코딩 2025. 5. 4. 20:53

[실습] 메모를 CRUD 할 수 있는 Web Application 만들어보기

  • 메모 생성 기능 C (Create)
  • 메모 단건 조회 기능 R (Read)
  • 메모 전체 수정 기능 U (Update)
  • 메모 단건 삭제 기능 D (Delete)

📕 목차

    1. 요구사항 분석 및 설계
    2. 프로젝트 생성
    3. 프로젝트 Git 연동
    4. 클래스 설계
    5. 메모 생성 기능
    6. 메모 조회 기능
    7. 메모 수정 기능
    8. 메모 삭제 기능

1. 요구사항 분석 및 설계

메모장 API 요구 사항

  • 통신 데이터 형태는 JSON이다.
  • 각각의 메모는 식별자(id), 제목(title), 내용(contents)으로 구성되어 있다.
  • 메모 CRUD 기능이 필요하다.

 

HTTP API 설계

  • 메모 생성
    • POST
    • /memos
  • 메모 단건 조회
    • GET
    • /memos/{id}
  • 메모 수정(전체)
    • PUT
    • /memos/{id}
  • 메모 삭제
    • DELETE
    • /memos/{id}

2. 프로젝트 생성

1. 새 프로젝트 생성

  • Name: memo
  • Language: Java
  • Build system: Gradle - Groovy
  • JDK: 17

 

 

2. Dependencies 추가

  • Spring Boot 3.x.x 버전
  • 종속성 추가
    • Spring Web
    • Lombok
    • Thymeleaf

 

 

더보기

+ 편의 기능 설정

  • Auto import - 자동 가져오기

 

  • Editor Zoom : Mouse Wheel

 

  • Lombok

3. 프로젝트 Git 연동

더보기
  • 저장소 생성

 

  • 커밋

4. 클래스 설계

Memo 클래스 설계

  • 각각의 메모는 식별자(id), 제목(title), 내용(contents)으로 구성되어 있다.
  • Memo 객체 생성이 필요하다.

 

DTO 설계

  • 각각의 메모는 식별자(id), 제목(title), 내용(contents)으로 구성되어 있다.
  • Memo 객체 생성이 필요하다.

[실습]

 

Memo 클래스 생성

  • /entity/Memo.java
@Getter
@AllArgsConstructor
public class Memo {
    private Long id;
    private String title;
    private String contents;
}

 

Memo DTO 클래스 생성

  • /dto/MemoRequestDto.java
  • /dto/MemoResponseDto.java
@Getter
public class MemoRequestDto {
    private String title;
    private String contents;
}
@Getter
public class MemoResponseDto {
    private Long id;
    private String title;
    private String contents;
}

5. 메모 생성 기능

 

[실습]

 

MemoController 클래스 ( /controller/MemoController.java )

  • memoList 속성 추가
  • createMemo() 메서드 추가
@RestController
@RequestMapping("/memos")
public class MemoController {
    private final Map<Long, Memo> memoList = new HashMap<Long, Memo>();

    @PostMapping
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto dto) {
        // 식별자가 1씩 증가 하도록 만듦
        Long memoId = memoList.isEmpty() ? 1 : Collections.max(memoList.keySet()) + 1;

        // 요청받은 데이터로 Memo 객체 생성
        Memo memo = new Memo(memoId, dto.getTitle(), dto.getContents());

        // Inmemory DB에 Memo 저장
        memoList.put(memoId, memo);

        return new MemoResponseDto(memo);
    }
}

 

 

MemoResponseDto ( /dto/MemoResponseDto.java )

  • 생성자 추가
@Getter
public class MemoResponseDto {
    private Long id;
    private String title;
    private String contents;

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

 

 

[실습 결과]


6. 메모 조회 기능

 

[실습]

 

MemoController 클래스 ( /controller/MemoController.java )

  • findMemoById() 메서드 추가
@RestController
@RequestMapping("/memos")
public class MemoController {
    private final Map<Long, Memo> memoList = new HashMap<Long, Memo>();

	...

    @GetMapping("/{id}")
    public MemoResponseDto findMemoById(@PathVariable Long id) {
        Memo memo = memoList.get(id);

        return new MemoResponseDto(memo);
    }
}

 

 

[실습 결과]


7. 메모 수정 기능

 

[실습]

 

MemoController 클래스 ( /controller/MemoController.java )

  • updateMemoById() 메서드 추가
@RestController
@RequestMapping("/memos")
public class MemoController {
    private final Map<Long, Memo> memoList = new HashMap<Long, Memo>();

	...

    @PutMapping("/{id}")
    public MemoResponseDto updateMemoById(@PathVariable Long id, @RequestBody MemoRequestDto dto) {
        Memo memo = memoList.get(id);

        memo.update(dto);

        return new MemoResponseDto(memo);
    }
}

 

Memo 클래스 ( /entity/Memo.java )

  • update() 메서드 추가
@Getter
@AllArgsConstructor
public class Memo {
    private Long id;
    private String title;
    private String contents;

    public void update(MemoRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.contents = requestDto.getContents();
    }
}

 

 

[실습 결과]


8. 메모 삭제 기능

 

[실습]

 

MemoController 클래스 ( /controller/MemoController.java )

  • deleteMemo() 메서드 추가
@RestController
@RequestMapping("/memos")
public class MemoController {
    private final Map<Long, Memo> memoList = new HashMap<Long, Memo>();

	...
    
    @DeleteMapping("/{id}")
    public void deleteMemo(@PathVariable Long id) {
        memoList.remove(id);
    }
}

 


[실습 결과]


 

실습 코드

https://github.com/gajicoding/spring-crud-memo/tree/v1.1.0