Optional, 정규식 Dto.

김성수·2022년 11월 17일
1

SEB_BE

목록 보기
31/31

정규식 관련

정 규식이

정규식 조건이 다음과 같을 때,

  1. 영문(대소문자 모두 가능)만 허용합니다.
  2. 워드 사이에 한칸의 공백(스페이스)만 포함 될 수 있습니다.
  • “Cafe Latte” (ㅇ)
  • “Ca fe Latte” (ㅇ)
  • “Cafe Latte” (X)
  • “ Cafe Latte” (X)
  • “ Cafe Latte ” (X)
  • “ Cafe Latte ” (X)

정규식 사용시

"^([a-zA-Z]+)(\\s?[a-zA-Z])*$"

자바가 아니면,
"^([a-zA-Z]+)(\s?[a-zA-Z])*$"

\슬래시 하나 차이이다..

자바는 문자열 안에 특수문자 넣으려면 \가 하나 더 필요하다.

슬래시 중간에 \s 할 때, 슬래시 두개냐, 한개냐가 헷갈린다...
자바는 문자열로 특수문자앞에 \를 넣어줘야 되다보니 \\s라고 쓰지만,,
정규식 테스트 사이트 에서는 \를 하나만 사용해야된다.

정규식 조건이 다음과 같을 때,

  • 100이상 50000이하의 숫자만 허용시

"^50000|[1-4]{1}[0-9]{4}|[0-9]{3,4}$"

이렇게 하면된다.
풀어보자면,
50000 || 10000 ~ 49999 || 100 ~ 9999 < 이 같은 값들이 나온다고 보면된다.

Optional

값을 줘도 되고, 안 줘도 되는데, 주게 될 때 유효성을 검증해야 된다면?

    private Optional<@NotBlank String> korName = Optional.empty();

    private Optional<@NotBlank @Pattern(regexp = "^([a-zA-Z]+)(\\s?[a-zA-Z])*$") String> engName = Optional.empty();

    private Optional<@Range(min= 100, max= 50000) Integer> price = Optional.empty();

그리고 여기에 GenerateGetter만 생성해주면 된다.

사실 나는 Optional 안에 감싸는 것을 보고,
그 안에 이것 저것 다 집어넣었다.
@NotBlank, @NotSpace(커스텀이다.), @Pattern(정규식) @Nullable 등등..

문제를 풀어가면서 들었던 설명은..

역시 코드는 위에서 아래로 흘러가는 것, 정규식을 아~무리 정규롭게 써놨더라도, 앞에 @Not머시기들이 나오면, 그냥 그대로 팅겨나와 에러가 나온다.

생각해보면, BlankSpace가 정규식에서 이미 다 필터링 되게 되어있어서, 굳이 사용할 필요없다.
그리고 Nullable은 이미 Optional 클래스가 들어간 이상, Null을 허용한다는 의미이다.

그래서 역시 Nullable이 의미가 없다. 코드가 복잡해질 뿐..
그래서 그냥 Optional 안에 정규식을 감싸는 것만으로도 해결된다.

그런데, 사실 그냥 정규식만 써도 된다...
왜냐하면 정규식은 null이 들어오면 동작하지 않는다고 한다.

그냥 각 필드마다 @Pattern으로 정규식만 필드 앞에 선언해놓으면 되는 것이다.


정리하자면,
값을 줘도 되고, 안 줘도 되는데, 주게 될 때 유효성을 검증해야 된다면?

  • 그냥 정규식만 사용하면 된다.

아!

그리고, Dto에는 private을 사용해서 필드를 선언하는데, 어떻게 클라이언트의 요청으로부터 주는 데이터의 값들이 들어가서 Dto클래스를 생성할까..? Getter, Setter가 하는 일이 아니었다.

  • 요즘 Setter는 잘 안쓰는 추세라고 하였고, Getter만 있어도 된다.

여튼 본론으로 들어가서 어떻게 요청으로부터 받은 데이터의 값들이 private 변수에 들어가서 Dto 클래스를 만들어낼까...?

바로...Reflection API 때문이다..
Reflection API는 클래스의 정보를 바탕으로 객체를 생성하는 아주 강려크한 API이다.

여기에 대충 젤 밑에 쪽에 나온다..

여튼

  1. 값이 들어오거나 안 들어와도 되는데, 들어올 때는 정규표현식에 맞게 하려면, 그냥 정규식만 사용하면 된다.
  2. DTO 클래스의 필드들이 private임에도 불구하고, 값들이 들어갈 수 있는 이유는 바로 Reflectoin API를 사용하기 때문이다.
  3. Optional클래스는 감싸는 자체가 @Nullable 과 같은 기능을 한다.
profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

1개의 댓글

comment-user-thumbnail
2022년 11월 23일

커밋 o

답글 달기