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-스프링-프로젝트-설정-일괄-적용
[Spring] 스프링 프로젝트 설정 일괄 적용
pom.xml 상단 groupId, artifactID 프로젝트 맞춰 작성하기 4.0.0 (com.test)프로젝트에 맞춰 바꾸기 (code)프로젝트에 맞춰 바꾸기 (Code)프로젝트에 맞춰 바꾸기 war 1.0.0-BUILD-SNAPSHOT 11 5.0.7.RELEASE 1.6.10 1.6.6 org.sp
steady-record.tistory.com
추가 설정_의존성 삭제 - pom.xml
REST와 행위가 겹치기 때문에 jackson-dataformat-xml, gson 삭제한다.
+) JUnit의 scope 삭제하기
단위테스트🔎
아래 글을 참고한다.
https://steady-record.tistory.com/entry/Spring-JUnit를-이용한-단위테스트JDBC-HikariCP-MyBatis
[Spring] JUnit를 이용한 단위테스트(JDBC, HikariCP, MyBatis)
JUnit🔎 Java 언어를 위한 단위 테스트 프레임워크 중 하나로, 소프트웨어의 각 부분이 의도한 대로 작동하는지를 확인하는 데 사용된다. 단위 테스트(설정 테스트)🔎 단위테스트는 각각의 메소
steady-record.tistory.com
@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. 사이트 접속
Postman API Platform | Sign Up for Free
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
www.postman.com
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 |