서버로 데이터 보내는 법
이 API에선 이렇게 데이터를 보내겠다라고 API테이블에서 미리 클라이언트 개발자와 약속을 한다.
(Require = false)를 @----뒤에 붙여주면 해당 데이터를 받아오지 않아도 오류가 발생하지 않는다.
RequestPath : 주소에 아래와같은 형태로 데이터를 전달
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
RequestParam : ? 뒤에 데이터를 타입에 맞춰 전달. QueryString방식
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
RequestBody : Get방식과 다르게 Body를 가지고 있음, Body안에 데이터를 담아 보낸다.
아래 url은 html파일의 id태그인 form태그를 이용해서 전달하겠다는 의미이다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/param
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
HTTP데이터 객체로 처리
@ModelAttribute : Body내의 데이터를 객체로 만들어준다.
필드 이름을 클라이언트에서 보내주는 데이터와 동일하게 해주어야한다.
Setter혹은 오버로딩된 생성자가 필요하다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
json형식으로 받아올 수도 있다. json형식으로 받아올 경우 @RequestBody를 꼭 붙여줘야한다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
Memo 프로젝트
DTO란?
Data Transfer Object로 데이터 전송 및 이동을 위해 생성되는 객체를 의미합니다.
클라이언트에서 보내오는 데이터를 객체로 처리할 때 이용됩니다.
맵을 리스트형으로 바꾸는 방법
List<MemoResponseDto> responseList = memoList.values().stream()
.map(MemoResponseDto::new).toList();
stream() : 하나씩 꺼내서 반복
MemoResponseDto::new : MemoResponseDto의 생성자 호출
toList() : List형으로 변환
구현 완료 코드
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.Collections;
import java.util.HashMap;
import java.util.List;
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.size() > 0 ? Collections.max(memoList.keySet()) + 1 : 1;
memo.setId(maxId);
// DB 저장
memoList.put(memo.getId(), memo);
// Entity -> ResponseDto
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
// Map To List
List<MemoResponseDto> responseList = memoList.values().stream()
.map(MemoResponseDto::new).toList();
return responseList;
}
@PutMapping("/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
// 해당 메모가 DB에 존재하는지 확인
if(memoList.containsKey(id)) {
// 해당 메모 가져오기
Memo memo = memoList.get(id);
// memo 수정
memo.update(requestDto);
return memo.getId();
} else {
throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
}
}
@DeleteMapping("/memos/{id}")
public Long deleteMemo(@PathVariable Long id) {
// 해당 메모가 DB에 존재하는지 확인
if(memoList.containsKey(id)) {
// 해당 메모 삭제하기
memoList.remove(id);
return id;
} else {
throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
}
}
}
SQL DataBase
아직 이해가 안된다. 내일 다시 해보는 걸로...