Spring 심화 주차 개인 과제

토리·2025년 2월 25일
0

문제

    @PostMapping("/todos/{todoId}/comments")
    public ResponseEntity<CommentSaveResponse> saveComment(
            @Auth AuthUser authUser,
            @PathVariable long todoId,
            @Valid @RequestBody CommentSaveRequest commentSaveRequest
    ) {
        return ResponseEntity.ok(commentService.saveComment(authUser, todoId, commentSaveRequest));
    }
    @GetMapping("/todos/{todoId}/comments")
    public ResponseEntity<List<CommentResponse>> getComments(@PathVariable long todoId) {
        return ResponseEntity.ok(commentService.getComments(todoId));
    }
    @PostMapping("/todos/{todoId}/managers")
    public ResponseEntity<ManagerSaveResponse> saveManager(
            @Auth AuthUser authUser,
            @PathVariable long todoId,
            @Valid @RequestBody ManagerSaveRequest managerSaveRequest
    ) {
        return ResponseEntity.ok(managerService.saveManager(authUser, todoId, managerSaveRequest));
    }
    @GetMapping("/todos/{todoId}/managers")
    public ResponseEntity<List<ManagerResponse>> getMembers(@PathVariable long todoId) {
        return ResponseEntity.ok(managerService.getManagers(todoId));
    }

RESTful API 설계 원칙에 맞지 않는다.
리소스간 관계 표현이 비효율적이다.
comments, managers 가 todoId 의 하위 리소스처럼 보이는데
만약 comments, managers 가 다른 엔티티에도 속할 수 있다면,
엔드포인트가 일관되지 않을 수 있다.

해결

    @PostMapping("/comments")
    public ResponseEntity<CommentSaveResponse> saveComment(
            @Auth AuthUser authUser,
            @RequestParam long todoId,
            @Valid @RequestBody CommentSaveRequest commentSaveRequest
    ) {
        return ResponseEntity.ok(commentService.saveComment(authUser, todoId, commentSaveRequest));
    }
    @GetMapping("/comments")
    public ResponseEntity<List<CommentResponse>> getComments(@RequestParam long todoId) {
        return ResponseEntity.ok(commentService.getComments(todoId));
    }
    @PostMapping("/managers")
    public ResponseEntity<ManagerSaveResponse> saveManager(
            @Auth AuthUser authUser,
            @RequestParam long todoId,
            @Valid @RequestBody ManagerSaveRequest managerSaveRequest
    ) {
        return ResponseEntity.ok(managerService.saveManager(authUser, todoId, managerSaveRequest));
    }
    @GetMapping("/managers")
    public ResponseEntity<List<ManagerResponse>> getMembers(@RequestParam long todoId) {
        return ResponseEntity.ok(managerService.getManagers(todoId));
    }

문제

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class SignupRequest {

    @NotBlank @Email
    private String email;
    @NotBlank
    private String password;
    @NotBlank
    private String userRole;
}

password 에 정규식 validation 이 없음.
개인정보가 쉽게 노출되는 등 보안이 위험할 수 있다.

해결

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class SignupRequest {

    @NotBlank @Email
    private String email;
    @NotBlank
    @Pattern(regexp = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$", message = "비밀번호는 8자 이상이어야 하고, 숫자와 대문자를 포함해야 합니다.")
    private String password;
    @NotBlank
    private String userRole;
}
profile
안녕하세요. 토리입니다.

0개의 댓글