오늘 정규 표현식 질문을 받다가 알게된 놀라운 사실! 만약 예를 들어서 비밀번호를 검증한다고 했을 때, 영소문자 1개 이상, 영대문자 1개 이상, 숫자 1개 이상, 지정된 특수문자 1개 이상 각각을 꼭 포함해야 한다고 가정하자. 그러면 그냥 /^[a-zA-Z0-9@#$%^&+=]{1, 30}$/ 라고만 하면, 이 안에 있는 모든 문자가 들어가도 상관없지만, 영소문자만으로 채워도 통과가 된다. 그래서 소문자, 대문자, 숫자, 특수문자 각각을 모두 포함하는지를 확인할 수 있어야 하는데 그게 앞에 붙은 소괄호이다. (?=.*[a-z]) 를 하나하나 봐보자면, (?= ... ) : 결과에 포함되지 않고, 이 이후에 나오는 표현식을 매칭시킨다. (그러니까 (...) 이후에 나오는, [...] 부분을 매칭을 시킴)..
Til
JPA에는 고아 객체 라는 게 있다. @Entity @Getter @Setter @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST) private List foodList = new ArrayList(); public void addFoodList(Food food) { this.foodList.add(food); food.setUser(this); } } @Entity @Getter @Setter @Tab..
문제 인텔리제이에서 properties 파일에 한글을 붙여넣으니 ISO-8859-1에서 지원되지 않는 문자라고 떴다. 해결1 위 에러에서 파일 인코딩 변경 클릭 후, UTF-8 선택 후 기존 문자를 변경 후 적용이었나..? 하면 기존 문자는 유지하면서 바로 변경 가능하다. 근데 지금 할 떄는 안 떠서 .. 나 같은 사람 있으면 2번째 방법으로 하면 된다. 해결2 우선 기존 파일 내용은 전부 복사를 해둔다. 그 다음 설정(맥은 cmd + , 이고 윈도우는 ctrl + shift + s 였나 했을 거다) -> editor -> file encoding 들어가서, 다음과 같이 빨간 박스 안의 목록상자를 UTF-8 로 변경 후 그 밑의 박스를 체크하고 적용 누르면 된다. 그러면 다음과 같이 변할 텐데, 이거를 ..
어제 게시글 목록 조회 API를 작성하던 중 NullPointerException 을 만났다. @GetMapping public ResponseEntity getPosts( Pageable pageable, @RequestParam(name = "query", required = false) String query) { Page postList = postService.getPosts(pageable, query); return ResponseEntity.ok(RootResponse.builder() .data(postList) .build()); } http://localhost:8080/api/posts?page=0&size=2 위 링크로 postman 으로 테스트 하니, { "timestamp": ..
오늘 전체 게시글 목록 조회 API를 구현하다가 리턴 타입이 너무 길어져서 불편해졌다. @GetMapping public ResponseEntity getPosts( Pageable pageable, @RequestParam(name = "query", required = false, defaultValue = "") String query) { Page postList = postService.getPosts(pageable, query); return ResponseEntity.ok(RootResponse.builder() .data(postList) .build()); } 그래서 아래와 같이 리턴타입을 로 바꾸고, 리턴에 제네릭을 없앴다. @GetMapping public ResponseEntity..
스프링 프레임워크는 3가지 특징인 IoC/DI, PSA, AOP 가 있는데, 그 중 AOP 에 대해 알아보자 AOP AOP는 Aspect Orient Programming (관점 지향 프로그래밍) 으로, 어떤 로직을 핵심 기능과 부가 기능으로 나누고, 이를 각각 모듈화를 하는 프로그래밍이다. 핵심 기능은 핵심 비즈니스 로직이고, 부가 기능으로는 핵심 로직을 수행하기 위해 공통적으로 필요한 기능들, 예를 들면 로깅, DB연결, 등이 있다. 만약 특정 유저의 요청과 응답 사이의 시간을 기록하고 싶다면 AOP를 적용하지 않는다면 다음과 같이 해야 할 것이다. @PostMapping("/products") public ProductResponseDto createProduct(@RequestBody Produc..
심화 과제로 테스트 코드 작성을 했었는데 처음 하는 거다 보니 어떻게 적어야 할지 몰라서 조금 헤맸다. 정답이 딱 정해진 게 아니다 보니 구글링으로 레퍼런스로 찾기도 힘들어서 더 그랬다. 그래서 해설 강의와 레포를 보면서 다시 개선해보고 있다. 그중 하나로 컨트롤러 테스트마다 @WebMvcTest를 달아주어 매 컨트롤러마다 스프링을 실행하던 것을 부모 클래스로 추상화하여 상속을 받도록 했다. 사실 이건 ㅊㅈㅇ님께서 알려준 내용이지만. @ActiveProfiles("test") @MockBean(JpaMetamodelMappingContext.class) @WebMvcTest( controllers = { AuthController.class, TodoController.class, CommentContr..
문제 테스트 코드를 작성할 때, 로그인 및 회원가입에 쓰이는 AuthRequestDto 는 username과 password를 필드로 가지고 있고, validation 라이브러리로 검증하도록 했다. 하지만 컨트롤러에서 @Valid 로 검증하는 탓에, 테스트에서 직접 값을 넣으면 아무 예외도 발생하지 않는 문제가 있었다. @DisplayName("유효하지 않은 username 및 password 요청") @Test void validate_invalid_username() { // given String username = "us"; String password = "1234"; // when & then assertThrows(MethodArgumentNotValidException.class, () -..
오늘 목표 숙련 주차를 페이징만 듣고 심화로 넘어갈랬는데 숙련을 들어야 심화를 들을 수 있어서 후딱 듣고 심화로 넘어갔다. 오늘 다 들어버리려고 했는데 노는 게 젤 좋아서,, 4시간 분량 중 1시간 반 남았다. 근데 50분어치는 아는 거라서 2배속으로 들을 듯. 낼 다 듣고 과제해야지. 캐스케이드란 ? 엔티티의 상태 변화를 전파시키는 옵션이다. @OneToMany 나 @ManyToOne에 줄 수 있는 옵션이다. @Entity @Getter @Setter @Table(name = "food") public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; privat..