@Entity public class Account { @Id @GeneratedValue private Long id; private String name; private String street; private String city; private String state; private String zipCode; } 이렇게 Account 라는 객체가 있다고 할 때, street, city, state, zipCode는 서로 관련된 개념이다. 그리고 name 과는 관련이 없는 값들이다. JPA에서는 이를 하나로 묶어서 표현할 수 있다. @Embeddable public class Address { private String street; private String city; private String..
TIL ✍️
https://promisingmoon.tistory.com/106 [프로그래머스 자바] 소수 만들기 (Lv. 1) 문제 https://school.programmers.co.kr/learn/courses/30/lessons/12977 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 promisingmoon.tistory.com 오늘은 코딩테스트로 풀어봤다. 코테 알고리즘 스터디때 해야하는 걸 많이 미뤄뒀서... 이제는 더이상 물러날 곳이 없.다.
오늘 정규 표현식 질문을 받다가 알게된 놀라운 사실! 만약 예를 들어서 비밀번호를 검증한다고 했을 때, 영소문자 1개 이상, 영대문자 1개 이상, 숫자 1개 이상, 지정된 특수문자 1개 이상 각각을 꼭 포함해야 한다고 가정하자. 그러면 그냥 /^[a-zA-Z0-9@#$%^&+=]{1, 30}$/ 라고만 하면, 이 안에 있는 모든 문자가 들어가도 상관없지만, 영소문자만으로 채워도 통과가 된다. 그래서 소문자, 대문자, 숫자, 특수문자 각각을 모두 포함하는지를 확인할 수 있어야 하는데 그게 앞에 붙은 소괄호이다. (?=.*[a-z]) 를 하나하나 봐보자면, (?= ... ) : 결과에 포함되지 않고, 이 이후에 나오는 표현식을 매칭시킨다. (그러니까 (...) 이후에 나오는, [...] 부분을 매칭을 시킴)..
문제 인텔리제이에서 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, () -..