Spring Boot 시작하기 #10

ims·2020년 9월 2일

Spring Boot 시작하기 !

목록 보기
10/14

Enum

model > enumclass > UserStatus 에 enum의 값을 정의

@Getter
@AllArgsConstructor
public enum UserStatus {
    REGISTERED(0,"등록","사용자 등록상태"),
    UNREGISTERED(1,"해지","사용자 해지상태");

    private Integer id;
    private String title;
    private String description;
}

User.class

private String status

------ >

@Enumerated(EnumType.STRING)
private UserStatus status;

status의 type을 enum으로 변경해준다.

UserApiRequest,Response

private UserStatus status;

Request와 Response의 data type도 맞추어서 바꾸어준다.

만약 status의 값에 enum에 정의하지 않은 값을 넘기면 아래와 같은 오류가 난다. 대충 registered 와 unregistered의 값이 아니라는 뜻.

JSON parse error: Cannot deserialize value of type `com.example.spring_study0726.model.enumclass.UserStatus` from String "aa": not one of the values accepted for Enum class: [REGISTERED, UNREGISTERED]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.example.spring_study0726.model.enumclass.UserStatus` from String "aa": not one of the values accepted for Enum class: [REGISTERED, UNREGISTERED]

속성값 가져오기

String enumString = UserStatus.REGISTERED.getTitle();

Controller 추상화

모든 Controller에 대해서 CRUD를 선언하는 것은 코드의 반복성을 높인다. --> 추상화를 통해서 반복을 줄인다.

CrudController

public abstract class CrudController<Req,Res> implements CrudInterface<Req,Res> {

    protected CrudInterface<Req,Res> baseService;

    @Override
    @PostMapping("")
    public Header<Res> create(@RequestBody Header<Req> request) {
        return baseService.create(request);
    }

    @Override
    @GetMapping("{id}")
    public Header<Res> read(@PathVariable Long id) {
        return baseService.read(id);
    }

    @Override
    @PutMapping("")
    public Header<Res> update(@RequestBody Header<Req> request) {
        return baseService.update(request);
    }

    @Override
    @DeleteMapping("{id}")
    public Header delete(@PathVariable Long id) {
        return baseService.delete(id);
    }
}

abstract class를 선언하고 crud ifs를 상속받는다. crud를 implements 하고, service를 upcasting하기 위해 ifs로 선언한다.

UserController

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse> {

    @Autowired
    UserApiLogicService userApiLogicService;

    @PostConstruct
    public void init(){
        this.baseService=userApiLogicService;
    }
}

코드의 길이가 확 줄었다.

@PostConstruct는 초기 생성자처럼 작동하게끔 만들어주는 annotation

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

0개의 댓글