이전 글과 이어서 진행됩니다.
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 |