정 규식이
정규식 사용시
"^([a-zA-Z]+)(\\s?[a-zA-Z])*$"
자바가 아니면,
"^([a-zA-Z]+)(\s?[a-zA-Z])*$"
\
슬래시 하나 차이이다..
자바는 문자열 안에 특수문자 넣으려면
\
가 하나 더 필요하다.
슬래시 중간에 \s 할 때, 슬래시 두개냐, 한개냐가 헷갈린다...
자바는 문자열로 특수문자앞에 \
를 넣어줘야 되다보니 \\s
라고 쓰지만,,
정규식 테스트 사이트 에서는 \
를 하나만 사용해야된다.
"^50000|[1-4]{1}[0-9]{4}|[0-9]{3,4}$"
이렇게 하면된다.
풀어보자면,
50000 || 10000 ~ 49999 || 100 ~ 9999 < 이 같은 값들이 나온다고 보면된다.
값을 줘도 되고, 안 줘도 되는데, 주게 될 때 유효성을 검증해야 된다면?
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();
그리고 여기에 Generate
로 Getter만 생성해주면 된다.
사실 나는 Optional
안에 감싸는 것을 보고,
그 안에 이것 저것 다 집어넣었다.
@NotBlank
, @NotSpace
(커스텀이다.), @Pattern
(정규식) @Nullable
등등..
문제를 풀어가면서 들었던 설명은..
역시 코드는 위에서 아래로 흘러가는 것, 정규식을 아~무리 정규롭게 써놨더라도, 앞에 @Not머시기
들이 나오면, 그냥 그대로 팅겨나와 에러가 나온다.
생각해보면, Blank
나 Space
가 정규식에서 이미 다 필터링 되게 되어있어서, 굳이 사용할 필요없다.
그리고 Nullable
은 이미 Optional 클래스가 들어간 이상, Null을 허용한다는 의미이다.
그래서 역시 Nullable
이 의미가 없다. 코드가 복잡해질 뿐..
그래서 그냥 Optional 안에 정규식을 감싸는 것만으로도 해결된다.
그런데, 사실 그냥 정규식만 써도 된다...
왜냐하면 정규식은 null이 들어오면 동작하지 않는다고 한다.
그냥 각 필드마다 @Pattern
으로 정규식만 필드 앞에 선언해놓으면 되는 것이다.
정리하자면,
값을 줘도 되고, 안 줘도 되는데, 주게 될 때 유효성을 검증해야 된다면?
그리고, Dto에는 private을 사용해서 필드를 선언하는데, 어떻게 클라이언트의 요청으로부터 주는 데이터의 값들이 들어가서 Dto클래스를 생성할까..? Getter
, Setter
가 하는 일이 아니었다.
여튼 본론으로 들어가서 어떻게 요청으로부터 받은 데이터의 값들이 private 변수
에 들어가서 Dto 클래스를 만들어낼까...?
바로...Reflection API 때문이다..
Reflection API는 클래스의 정보를 바탕으로 객체를 생성하는 아주 강려크한 API이다.
여기에 대충 젤 밑에 쪽에 나온다..
여튼
@Nullable
과 같은 기능을 한다.
커밋 o