[백엔드 스터디] 세션 #2

midas·2022년 2월 25일
0
post-custom-banner

[12기] 웹 백엔드 시스템 구현 스터디(SpringBoot)

세션 #2, 코드리뷰 후기

이번 주차에서 전심전력으로 쏟아부었어야 했는데, 일정이 이리저리 겹쳐서 제대로 하지 못한게 참으로 후회스럽네요.
잭슨님이 Spring Security 정리본을 주셔서, 읽어보면서 SSL 인증서나 암호화 등등 여러가지 알게 되었고,
Spring Security 아키텍쳐 포함해서 많을 것을 익힐수 있는 시간이었습니다.

사실 Spring Security에서 Voter 같은걸 어디에 쓰지? 라는 생각을 가지고 있었는데,
페이스북에서 친구들만 글을 볼 수 있다던지 등에서 쓰이는구나! 라는것과 사용법도 배울 수 있었습니다.

그리고 정규식도 차츰차츰 잊혀지고 있었는데, 이번에 다시 보면서 해볼 수 있었고,
유효성 체크의 중요성도 다시 되새길수 있는 시간이었습니다.

아래의 꿀팁들도 좋았습니다!

  • Indent는 2 추천!
  • IntelliJ 실행시 나오는 배너를 설정할수 있다!
  • equals() & hashcode() 의 관계
    • equals() → true 인 경우, 둘의 hashcode() 반환 값은 같아야 한다!
    • 반대는 성립하지 않아도 된다!
  • JWT 이모저모
    • JWT - Payload 에는 민감한 정보는 넣으면 안된다! [(email, password 등) → 대신에 userId(PK)를 쓰는것이 낫다!]

코드 리뷰 결과

  • 정규식 마지막에는 끝을 의미하는 $ 를 넣어야 됩니다!

  • heath_check 관련

    • 반환값을 ApiResult로 wrapping 해주는 것이 좋습니다!
    • Controller는 분리하는 것이 좋습니다!
    • 반환타입을 Long으로 변경하고 간단하게 System.currentTimeMillis() 를 사용해 구현해보기!
  • 😎 이메일 전달을 위해 Map를 사용 → DTO와 Map 각각 장단점이 있다!

    • DTO는 더욱 명시적인 장점은 있지만, class를 새로 만들어야 하는 단점.
    • Map은 추가적인 class가 필요없지만, 주석 등을 통해 파악이 쉽도록 잘 명세를 해놓아야 함.
  • 아래의 구문을 한줄로 변경해봅시다!

    // UserRestController.java
    Email email = new Email(request.get("email"));
    boolean isExists = userService.findByEmail(email).isPresent();
  • 추가된 name의 매개변수 위치!

    • name과 paassword가 연속할 경우 메소드 호출시 실수할 여지가 있기 때문에, name 인자 위치는 Email 앞이 더 좋음!
  • User : name 인자에 대한 validation이 빠졌네요. null-check, 최소최대 길이 확인이 필요!!

  • name 입력에 대한 validation 부분은 User 생성자에서 구현하면 좋을 듯!

코드 리뷰 적용

  • 정규식

    • 변경 전

      ...
      String regex = "^/api/user/([0-9]+).*";
    • 변경 후 → 고정 변수는 final 처리, 정규식 마지막에 $ 추가

      final String regex = "^/api/user/(\\d+)/post/.*$";
  • heath_check 관련

    • 변경 전

      public class UserRestController {
        ...
        @GetMapping("/_hcheck")
        public String status() {
        return String.format("It's Working in Social Service\n - TimeStamp : %s\n - Unix TimeStamp : %s"
                , LocalDateTime.now(), Timestamp.valueOf(LocalDateTime.now()).getTime());
        }
      }
    • 변경 후 → Controller로 분리

      public class HealthCheckRestController {
      
        @GetMapping("/_hcheck")
        public ApiResult<Long> healthCheck() {
          return OK(System.currentTimeMillis());
        }
      }
  • User - name 관련

    • 변경 전

      public class User {
        private String name;
      }
    • 변경 후 → 생성자에 체크 추가!

      public class User {
        private String name;
      
        public User(String name, ...) {
          checkArgument(isNotEmpty(name), "name must be provided.");
          checkArgument(
                  name.length() >= 1 && name.length() <= 10,
                  "name length must be between 1 and 10 characters."
          );
      
          this.name = name;
        }
      }
  • 아래의 구문을 한줄로 변경해봅시다!

    • 변경 전

      Email email = new Email(request.get("email"));
      boolean isExists = userService.findByEmail(email).isPresent();
      return OK(isExists);
    • 변경 후

      Email email = new Email(request.get("email"));
      return OK(
        userService.findByEmail(email).isPresent()
      );
profile
BackEnd 개발 일기
post-custom-banner

0개의 댓글