본문 바로가기

Archived(Programming)/Spring #2(기초)

Restful API

# OpenAPI

OpenAPI는 개방형 API로, 응용 프로그램을 개발할 때 사용하는 인터페이스라는 의미.

OpenAPI는 프로그래밍에서 사용할 수 있는 개방되어 있는 상태의 인터페이스를 말한다.

여러 포털과 관공서에서 데이터를 외부 응용 프로그램에서 사용할 수 있도록 Open API 형태로 제공

 

# REST(REpresentational Safe Transferful) API

HTTP URI + HTTP Method > HTTP URI를 통해 제어할 자원을 명시하고 HTTP Method를 통해 해당 자원을 제어하는 명령을 내리는 방식의 아키텍처를 의미한다

4가지의 HTTP Method

Restful API는 HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 어플리케이션 개발 인터페이스

(REST 원리를 따르는 시스템은 RestFul로 명칭)

 

기존의 웹 전근 방식과 RESTFul API 방식 차이점

기존의 게시판은 GET, POST만 활용하지만 RESTful 게시판은 4가지 메소드를 통해 CRUD 처리

URI제어하려는 자원을 의미하고 메소드처리하려는 방식을 의미

URI에서 CRUD 행위를 의미하는 동사를 제외하는 것이 핵심

RESTful 웹서비스와 JSON/XML

RESTful 방식에서는 데이터방식을 JSON 또는 XML을 주로 사용

메타데이터가 감소하고 데이터만 많이 있기에 대용량 데이터 사용에 유리(그러나, 정말 큰 빅데이터에서는 JSON 양식 조차 부담일 수도 있다)

 

# JSON(JavaScript Object Notation)

  • JSON은 경량의 DATA 교환 형식
  • Javascript에서 객체를 만들 때 사용하는 표현식을 의미
  • JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML 대체해 데이터 전송
  • 특정 언어에 종속되지 않으며 대부분의 프로그래밍 언어에서 JSON 포맷 데이터를 핸들링할 수 있는 library 제공

Name, Value 방식 사용

Array, List 표현가능

다른 언어와 호환 유리(Java: HashMap, Python: Dict 등)

Jackson 라이브러리를 통하면 JSON과 Java 객체를 바로 호환하여

연동할 수 있음.

 

JSON 형태로 서버에 들어오면 Java 객체로 변환되어 저장되고

 

이 데이터가 DB와 연동됨.

 

 

 

 

 

 

 

 

 

 SpringMVC 기반 RESTful 웹 서비스 구현 절차
RESTful Controller를 위한 핵심 어노테이션

# 실습 RESTful Servcie 개발

package kr.co.acomp.hello.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import kr.co.acomp.hello.service.BbsService;
import kr.co.acomp.hello.vo.Article;

@Controller
@RequestMapping("/bbs") 
public class BbsController {

	@Autowired 
	private BbsService bbsService;
	
	@RequestMapping("/{articleId}")
	@ResponseBody // return 되는 내용을 json으로 변형되서 날림
	public Article viewDetail(@PathVariable String articleId) {
		Article article = this.bbsService.viewArticleDetail(articleId);
		return article;
	}
	
	...
}
package kr.co.acomp.hello.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import kr.co.acomp.hello.dao.ArticleDAO;
import kr.co.acomp.hello.vo.Article;

@Service 
public class BbsService {
	@Autowired
	private ArticleDAO articleDAO;
	public void registArticle(Article article) {
		articleDAO.insertArticle(article);
	}
	public Article viewArticleDetail(String articleId) {
		return this.articleDAO.selectArticleById(articleId);
	}
}
package kr.co.acomp.hello.dao;

import org.springframework.stereotype.Repository;

import kr.co.acomp.hello.vo.Article;

@Repository // Repository Annotation
public class ArticleDAO {
	
	public void insertArticle(Article article) {
		System.out.println(article);
	}

	public Article selectArticleById(String articleId) {
		// 임의로 제작(원래는 DB와 연동)
		Article article = new Article(10, "yoon", "test", "test입니다." );
		
		return article;
	}
}

pom.xml에 jackson 라이브러리 추가

pom.xml에 dependency 추가 

참고로 처음에 2.8.9로 하니 계속 406에러가 발생했다.

구글링 해보니 아무래도 jackson 라이브러리가 제대로 안 먹히는 것 같아 1.9.13과 같은 낮은 버전으로 빌드 하니 정상작동 되었다.

 

글쓰기 만들기

package kr.co.acomp.hello.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.co.acomp.hello.service.BbsService;
import kr.co.acomp.hello.vo.Article;

@Controller
@RequestMapping("/bbs") 
public class BbsController {

	@Autowired 
	private BbsService bbsService;
	
	@RequestMapping("/{articleId}")
	@ResponseBody // return 되는 내용을 json으로 변형되서 날림
	public Article viewDetail(@PathVariable String articleId) {
		Article article = this.bbsService.viewArticleDetail(articleId);
		return article;
	}
	
	@RequestMapping(value = "/write", method=RequestMethod.POST)
	@ResponseBody
	public Article wrtie(@RequestBody Article article) {
		Article a = article ; // 객체 받아서 바로 할당
		return a;
	}
	...
}

'Archived(Programming) > Spring #2(기초)' 카테고리의 다른 글

JUnit4 & Spring Test  (0) 2020.03.13
Static file 처리와 FileUpload  (0) 2020.03.12
Http 파라미터 처리  (0) 2020.03.12
@Controller  (0) 2020.03.11
Spring MVC  (0) 2020.03.11