24.08.15

윤지현·2024년 8월 15일

TIL

목록 보기
42/75

오늘의 루틴

  • 개인과제 추가 구현 9번째 코드 작성 (O)
  • Spring 내용 복습 (O)

마지막 단계를 시도해 봤다.

9단계 기능: `null 체크` 및 `특정 패턴`에 대한 검증 수행
-------------------------------------------------------
🔻 설명
   - 유효성 검사
       - 잘못된 입력이나 요청을 미리 방지할 수 있습니다.
       - 데이터의 무결성을 보장하고 애플리케이션의 예측 가능성을 높여줍니다.
       - Spring에서 제공하는 @Valid 어노테이션을 이용할 수 있습니다.
-------------------------------------------------------
🔻 조건
   - 할일은 최대 200자 이내로 제한, 필수값 처리
   - 비밀번호는 필수값 처리
   - 담당자의 이메일 정보가 형식에 맞는지 확인 
-------------------------------------------------------

여기서 @Valid가 무엇인지 한 번 검색했다.

-------------------------------------------------------
🔻 @Valid?
   - JavaBean Validation API(JSR 380)를 활용하여 객체의 유효성을 검사하는 데 사용되는 애너테이션
       - @NotNull, @Size, @Min, @Max 같은 제약 조건 애너테이션을 사용
-------------------------------------------------------

나는 Groovy를 사용하므로 먼저 build.gradle에 있는 dependencies에 이것을 추가해야 한다.

implementation 'org.springframework.boot:spring-boot-starter-validation'

이제는 코드를 수정해야한다.
1. ManagerRequestDto.java

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class ManagerRequestDto {
    @NotBlank(message = "담당자 이름은 필수값이어야 합니다.")
    private String name;

    @NotBlank(message = "이메일은 필수값이어야 합니다.")
    @Email(message = "이메일은 유효한 형식이어야 합니다.")
    private String email;

    public ManagerRequestDto(String name, String email) {
        this.name = name;
        this.email = email;
    }
}
  1. MyScheduleRequestDto.java
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class MyScheduleRequestDto {
    @NotBlank(message = "할 일은 필수값")
    @Size(max = 200, message = "할 일은 최대 200자로 입력")
    private String task;

    @NotNull(message = "담당자 ID는 필수값")
    private Long managerId;

    @NotBlank(message = "비밀번호는 필수값")
    private String password;

    public MyScheduleRequestDto(String task, Long managerId, String password) {
        this.task = task;
        this.managerId = managerId;
        this.password = password;
    }
}
  1. MyScheduleController.java
import com.sparta.myscheduleserver.dto.MyScheduleRequestDto;
import com.sparta.myscheduleserver.dto.MyScheduleResponseDto;
import com.sparta.myscheduleserver.service.MyScheduleService;
import jakarta.validation.Valid;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api")
@Validated
public class MyScheduleServerController {

    private final JdbcTemplate jdbcTemplate;

    public MyScheduleServerController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // 일정 생성
    @PostMapping("/schedules")
    public MyScheduleResponseDto createSchedule(@Valid @RequestBody MyScheduleRequestDto myScheduleRequestDto) {
        MyScheduleService myScheduleService = new MyScheduleService(jdbcTemplate);
        return myScheduleService.createSchedule(myScheduleRequestDto);
    }
  1. ManagerController.java
import com.sparta.myscheduleserver.dto.ManagerRequestDto;
import com.sparta.myscheduleserver.entity.Manager;
import com.sparta.myscheduleserver.service.ManagerService;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/managers")
@Validated
public class ManagerController {
    private final ManagerService managerService;

    public ManagerController(ManagerService managerService) {
        this.managerService = managerService;
    }

    // 담당자 생성
    @PostMapping
    public void createManager(@Valid @RequestBody ManagerRequestDto managerRequestDto) {
        managerService.saveManager(managerRequestDto);
    }

이러면 필수값을 지정하고, 글자 크기를 제한할 수 있었다.

  • 오늘의 후기
    • 하지만 빈칸이거나 글자 수를 넘길 때 에러메시지가 나오지 않았다. 이것을 한 번 수정해봐야겠다.
    • 또한 코드를 보면 중복되는 코드가 있어서 이를 수정해야 할 것 같다.
profile
첫 시작

0개의 댓글