@JsonProperty("result_code")
private String resultCode;
api에서는 snake case를 쓰기 때문에 맞춰야한다. 이 때 data 하나 하나당 JsonProperty라는 annotation을 달아서 snake case로 자동변환을 할 수도 있지만, application.properties를 활용하는 방법이 더 많이 쓰인다. ( 하나하나 다 달기에 귀찮기때문에 )
spring.jackson.property-naming-strategy=SNAKE_CASE
application.properties에 위의 코드를 추가해준다.

자동으로 snake case로 변환돼서 나오는 모습을 볼 수 있다.
통신은 data만 주고 받는 것이 아니라 statuscode, resultcode 등 여러 정보를 포함해서 보내주어야 한다. 이 때 Header에 포함되는 data는 가변적이어야 하므로 제네릭으로 선언해준다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Header<T> {
// api 통신시간
private LocalDateTime transactionTime;
// api 응답코드
private String resultCode;
private String description;
private T data;
public static <T> Header<T> OK(){
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("성공")
.build();
}
public static <T> Header<T> OK(T data){
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("성공")
.data(data)
.build();
}
public static <T> Header<T> ERROR(String description){
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("ERROR")
.description(description)
.build();
}
}

응답과 요청값을 받기 위해 network > request , response를 생성해준다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserApiResponse {
private Long id;
private String account;
private String password;
private String status;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
}
request는 response에서 id, registeredAt, unregisteredAt이 없는 형태.
CRUD를 강제하기 위해 인터페이스를 선언해준다.
ifs 폴더 생성 후 ifs > CrudInterface 생성
public interface CrudInterface<Req,Res> {
Header<Res> create(Header<Req> request);
Header read(Long id);
Header<Res> update(Header<Req> request);
Header delete(Long id);
}
public class UserController implements CrudInterface {
@RestController
@RequestMapping("/user")
public class UserController implements CrudInterface<UserApiRequest,UserApiResponse> {
@Override
@PostMapping("")
public Header<UserApiResponse> create(@RequestBody Header<UserApiRequest> userApiRequest)
{
return null;
}
@Override
@GetMapping("{id}")
public Header<UserApiResponse> read(@PathVariable(name="id") Long id) {
return null;
}
@Override
@PutMapping("")
public Header<UserApiResponse> update(@RequestBody Header<UserApiRequest> userApiRequest) {
return null;
}
@Override
@DeleteMapping("{id}")
public Header delete(@PathVariable Long id) {
return null;
}
}
@Override
@GetMapping("{id}")
public Header read(@PathVariable(name="id") Long id) {
return null;
}
PathVariable에서 requst params의 값 ( @GetMapping 괄호 안에 있는 id ) 의 이름과 name="id" 의 id 값이 매칭되는 것이다.
@Override
@GetMapping("{zlzlzlzl}")
public Header read(@PathVariable(name="zlzlzlzl") Long id) {
return null;
}
위와 같이 해도 똑같이 작동하지만, 변수의 이름을 통일하는게 원칙이다.