Rest API
Representational State Transfer API
Rest VS RESTful
📍REST
- 아키텍처 스타일: REST는 웹과 같은 분산 시스템의 아키텍처를 설계하기 위한 원칙과 제약 조건을 정의한다. REST는 리소스(데이터)와 그 상태를 표현하는 방법에 중점을 두고 있다.
- 제약 조건: REST는 통일된 인터페이스, 상태 비저장성, 캐싱, 계층화된 시스템 등 여러 가지 제약 조건을 포함한다. 이러한 제약 조건은 시스템의 확장성과 유연성을 높이는 데 기여한다.
- 리소스 중심: REST는 리소스(예: 사용자, 제품 등)를 중심으로 설계되며, 각 리소스는 URI(Uniform Resource Identifier)를 통해 식별된다.
📍RESTful
- HTTP 메서드 중심: RESTful은 HTTP 프로토콜을 사용하는 웹 서비스의 설계 방식. RESTful API는 HTTP 메서드(예: GET, POST, PUT, DELETE)를 사용하여 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행한다.
- 모범 사례: RESTful API는 일반적으로 HTTP 메서드와 URI를 조합하여 리소스를 조작한다. 예를 들어, GET /users는 사용자 목록을 가져오고, POST /users는 새로운 사용자를 생성하는 식이다.
- 상태 유지: RESTful 설계는 REST의 상태 비저장성 원칙을 따르지만, 실제 구현에서 클라이언트와 서버 간의 상태를 관리하는 방법이 다양할 수 있다.
html에서 전체적으로 비동기 호출방식으로 구현하였다.
<ul>
<li><a id="get" href="/api/article">Article 목록조회 Get</a></li>
<li><a id="getOne" href="/api/article">한개 Article 조회 Get</a></li>
<li><a id="post" href="/api/article">새글 추가 Post</a></li>
<li><a id="patch" href="/api/article">글 수정 Patch</a></li>
<li><a id="delete" href="/api/article">글 삭제 Delete</a></li>
<li> </li>
<li><a id="transaction1" href="/api/transaction-test">트랜잭션 테스트(오류3개저장됨)</a></li>
<li><a id="transaction2" href="/api/transaction-test2">트랜잭션 테스트(0개 저장됨)</a></li>
</ul>
const outputEl = document.querySelector('#output')
const aElList = document.querySelectorAll('a'); // 모든 a tag
aElList.forEach( function( aEl ) {
aEl.onclick = function( e ) {
e.preventDefault(); // 기본이벤트를 취소: a tag 를 누르면 href로 이동한다
e.stopPropagation();
switch( aEl.id )
@Controller : 해당하는 View 파일로 제어를 이동
return : String(viewname), ModelAndView
@RestController : DATA를 돌려받는다. (모든 type 가능 ) : @Controller + @ResponseBody
METHOD : Get, POST, DELETE, PUT
결과 : String data ( text, xml, json (추천) ) 형태
REST METHOD CRUD
CREATE | POST |
READ | GET |
UPDATE | PUT, PATCH |
DELETE | DELETE |
🧩HTML
a태그나 input type="submit" 또는 button type="submit" 요소를 포함하는 form 태그는 GET방식으로 요청하게 된다.
그 외에 <form method="POST"> , <form method="DELETE"> 와 같이 요청방식을 지정할 수 있다.
전체적으로 비동기 호출방식으로 구현하였다.
1.GET
get은 select같은 역할을 한다.
🌿목록조회
case "get": // 목록조회
//alert("get");
fetch( aEl.href )
.then((response) => response.json())
.then(( articleList ) => {
console.log(articleList)
displayList( articleList, outputEl )
})
@Slf4j
@RestController
public class ArticleApiController {
@Autowired
private ArticleService articleService;
@GetMapping(value = "/api/article",
produces = MediaType.APPLICATION_JSON_VALUE )
public List<Article> list( ) {
List<Article> list = articleService.getList();
System.out.println( "server data"+list );
return list;
}
get방식의 요청을 자동을 매핑한다.
- Get : /api/article 목록조회
- 결과 출력 : json으로 출력하라
- MediaType
MediaType은 MIME 타입을 정의하는 클래스. MIME 타입은 웹에서 전송되는 데이터의 형식을 나타내며, 클라이언트가 어떤 형식의 데이터를 기대하는지를 알려준다. - APPLICATION_JSON_VALUE
APPLICATION_JSON_VALUE는 MediaType 클래스에서 제공하는 상수로, JSON 형식을 나타내는 MIME 타입인 application/json을 의미합니다. 즉, 이 값은 메서드가 JSON 형식의 데이터를 반환할 것임을 나타냅니다. - produces = "application/json;charset=utf-8")
produces = "application/xml;charset=utf-8") ~> JACKSON 라이브러리 추가
🌿게시글 한 개 조회
case "getOne": // 한개 조회
const numId = document.querySelector('#id').value;
// /api/article/3
fetch( aEl.href + "/" + numId )
.then( response => response.json() ) // JSON.parse(넘어온 data) -> json
.then( article => {
console.dir(article)
display(article)
} ) // 정상
.catch( error => {
console.log(error)
alert(error)
}) // 오류처리
break;
// GetOne : 1개 만 조회
@GetMapping("/api/article/{id}")
public Article show(@PathVariable("id") Long id) {
Article article = articleService.getArticle( id );
log.info("====== article:", article);
return article;
}
2.POST
insert와 같은 역할을 한다.
3.PATCH/PUT
Update와 같은 역할을 한다.
4.DELETE
delete와 같은 역할을 한다.
'SPRING BOOT' 카테고리의 다른 글
[spring boot] Spring Security (0) | 2024.11.18 |
---|---|
restserver,restclient (0) | 2024.11.16 |
[spring boot] HTTP호출방식 (0) | 2024.11.11 |
[spring boot] JPA와 H2 데이터베이스로 간단한 게시판 만들기 (0) | 2024.11.09 |
[spring boot] 머스태치(mustache)/JPA (0) | 2024.11.08 |