[오늘할일]
코드카타
3차과제 0단계 제출
스프링 강의
=================================================================
5주차 실습을 따라해보면서 확실하게 개념을 익혀보자
1️⃣ 요구사항 분석
요구 사항을 어떤 내용이 구성되어 있는지 살펴봐야한다.
이번 실습에는 메모는 식별자(id),제목(title),내용(contents)으로 구성되어 있다.
요청 데이터를 처리하는 객체, 응답 데이터를 처리하는 객체를 각각 만들어야 한다.
클래스를 생성 하기전에 패키지로 나눠 준다.
entity,dto,controller
2️⃣ 설계
entity패키지 안에 memo 클래스 생성
package com.example.memo.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Memo {
private Long id;
private String title;
private String contents;
}
Long 으로 선언한 이유 : int 타입보다 크고 래퍼 클래스 이기 때문에 null이 포함이 가능해서 Long 타입으로 설정한다고 한다.
dto 패키지 안에 MemoRequsetDto 클래스 생성
package com.example.memo.dto;
import lombok.Getter;
@Getter
public class MemoRequestDto {
private String title; // <= 요청 받아야할 데이터는 title과 contents 입니다 라고 생각할 것
private String contents;
}
요청 데이터를 처리하는 객체는 일반적으로 RequestDto로 명명한다.
이 MemoRequestDto클래스는 Client의 요청 데이터를 받아준다.
[내가 생각할 것]
Entity객체를 생성하기 위해서 클라이언트로 부터 전달받아야 할 값을 생각한다.
전달 받아야할 값 : title,contents (id: 서버에서 관리해준다.) 그러므로 필드는 title,contents 2개
dto 패키지 안에 MemoResponse 클래스 생성
import com.example.memo.entity.Memo;
import lombok.Getter;
@Getter
public class MemoResponseDto {
private Long id;
private String title;
private String contents;
}
}
응답 데이터를 처리하는 객체는 일반적으로 ResponseDto로 명명한다.
응답할때는 Memo라는 객체가 생성되고 나서 저장될때는 식별자가 존재한다.(상황에 따라서 다르다.)
그러므로 ResponseDto는 id,title,contents 3가지 필드를 가진다.
3️⃣ 구현
CRUD중 CREATE 메모 생성 API를 구현한다.
요청과 응답을 처리해줄 MemoController컨트롤러를 만든다.
package com.example.memo.controller;
import com.example.memo.dto.MemoRequestDto;
import com.example.memo.dto.MemoResponseDto;
import com.example.memo.entity.Memo;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.HashMap;
import java.util.Map;
@RestController
public class MemoController {
private final Map<Long, Memo> memoList =new HashMap<>(); // 데이터베이스를 통한 데이터 저장이 아닌 자료구조 HashMap을 통한 데이터 저장
@PostMapping
public MemoResponseDto createMemo(@RequestBody MemoRequestDto dto){
return
}
}
MemoContoller클래스를 생성하고 그 클래스가 REST API를 담당하는 컨트롤러라는 것을 어노테이션 @RestController로 명시해 준다. 이 강의에서는 직접 데이터베이스를 연결해 데이터를 저장하지 않고 Map 자료구조를 통해 데이터를 저장한다. 키 값은 Long 타입 value 값은 Memo 타입으로 설정을 한다.
메모를 생성하는 createMemo를 만드는데 리턴 타입은 응답 객체인 ResponseDto 설정 , 클라이언트로부터 json형식 데이터를 요청 받았을 때 파라미터로 바로 바인딩하는 @RequestBody를 명시한다.
다음 단계로 createMemo가 할일 식별자가 1씩 증가하도록 만듦 => 데이터베이스가 아닌 자료구조로 데이터를 저장하니까 중복을 막기위한 이유 인것 같다.
요청 받은 데이터로 Memo객체를 생성하는데 memoId와 RequestDto의 필드를 넣어주어 생성하고
map 인 memoList에 키가 memoId, value가 memo 인 값을 put메소드로 넣어준다.
그 후 memo객체를 ResponseDto로 변환후 반환 해주어야한다=> MemoResponseDto클래스에 생성자가 없지 때문에 Memo객체를 파라미터로 받는 생성자를 만든다.
만든 후 MemoResponseDto 클래스
package com.example.memo.dto;
import com.example.memo.entity.Memo;
import lombok.Getter;
@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();
}
}
강의 교안 HTTP API 설계 부분에 공통된 URL인 /memos을 @RequestMapping("/memos")로 지정한다.
수정된 Controller
package com.example.memo.controller;
import com.example.memo.dto.MemoRequestDto;
import com.example.memo.dto.MemoResponseDto;
import com.example.memo.entity.Memo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
//메모 생성 API를 만들기 위해 컨트롤러 생성
@RestController
@RequestMapping("/memos") //공통된 url
public class MemoController {
private final Map<Long, Memo> memoList =new HashMap<>();
@PostMapping
public MemoResponseDto createMemo(@RequestBody MemoRequestDto dto){ //리턴 타입은 응답 객체인 ResponseDto 설정 , 클라이언트로 부터 json형식데이터를 요청 받았을 때 파라미터로 바로 바인딩
//- 식별자가 1씩 증가하도록 만듦 (중복을 막기 위함)
Long memoId= memoList.isEmpty() ? 1: Collections.max(memoList.keySet()) +1; // memoList가 비었다면 1,하나라도 들어있다면 memoList의 키 값들을 나열해 그중 큰 값+1을 반환
//- 요청 받은 데이터로 Memo 객체를 생성
Memo memo=new Memo(memoId,dto.getTitle(),dto.getContents());
//- Inmemory DB에 Memo 저장
memoList.put(memoId,memo);
return new MemoResponseDto(memo);
}
}
이렇게 되면 localhost:8080/memos 주소에 RequestBody를 넣고 post 요청을 하면 메모가 1개 생성이 된다.
4️⃣ 테스트
포스트맨으로 확인한 결과
내가 이해한 내용 : RequestDto의 필드들을 Memo(엔티티)객체로 변환 후 Id를 뽑아내고 DB에 저장 후 Memo값을 Response(응답)으로 기억하자
'TIL' 카테고리의 다른 글
[TIL] 스파르타 백엔드 캠프 (0) | 2024.11.05 |
---|---|
[TIL] 스파르타 백엔드 캠프 강의 (0) | 2024.11.03 |
[TIL] 스파르타 백엔드 캠프 23일차 (0) | 2024.10.31 |
[TIL] 스파르타 백엔드 캠프 22일차 (1) | 2024.10.30 |
[TIL] 스파르타 백엔드 캠프 21일차 (0) | 2024.10.29 |