이전 게시글에서 스프링 코드를 작성하기 위한 기본 폼을 만들어 보았다.
이번에는 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 서버를 구현하는 데 있어서 나름 중요하다고 생각하는 로직에 대해서 설명해 볼 것이다.