Spring Boot 시작하기 #8

ims·2020년 8월 31일

JsonProperty

@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로 변환돼서 나오는 모습을 볼 수 있다.

Header 생성

통신은 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();
    }
}

request , response

응답과 요청값을 받기 위해 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이 없는 형태.

Ifs

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 {

Crudifs를 상속한 UserController

@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;
    }
}

(참고) Pathvariable

    @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;
    }

위와 같이 해도 똑같이 작동하지만, 변수의 이름을 통일하는게 원칙이다.

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글