
이전 게시글에서 스프링 코드를 작성하기 위한 기본 폼을 만들어 보았다.
이번에는 Response 클래스와 스프링 작성법에 대해 알아보도록 하자.
API서버를 만들고, 데이터를 프론트와 주고받기 위해서는
@ResponseBody라는 어노테이션으로 데이터를 body에 담아 보내게 된다. 이 때, API 응답 반환값을 프론트에서 처리해 주기 위해 raw data를 주는 것이 아니라, 폼에 담아 보낼 필요가 있다.
다음 코드는 우리가 만든ResponseForm이다.
ResponseForm.class
@Data public class ResponseForm { private String msg; private boolean success; private Object data; public ResponseForm setError(String msg) { this.msg = msg; this.success = false; return this; } public ResponseForm setSuccess(Object data) { this.success = true; this.data = data; return this; }
ResponseForm 클래스는 세 개의 필드를 가지고 있다.
msg: 응답 메시지
success: 요청의 성공 여부를 나타내는 boolean 값
data: API가 반환하는 데이터를 저장
함수는 두 가지가 있는데, 응답 성공과 실패이다.
setError: 응답 실패이다.
실패하였기에 당연히success = false로 설정해 주었고,msg에는 실패한 이유를 담을 수 있게 하였다.data는 당연히 null이다.
setSuccess: 응답 성공이다.
유효성 검사와 에러 등을 전부 통과하고 정상적으로 데이터가 반환된 경우이다.success = true,data = data,msg는 성공하였기 때문에 따로 담지 않는다.
이제 엔티티, Response 클래스, 컨트롤러/서비스/레포지토리 기본 세팅이 끝났으니 간단히 작성방법에 대해 알아보도록 하자.
먼저 알아볼 것은 Entity 작성방법이다.
만약, 테이블의 컬럼으로data1,data2,msg를 넣고 싶다면 다음과 같이 작성하면 된다.//테스트 엔티티 @Entity @Table(name = "tests") @Data @Builder @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper=false) public class Test extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "data1") private Long data1; @Column(name = "data2") private Long data2; @Column(name = "msg") private String msg; }
다음 알아볼 것은 Controller 작성방법이다.
@RestController @RequestMapping("/tests") @RequiredArgsConstructor public class TestController { private final TestService testService //테스트 함수 @ResponseBody @GetMapping("/asdf/{param1}/{param2}") public ResponseForm join( @PathVariable("param1") Long data1, @PathVariable("param2") Long data2, String msg) { return testService.testFunc(data1, data2, msg); } }위의 코드는 테스트용 컨트롤러이다.
@ResponseBody로 리턴값을body에 담아 보낼 수 있도록 하자.
함수의 리턴값은ResponseForm이다.
- @~Mapping을 사용해 매핑 방식을 정하도록 하자.
GetMapping(데이터 열람에 사용)
PostMapping(데이터를 DB에 등록할때 사용)
PutMapping(데이터 수정에 사용)
DeleteMapping(데이터 삭제에 사용)꼭 역할대로 또는 이대로 하지 않아도 되지만 가장 보편적으로 쓰이는 방법일 것이다.
- 매핑 주소를 정하자.
위의 테스트 코드 함수에서는
/asdf/{param1}/{param2}로 되어 있다.
컨트롤러의 주소는/tests이므로testFunc에data1 = 1,data2 = 2를 넣고 싶다면 프론트에서 GetMapping으로호스트주소/tests/asdf/1/2를 요청하면 된다.
- 함수 인자를 세팅하자.
3번처럼 주소를 통해서 값을 받을 때에는
@PathVariable을 사용하여 함수 인자로 만들 수 있다. 필요가 없다면 사용하지 않아도 된다.
@PathVariable을 사용하지 않을 때에는 일반 변수로 적고 프론트에서 같은 이름으로 데이터를 전달하면 된다.
- 함수 로직을 작성하자.
데이터를 받았을 때, 필요한 기능을 수행하고 결과를 리턴할 수 있게 하자.
테스트 코드에서는 바로 서비스 함수를 리턴한다.
서비스 함수를 작성해 보자.
아래는 간단한 서비스 로직으로 만들어 본 테스트 함수이다.@Service @Transactional @RequiredArgsConstructor public class TestService { private final TestRepository testRepository; // 테스트 함수 public ResponseForm testFunc(Long data1, Long data2, String msg) { ResponseForm res = new ResponseForm(); Test test = testRepository.findByData1AndData2(data1, data2); if (test == null) return res.setError("null"); test.setMsg(msg); return res.setSuccess(testRepository.save(test)); } }
- 컨트롤러에서 불러왔던 함수의 형식대로 서비스에서 함수를 만든다.
리턴타입
ResponseForm, 함수인자 3개 그대로 함수를 만든다.
ResponseForm을 만든다.
new ResponseForm()으로 새 응답 객체를 만든다.
- 함수 로직을 작성한다.
이 함수에서는
data1과data2로Test객체를 찾아msg를 수정한다.
그래서testRepository.findByData1AndData2함수로 객체를 데이터베이스에서 찾고,test.setMsg함수를 사용해 수정한 뒤 responseForm에 담아 리턴한다.
(setMsg함수는 엔티티가 작성되어 있다면lombok@Data를 통해 기본 생성되어 있다.)
이제 레포지토리 함수를 만들어 보자.
public interface TestRepository extends JpaRepository<Test, Long> { // 테스트 함수 Test findByData1AndData2(Long data1, Long data2); }레포지토리 함수는 간단하게 서비스에서 작성했던 JPA 함수를 리턴타입과 함께 그대로 만들면 된다.
더 간단하게는 마우스를 올리고 있으면 나오는
Create method 'findByData1AndData2' in 'TestRepository'
혹은
ALT + SHIFT + ENTER
를 누르면 자동으로 만들어준다.
작성이 다 끝났다. 이제 프로젝트 안에 있는
프로젝트명+Application으로 된 클래스를 우클릭해서Run을 눌러 보자.
문제없이 잘 동작했다면, MySql 데이터베이스에
tests테이블이 생기고, 안에id,data1,data2,msg, 라는 테이블이 생겨나 있을 것이다.
http://localhost:포트번호/tests/asdf/1/2를 브라우저 주소에 쳐 보자. 페이지에responseForm이 뜨면 작동이 잘 된 것이다.
(GetMapping이기에 주소창으로 접근이 가능하고 DB에 데이터가 없기 때문에success = false일 것이다.)
이 게시글에서는 테스트용 클래스를 이용한 간단한 로직에 대한 설명만 하였다.
JPA Repository함수 작성 방법이라던지, 더미 데이터, 어노테이션 등등은 직접 찾아보는 편이 빠를 것이다.
다음 게시글부터는 우리 프로젝트의 API 서버를 구현하는 데 있어서 나름 중요하다고 생각하는 로직에 대해서 설명해 볼 것이다.