메모장 프로젝트 설계
프로젝트 생성 후 실행
HTML 파일 작성, 이미지 저장


- 브라우저에 기본 요청(/)을 하면 내부 설정에 의해 static 폴더 아래에 있는 index.html을 찾아 반환함(default 설정)
메모장 기능 설계
- 접속 시 메모 전체 목록 조회
- GET API 사용해 메모 목록 불러오기
- 메모 생성
- POST API 사용해 메모 신규 생성하기
- 생성된 메모 반환
- 메모 변경
- PUT API 사용해 메모 내용 변경하기
- 사용자가 클릭한 메모가 DB에 존재하는지 확인하기
- 해당 메모 내용 변경
- 메모 삭제
- 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)란 무엇인가?
데이터 전송 및 이동을 위해 생성되는 객체를 의미

- 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;
}
}
결과




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("선택한 메모는 존재하지 않습니다.");
}
}
}
결과



'백엔드 > spring&springboot' 카테고리의 다른 글
| [내일배움캠프_Spring Boot 입문주차] 3 Layer Architecture (0) | 2026.06.25 |
|---|---|
| [내일배움캠프_Spring Boot 입문주차] Database와 SQL (0) | 2026.06.24 |
| [내일배움캠프_Spring Boot 입문주차] Spring MVC (0) | 2026.06.23 |
| [내일배움캠프_Spring Boot 입문주차] Lombok과 application.properties (0) | 2026.06.23 |
| [내일배움캠프_Spring Boot 입문주차] 테스트 코드 (0) | 2026.06.23 |