Address REST API Sever 구축 프로젝트🔎
REST API Server는 개발자에게 제공되는 기능들을 모아놓은 서버로 클라이언트 측 기능이 전혀 없다.
기존 사용했던 MVC 디자인 패턴에서 View 빠진 패턴으로 서버와 DB 통신만 이루어진다.
화면 구축이 없는 것이 각종 Open API 서버와 동일하다고 볼 수 있다.
파일 구성🔎
패키지(경로) | 파일명 |
com.test.controller | |
AddressController.java | |
RestController.java | |
com.test.domain | |
AddressDTO.java | |
com.test.persistence | |
AddressDAO.java(interface) | |
AddressDAOImpl.java |
RESE API Server는 view를 만들지 않는다.
환경 설정🔎
기초 설정
https://steady-record.tistory.com/entry/Spring-스프링-프로젝트-설정-일괄-적용
추가 설정_의존성 삭제 - pom.xml
REST와 행위가 겹치기 때문에 jackson-dataformat-xml, gson 삭제한다.
+) JUnit의 scope 삭제하기
단위테스트🔎
아래 글을 참고한다.
https://steady-record.tistory.com/entry/Spring-JUnit를-이용한-단위테스트JDBC-HikariCP-MyBatis
@ResponseBody 🔎
- AddressController.java
데이터 반환하기 - m1()
@GetMapping(value = "/m1.do")
public String m1(Model model) {
String name = "susukkang";
return name;
}
}
http를 돌려주는 것이 아니라 순수한 데이터만을 돌려주는 페이지를 만들고 싶을 때 위와 같이 작성하면 에러가 발생한다.
뷰 리졸버가 자동으로 views와 jsp를 붙여주기 때문에 데이터로 전달되지않기 때문이다.
@ResponseBody
@GetMapping(value = "/m1.do")
public @ResponseBody String m1(Model model) {
String name = "susukkang";
return name;
}
반환값 앞에 @ResponseBody 어노테이션을 붙인다.
컨트롤러는 jsp를 찾지않고 무조건 return 안에 있는 데이터를 사용자에게 그대로 반환한다.
JSON 반환하기 - m2()
@GetMapping(value = "/m2.do")
public @ResponseBody AddressDTO m2(Model model) {
AddressDTO dto = new AddressDTO();
dto.setSeq("1");
dto.setName("수수깡");
dto.setGender("f");
dto.setAddress("서울시 강남구 역삼동");
dto.setAge("20");
dto.setRegdate("2023-11-29");
return dto;
}
@ResponseBody로 DTO를 넘기게 되면 JSON 형식으로 반환한다. 사용자가 JSON 형식으로 작성하는 것보다. 생산 속도 향상 및 오타 에러 발생확률이 현저히 적다.
주로 RESTful 웹 서비스에서 JSON 또는 XML 형식의 데이터를 반환하는 데 사용된다.
JSON 반환하기 - m3()
@GetMapping(value = "/m3.do")
public @ResponseBody List<AddressDTO> m3(Model model) {
List<AddressDTO> list = new ArrayList<AddressDTO>();
AddressDTO dto = new AddressDTO();
dto.setSeq("1");
dto.setName("수수깡");
dto.setGender("f");
dto.setAddress("서울시 강남구 역삼동");
dto.setAge("20");
dto.setRegdate("2023-11-29");
AddressDTO dto2 = new AddressDTO();
dto2.setSeq("2");
dto2.setName("수수강");
dto2.setGender("m");
dto2.setAddress("서울시 강남구 역삼동");
dto2.setAge("26");
dto2.setRegdate("2023-11-29");
list.add(dto);
list.add(dto2);
return list;
}
REST Client Tool🔎
- RESTful 웹 서비스를 테스트하고 디버그하는 데 사용되는 도구이다.
- 이 도구들은 HTTP 요청을 생성하고 서버로 보내며, 서버의 응답을 확인하는 데 도움을 준다.
- REST Client Tool은 다양한 기능과 사용자 친화적인 인터페이스를 제공하여 REST API를 쉽게 테스트할 수 있다.
- 브라우저에서 할 수 없는 PUT, PATCH, DETELE 메소드를 요청할 수 있다.
- REST Client Tool 종류
1. curl(Windows Terminal)
2. Postman
3. Insomnia
4. VS Code
- Windows Terminal (curl) 설치
기존 cmd의 업그레이드 버전으로 명령 프롬프트와 PowerShell은 물론 WSL까지 통합된 가상 터미널 애플리케이션이다.
1. Microsoft Stroe 검색
2. terminal 검색 후 'Windows Terminal' 설치
3. 프로그램 실행
화살표 클릭
4. 설정 - 시작
기본 프로필 : 명령 프롬포트
기본 터미널 응용프로그램 : Windows 터미널
5. 코드 실행
curl -X GET http://localhost:8090/rest/m1.do
curl -X GET http://localhost:8090/rest/m2.do
curl -X GET http://localhost:8090/rest/m3.do
📢 window shell 창에서 실행하면 에러가 발생하므로 명령 프롬포트로 잘 바꿔준다.
- Postman
1. 사이트 접속
2. 운영체제 별 다운로드
3. 다운로드
4. 설치 후 실행
로그인 없이 진행하려면 우측 중앙 'lightweight API Client'를 클릭한다.
5. 요청
http://localhost:8090/rest/m1.do 요청
요청 메소드와 주소를 입력하고 'Send' 버튼을 누르면 화면 하단 Body에 결과값이 출력된다.
http://localhost:8090/rest/m3.do 요청
JSON으로 잘 반환되었다.
- VS code
1. 'REST Client' 확장팩 설치
2. http 형식의 파일 생성
'요청메서드' + 'http 주소' 입력 후 코드 윗 라인의 'Send Response' 클릭하면 우측에 결과 페이지가 띄어진다.
GET http://localhost:8090/rest/m1.do
GET http://localhost:8090/rest/m3.do
@RestController 🔎
- RESTController.java
저장하기 - add()
package com.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.test.domain.AddressDTO;
import com.test.persistence.AddressDAO;
@RestController
public class RESTController {
@Autowired
private AddressDAO dao;
@PostMapping(value="/address")
public int add(AddressDTO dto) {
return dao.add(dto);
}
}
@RestController
@Controller와 @ResponseBody를 합쳐놓은 것으로, 컨트롤러 클래스에 사용되면 해당 컨트롤러의 모든 메서드의 반환 값이 HTTP 응답 본문으로 직접 전송되게 된다.
AddressDAOImpl.java
@Override
public int add(AddressDTO dto) {
return this.template.insert("rest.add", dto);
}
rest.xml
<insert id="add" parameterType="com.test.domain.AddressDTO">
insert into tblAddress (seq, name, age, gender, address, regdate) values (seqAddress.nextVal, #{name}, #{age}, #{gender}, #{address}, default)
</insert>
Postman 으로 요청하기
요청메소드와 요청 주소를 기재하고 아래 Params 탭을 이용하여 Key, Value 값을 입력하여 자동으로 주소 뒤에 값이 합성된다.
결과로 업데이트 된 행의 수가 반환된다.
DB를 확인해보면 데이터가 잘 들어온 것을 확인할 수 있다.
JSON 전달하기
@PostMapping(value="/address")
public int add(@RequestBody AddressDTO dto) {
return dao.add(dto);
}
@RequestBody
JSON 또는 XML 형식의 데이터를 HTTP 요청의 본문에 담아서 서버에 전송하는 경우, @RequestBody 어노테이션을 사용하여 해당 데이터를 자바 객체(AddressDTO 객체)로 변환한다.
Postman 으로 JSON 전달하기
Body 탭 - raw - Text 중에서 JSON 선택
결과로 업데이트 된 행의 수가 반환된다.
DB를 확인해보면 데이터가 잘 들어온 것을 확인할 수 있다.
목록보기 - List()
REST API 사용할 때는 설계부터 하는 것이 편하다.
<List() 설계>
1. 요청 주소 : http://localhost:8090/rest/address
2. 요청 메소드 : GET
3. 리턴 타입 : List<DTO>
RESTController.java
@GetMapping(value = "/address")
public List<AddressDTO> list() {
return dao.list();
}
add() 와 Mapping 주소는 같지만 요청하는 방식이 다르다.
AddressDAOImpl.java
@Override
public List<AddressDTO> list() {
return this.template.selectList("rest.list");
}
rest.xml
<select id="list" resultType="com.test.domain.AddressDTO">
select * from tblAddress order by name
</select>
수정하기 - edit()
<edit() 설계>
1. 요청 주소 : http://localhost:8090/rest/address/primaryKey
2. 요청 메소드 : PUT or PATCH (PUT을 주로 사용한다.)
3. 리턴 타입 : int
RESTController.java
@PutMapping(value="/address/{seq}")
public int edit(@RequestBody AddressDTO dto, @PathVariable String seq) {
dto.setSeq(seq);
return dao.edit(dto);
}
@PathVariable은 URI의 일부를 변수로 받아온다. @RequestParam 사용법과 유사하다.
글 번호와 수정 내용을 입력받았으므로 dto로 한 번 더 포장하여 dao로 전달한다.
AddressDAOImpl.java
@Override
public int edit(AddressDTO dto) {
return this.template.update("rest.edit", dto);
}
rest.xml
<update id="edit" parameterType="com.test.domain.AddressDTO">
update tblAddress set name = #{name}, age = #{age}, gender = #{gender}, address = #{address} where seq = #{seq}
</update>
Postman
브라우저는 put, patch를 요청할 수 없어 Client Tool를 사용해야한다.
결과 조회
삭제하기 - del()
<del() 설계>
1. 요청 주소 : http://localhost:8090/rest/address/primaryKey
2. 요청 메소드 : DELETE
3. 리턴 타입 : int
RESTController.java
@DeleteMapping(value="/address/{seq}")
public int del(@PathVariable String seq) {
return dao.del(seq);
}
AddressDAOImpl.java
@Override
public int del(String seq) {
return this.template.delete("rest.del", seq);
}
rest.xml
<delete id="del" parameterType="String">
delete tblAddress where seq = #{seq}
</delete>
Postman
결과 조회
검색하기(=상세보기) - get()
<get() 설계>
1. 요청 주소 : http://localhost:8090/rest/address/primaryKey
2. 요청 메소드 : GET
3. 리턴 타입 : DTO
RESTController.java
@GetMapping(value = "/address/{seq}")
public AddressDTO get(@PathVariable("seq") String seq) {
return dao.get(seq);
}
AddressDAOImpl.java
@Override
public AddressDTO get(String seq) {
return this.template.selectOne("rest.get", seq);
}
rest.xml
<select id="get" parameterType="String" resultType="com.test.domain.AddressDTO">
select * from tblAddress where seq = #{seq}
</select>
Postman
📢배포를 위한 lib 설정
나중에 프로젝트를 배포한다면 lib 설정을 따로 해줘야한다.
1. 프로젝트 우클릭 - Properties
2. Deployment Assembly - Apply
3. Maven Dependencies 선택 후 Add - Java Bulid Path Entries
4. 설정할 라이브러리 선택
5. 추가 확인
'Spring' 카테고리의 다른 글
[Spring] WebSocket 기초 예제 (0) | 2023.12.01 |
---|---|
[Spring] MyBatis 와 Spring 연동하기(3) : Interface Mapper를 사용한 연동 (0) | 2023.12.01 |
[Spring] JUnit를 이용한 단위테스트(JDBC, HikariCP, MyBatis) (0) | 2023.11.30 |
[Spring] Spring AOP : @Aspect 사용하기 (0) | 2023.11.29 |
[Spring] Apache Commons IO 라이브러리(2) : 다중 file 입출력 (0) | 2023.11.29 |