241105 RESTful (PUT/DELETE/문제)

이전 글과 이어서 진행됩니다.

RESTful 실습 3 (PUT/DELETE)

controller

package pack.controller;

import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PutController {
	
	@PutMapping(value = "/hiput")
	public String put1() { // 용도는 자료 수정
		System.out.println("put 요청1 처리");
		return "PUT 요청1 결과";
	}
	
	@PutMapping(value = "/hiput2")
	public String put2(@RequestBody PostDataBean postDataBean) { // 폼빈
		String name = postDataBean.getName();
		String addr = postDataBean.getAddr();
		System.out.println("put 요청2 처리");
		return "수정용 이름 : " + name + ", 주소 : " + addr;
	}
}

test3

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function func1(){
	fetch("/hiput",{
		method:"PUT"
	})
	.then(response => {
		if(!response.ok){
			throw new Error("response 오류");
		}
		return response.text();
	})
	.then(data => {
		document.querySelector("#result").innerText = data;
	})
	.catch(error => {
		document.querySelector("#result").innerText = "err : " + error; 
	});
}
function func2(event){
	event.preventDefault(); // 버튼의 submit 기능 죽이기
	const name = document.querySelector("#putFrm input[name='name']").value;
	const addr = document.querySelector("#putFrm input[name='addr']").value;
	const jdata = JSON.stringify({name:name, addr:addr});
	console.log(jdata);
	fetch("/hiput2",{
		method:"PUT",
		headers:{
			"Content-Type":"application/json"
		},
		body:jdata
	})
	.then(response => {
		if(!response.ok){
			throw new Error("response 오류2");
		}
		return response.text();
	})
	.then(data => {
		document.querySelector("#result").innerText = data;
	})
	.catch(error => {
		document.querySelector("#result").innerText = "err2 : " + error; 
	});
}
</script>
</head>
<body>
<h2>RESTfull API TEST : PUT</h2>
<button onclick="func1()">PUT 요청1</button>
<br/>
<form id="putFrm" onsubmit="func2(event)">
  <input type="text" name="name">
  <input type="text" name="addr">
  <button type="submit">PUT 요청2 - JSON</button>
</form>
<hr/>
<div id="result"></div>
</body>
</html>

결과

Postman 결과


RESTful 실습 4 (DELETE)

controller

package pack.controller;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DeleteController {

	@DeleteMapping(value = "/hidelete/{num}") // {num} 해당 레코드만 지우기
	public String delete(@PathVariable("num")String num) {
		System.out.println("delete 요청 처리"); // num을 들고 삭제 작업을 진행...
		return "delete 대상 번호 : " + num;
	}
}

test4

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function func1(){
	const num = document.querySelector("#delNum").value;
	fetch(`/hidelete/${num}`,{
		method:"DELETE"
	})
	.then(response => {
		if(!response.ok){
			throw new Error("response 오류");
		}
		return response.text();
	})
	.then(data => {
		document.querySelector("#result").innerText = data;
	})
	.catch(error => {
		document.querySelector("#result").innerText = "err : " + error; 
	});
}
</script>
</head>
<body>
<h2>RESTfull API TEST : DELETE</h2>
<input type="text" id="delNum" placeholder="삭제할 번호 입력">
<button onclick="func1()">DELETE 요청</button>
<br/>
<hr/>
<div id="result"></div>
</body>
</html>

결과

Postman 결과


스웨거(Swagger)

REST 웹 서비스를 제공하려면 프론트엔드 개발자에게 전달해줄 API문서가 필수적이다
일반적으로 postman과 같은 툴을 많이 사용하고 있다. 그런데 이 작업이 다소 번거로운 점이 있다.
스프링 버전 3.0 이상 부터 사용할 수 있는 스웨거가 나왔다. 포스트맨을 대신할 수 있는 라이브러리이다.
Swagger는 RESTFul 개발 초기 단계나 API 문서화를 위해 유용하며, 클라이언트 화면 없이도 웹에서 API 요청과 응답을 확인할 수 있어 Postman과 유사한 역할을 한다.

 

안될 때만 해주기

application.properties
springdoc.api-docs.enabled=true
springdoc.swagger-ui.enabled=true

 

⏱ 라이브러리 설치 후 실행하기

build.gradle 에 아래 내용을 추가해 준다. 이 것으로 설치 끝
dependencies {
         ...
         implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'
}

 

Refresh Gradle Project 진행 후 이클립스 껐다가 켜주기

http://localhost/swagger-ui/index.html


문제

1. Postman 을 사용하여 확인 후
2. HTML으로 출력하기

결과

에러

🚨 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Could not determine recommended JdbcType for Java type 'pack.model.JikwonDto'

> GogekDto에 JikwonDto를 넣어줘야 하는데 Gogek Entity에 JikwonDto를 넣어줘서 에러 났음, 해결!
Entity에는 DTO를 넣으면 안됨! 잊지말자~

생각

세 개이상의 테이블이 조인되었을 때 가장 높은 주체의 Entity의 DTO를 이용해주자!!
그래야 쉽게 연관된 모든 테이블의 데이터를 읽어낼 수 있다!!

'Study > Acorn' 카테고리의 다른 글

241107 RESTful / AOP  (3) 2024.11.07
241106 RESTful (CRUD/문제)  (1) 2024.11.07
241105 RESTful (GET/POST)  (2) 2024.11.05
241104 AJAX (DB연동/문제)  (0) 2024.11.04
241101 AJAX (jQuery/fetch then/AXIOS)  (0) 2024.11.04