JAVA) record

박우영·2023년 6월 7일
0

자바/코틀린/스프링

목록 보기
25/37

Record란?


jdk 14에 등장하여 16부터 정식스펙으로 포함되었다. 사실상 많이쓰는 8, 11, 17 과 같은 lts 에선 17에서 처음 사용 되기때문에 깊이있는 자료는 찾기 힘들었습니다.
대략적인 설명으론 생성자, get, tostring, equals 와 같은 것들을 기본으로 제공해줍니다. 따라서 불변객체, DTO 와 에서 사용하면 좋을것 같아 이번 프로젝트 REST API 작업을할때 사용했습니다.

프로젝트 예제


UpdateRequest

@Schema(description = "Patch 할때 사용")
public record UpdateRequest(String name, String about, String xp, String count, String provider, String difficulty) {
}

다음과 같은 DTO 를 만들때 사용했습니다. 기존에 롬복을 사용하여 생성자 만들어주고, @Data 와 같은 어노테이션들을 붙여줄 필요없이 정의만 하면 됐고

Service

public RuleForm updateRule(Long id, UpdateRequest updates) {
        String name = updates.name();
        String about = updates.about();
        String strXp = updates.xp();
        String strCount = updates.count();
        String provider = updates.provider();
        String difficulty = updates.difficulty();

        RuleForm ruleForm = new RuleForm();
        setForm(id, ruleForm);
        if (name != null) {
            ruleForm.setName(name);
        }
        if (about != null) {
            ruleForm.setAbout(about);
        }
        if (strXp != null) {
            try {
                Integer xp = Integer.parseInt(strXp);
                ruleForm.setXp(xp.toString());
            } catch (NumberFormatException e) {
                throw new NumberInputException("xp는 숫자로 입력해주세요");
            }
        }
        if (strCount != null) {
            try {
                Integer count = Integer.parseInt(strCount);
                ruleForm.setCount(count.toString());
            } catch (NumberFormatException e) {
                throw new NumberInputException("Count는 숫자로 입력해주세요");
            }
        }
        if (provider != null) {
            ruleForm.setProvider(provider);
        }
        if (difficulty != null) {
            ruleForm.setDifficulty(difficulty);
        }
        return ruleForm;
    }

controller

    @PatchMapping("/v1/{ruleid}")
    @Operation(summary = "규칙수정", description = "파라미터 id 를 입력받고 수정하고 싶은 Key:value 의 내용을 입력", tags = "수정")
    public RsData<ModifyRuleResponse> updateRule(@Parameter(description = "RuleId", in = ParameterIn.PATH) @PathVariable("ruleid") Long ruleid
                                                , @RequestBody UpdateRequest updates) {
        RuleForm ruleForm = ruleService.updateRule(ruleid, updates);
        ruleService.modify(ruleid, ruleForm);
        Rule rule = ruleService.getRule(ruleid).getData();
        return RsData.of("S-1", "수정 완료", new ModifyRuleResponse(rule));
    }

다음과 같이 service 와 controller 를 사용해서 Patch 를 구현했습니다.

물론 Service 에서 그러한 로직을 만들었지만 Patch도 잘 되는것을 확인할 수있습니다.

복잡한 비즈니스 로직이 들어가는것이 아닌 가볍게 dto, vo 를 만들때 사용하면 편리하게 코딩을 할 수 있을것같습니다.

회고


dto 만들고 rest api 만들고 동일한 작업의 반복이지만 이처럼 새로운 기술들을 적용해보면서 프로젝트를 진행하면 색다른 느낌도 나고 보다 편리하게 코딩을 할 수있을거같습니다 추가적으로 정보가 더 있는지 구글링을 해봤는데 엔티티로는 사용을 하기엔 힘들거같다고 하는데 나중에 기회가 된다면 한번 알아보겠습니다.

0개의 댓글