4주차부터 5주차까지 2주동안 주특기주차라고 해서 개발자 내에서도 여러가지로 분류가 되지만 크게 프론트엔드, 백엔드로 나뉘어지는데
나는 백엔드 중에서도 스프링을 주특기로 선택하였다. 그 전에 스프링을 이용해서 학교에서 게시판, 개인적으로 포토앨범 프로젝트를 CRUD를 경험해보고자 진행을했었는데 몇개월이 지난 지금 기억이 가물가물해진 상태이기 때문에 차근차근 익혀나가려고한다.
Rest API란 개발자가 서버에서 클라이언트로 데이터를 유연성있게 제공하기 위해 사용하는 것이 Rest API이다.
HTTP 프로토콜을 통해 데이터 생성, 읽기, 업데이트, 삭제 기능을 수행하는데 이를 CRUD라고도 하며 클라이언트에서 요청하는 정보를 제공하고 정보에따라 수행하는 작업을 4가지로 분류하여 수행한다.
GET = 데이터 가져오기, POST = 데이터 등록, UPDATE = 데이터 업데이트 , DELETE = 데이터 삭제
Path Variable을 이용하면 클라이언트에서 서버로 요청을 보낼때 데이터를 함께 보낼수 있다.
@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);
}
클라이언트에서 서버로 데이터를 보낼때 URL경로 마지막에 ?와 &을 이용해 보낼수 있다.
<form method="POST" action="/hello/request/form/model">
<div>
이름: <input name="name" type="text">
</div>
<div>
나이: <input name="age" type="text">
</div>
<button>전송</button>
</form>
프론트부분인데 name의 "name"과 "age"에 데이터가 담겨
Controller의 @RequestParam String name, @RequestParam int age로 데이터가 전달된다.
@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);
}
클라이언트에서 데이터를H Java객체의 형태로 받기 위해 사용하는 애너테이션이다. 이를 통해 데이터베이스에 정보를 저장 할 수도 있게 된다.
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
Star 객체의 필드 값인 name과 age에 자동으로 값이 저장된다.
클라이언트의 HTTP Body에서 서버에 데이터를 전달할 때 @RequestBody를 사용하면 JSON형태로 전달되기 때문에 HTTP Body의 데이터를 Java 객체 형태로 전달 할 수 있다.
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
데이터를 Java 객체로 받을 때 주의사항이 있다.
set 또는 get 메서드나 오버로딩된 생성자가 필요하다
DTO란 Data transfer Object의 줄임말이다. 쉽게 말해 데이터를 들고 다니는 놈이라고 생각하면 된다고 기술매니저님이 말씀해주셨다.
풀어서 설명하자면 클라이언트에서 제공하는 name 데이터와 age 데이터를 dto 클래스를 하나 생성하고 필드로 name과 age와 이 둘의 getter를 만든 후 RequestBody 애너테이션을 이용하여 Controller에서 데이터를 받으면 된다
@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;
}