웹/TIL

0425 REST API

행복한 개복치 2022. 4. 25. 16:05

대부분의 OPEN API는 REST 방식으로 지원.

REST

: HTTP URI를 통해 제어할 자원을 명시하고, HTTP Method를 통해 해당 자원을 제어하는 명령을 내리는 방식의 아키텍처.

C - Post

R - Get

U - Put

D - Delete

구성 요소

  • 자원 - URI (어떤 게시물, 어떤 id를 다루고 있는지)
  • 행위 - HTTP Method (CRUD에 대한 표현)
  • 표현 - JSON, XML

자원을 표현할 때 Collection(객체 집합)과 Document(하나의 문서, 객체) 사용

ex) ~sports/baseball/players/31

 

보통 비동기 방식에서 사용

 

정해진 작성 규칙이 없고 이렇게 쓰더라~ 하는 암묵적 관례만 존재함

REST Service

기존에는 가공된 data를 이용하여 특정 플랫폼(언어나 웹/앱에 따라)에 적합한 형태의 view로 만들어서 반환했지만, REST service는 XML이나 JSON 형식(언어에 종속적이지 않은 data형식)의 data만 전달하고 view에 대해서는 신경 쓸 필요가 없다. 

Annotation

@RestController : Controller가 REST 방식을 처리하기 위한 것임을 명시

@RequestBody : JSON 데이터를 원하는 타입으로 바인딩

@ResponseBody : 뷰(.jsp)가 아닌 데이터 자체를 전달

@PathVariable : URL에 있는 값을 파라미터로 추출

@CrossOrigin : 접속할 수 있는 경로 설정(보안)

사용설정

1. pom.xml에서 jackson-databind 와 json 라이브러리 설정

변경사항

  • Service는 비지니스 로직 담당, MyBatis(Mapper)가 DB 담당. 때문에 Service에 있던 SqlSession을 지우고 Mapper를 직접 이용

-> root-context.xml에서 mybatis-spring scan 이용

<!-- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFactoryBean"></constructor-arg>
</bean> -->

<!-- mybatis에서 제공하는 scan 태그를 통해 repository interface들의 위치를 지정. -->
<mybatis-spring:scan base-package="com.ssafy.guestbook.model.mapper"/>

 

 

  • JSON 객체 사용
@GetMapping("/idcheck")
public @ResponseBody String idCheck(@RequestParam("ckid") String checkId) throws Exception {
    int cnt = memberService.idCheck(checkId);
    JSONObject json = new JSONObject();
    json.put("idcount", cnt);
    return json.toString();
}

 

 

  • jackson-databind 사용 시, 객체를 알아서 JSON 포맷의 문자열로 변환해줌
// 컨트롤러의 모든 메서드가 ajax 호출을 위해 ResponseBody를 써야함
// 이 때, RestController 로 표기하면 메서드마다 ResponseBody 표기를 안해도 됨
@RestController
@RequestMapping("/admin")
@CrossOrigin("*")
public class AdminController {

	private static final Logger logger = LoggerFactory.getLogger(AdminController.class);

	@Autowired
	private MemberService memberService;

	@RequestMapping(value = "/user", method = RequestMethod.GET, headers = { "Content-type=application/json" })
//	@ResponseBody ????
	public List<MemberDto> userList() throws Exception {
//		주석 처리한 코드처럼 직접 작성해줘도 됨
//		List<MemberDto> list = memberService.listMember();
//		logger.debug("회원 목록: {}", list);
//		JSONArray arr = new JSONArray();
//		for (MemberDto memberDto : list) {
//			JSONObject json = new JSONObject();
//			json.put("userid", memberDto.getUserId());
//			json.put("username", memberDto.getUserName());
//			json.put("userpwd", memberDto.getUserPwd());
//			json.put("email", memberDto.getEmail());
//			json.put("joindate", memberDto.getJoinDate());
//
//			arr.put(json);
//		}
//		JSONObject obj = new JSONObject();
//		obj.put("users", arr);
//		return obj.toString();
		return memberService.listMember();
	}