#04 API Response 클래스 및 스프링 작성방법

김대진·2023년 3월 20일
0

Sekkison Project

목록 보기
5/22
post-thumbnail

이전 게시글에서 스프링 코드를 작성하기 위한 기본 폼을 만들어 보았다.
이번에는 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 클래스, 컨트롤러/서비스/레포지토리 기본 세팅이 끝났으니 간단히 작성방법에 대해 알아보도록 하자.

1. Entity

먼저 알아볼 것은 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;
}

2. Controller

다음 알아볼 것은 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);
    }
}

위의 코드는 테스트용 컨트롤러이다.

  1. @ResponseBody로 리턴값을 body에 담아 보낼 수 있도록 하자.
    함수의 리턴값은 ResponseForm이다.
  1. @~Mapping을 사용해 매핑 방식을 정하도록 하자.

GetMapping (데이터 열람에 사용)
PostMapping (데이터를 DB에 등록할때 사용)
PutMapping (데이터 수정에 사용)
DeleteMapping (데이터 삭제에 사용)

꼭 역할대로 또는 이대로 하지 않아도 되지만 가장 보편적으로 쓰이는 방법일 것이다.

  1. 매핑 주소를 정하자.

위의 테스트 코드 함수에서는 /asdf/{param1}/{param2}로 되어 있다.
컨트롤러의 주소는 /tests 이므로 testFuncdata1 = 1, data2 = 2를 넣고 싶다면 프론트에서 GetMapping으로 호스트주소/tests/asdf/1/2를 요청하면 된다.

  1. 함수 인자를 세팅하자.

3번처럼 주소를 통해서 값을 받을 때에는 @PathVariable을 사용하여 함수 인자로 만들 수 있다. 필요가 없다면 사용하지 않아도 된다.
@PathVariable을 사용하지 않을 때에는 일반 변수로 적고 프론트에서 같은 이름으로 데이터를 전달하면 된다.

  1. 함수 로직을 작성하자.

데이터를 받았을 때, 필요한 기능을 수행하고 결과를 리턴할 수 있게 하자.
테스트 코드에서는 바로 서비스 함수를 리턴한다.

3. Service

서비스 함수를 작성해 보자.
아래는 간단한 서비스 로직으로 만들어 본 테스트 함수이다.

@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));
    }
}
  1. 컨트롤러에서 불러왔던 함수의 형식대로 서비스에서 함수를 만든다.

리턴타입 ResponseForm, 함수인자 3개 그대로 함수를 만든다.

  1. ResponseForm을 만든다.

new ResponseForm()으로 새 응답 객체를 만든다.

  1. 함수 로직을 작성한다.

이 함수에서는 data1data2Test객체를 찾아 msg를 수정한다.
그래서 testRepository.findByData1AndData2 함수로 객체를 데이터베이스에서 찾고, test.setMsg 함수를 사용해 수정한 뒤 responseForm에 담아 리턴한다.
(setMsg 함수는 엔티티가 작성되어 있다면 lombok @Data를 통해 기본 생성되어 있다.)

4. Repository

이제 레포지토리 함수를 만들어 보자.

public interface TestRepository extends JpaRepository<Test, Long> {
	// 테스트 함수
	Test findByData1AndData2(Long data1, Long data2);
}

레포지토리 함수는 간단하게 서비스에서 작성했던 JPA 함수를 리턴타입과 함께 그대로 만들면 된다.

더 간단하게는 마우스를 올리고 있으면 나오는
Create method 'findByData1AndData2' in 'TestRepository'
혹은
ALT + SHIFT + ENTER
를 누르면 자동으로 만들어준다.

5. Execute

작성이 다 끝났다. 이제 프로젝트 안에 있는 프로젝트명+Application으로 된 클래스를 우클릭해서 Run을 눌러 보자.

문제없이 잘 동작했다면, MySql 데이터베이스에 tests테이블이 생기고, 안에 id, data1, data2, msg, 라는 테이블이 생겨나 있을 것이다.

http://localhost:포트번호/tests/asdf/1/2를 브라우저 주소에 쳐 보자. 페이지에 responseForm이 뜨면 작동이 잘 된 것이다.
(GetMapping이기에 주소창으로 접근이 가능하고 DB에 데이터가 없기 때문에 success = false일 것이다.)

마무리

이 게시글에서는 테스트용 클래스를 이용한 간단한 로직에 대한 설명만 하였다. JPA Repository 함수 작성 방법이라던지, 더미 데이터, 어노테이션 등등은 직접 찾아보는 편이 빠를 것이다.

다음 게시글부터는 우리 프로젝트의 API 서버를 구현하는 데 있어서 나름 중요하다고 생각하는 로직에 대해서 설명해 볼 것이다.

profile
만재 개발자

0개의 댓글