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

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

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

프로그래머스에서 하는 백엔드 스터디를 신청했고, 어제 처음으로 첫 세션을 듣게 되었습니다.
일단 강의자료를 참고해서 여러가지 측면에서 생각하면서 차근차근 개발을 진행하면서,
그 관련된 내용을 여기에 작성해 나아갈 계획입니다.

※ 현재 진행 중 스터디
[12기] 웹 백엔드 시스템 구현 스터디(SpringBoot) (← 클릭 시 이동!)

#1 세션, 코드리뷰 후기

참 간단한 미션이었는데도 생각이 많아져서 쉽지 않았던것 같습니다.
일단 Lombok을 당연하게 쓰고 있었는데, 이걸 배제하고 일일이 구현하면서 어려움을 많이 겪었습니다.
그리고 @Builder 어노테이션을 제대로 알지도 못한채로 당연하게 쓰고 있었는데,
직접 구현하게 되면서 Builder Pattern도 알게되었고 질문 통해서도 많은 부분들을 깨닫게 되었습니다.

Service단의 경우에도 아래의 리뷰 결과를 보면 알겠지만,
책에서 쓰는 방식을 당연하게 쓰고 있었는데 규모가 커졌을때, 그리고 서로 엮었을 때를 생각하면,
dto를 매개변수를 받는게 치명적이라는 것도 알게 되었습니다.

확실히 코드 리뷰 통해서 부족한 부분들을 많이 알게되어 정말 좋았습니다.
그리고 아래의 꿀팁들도 알려주셔서 메모해두고 추후에 차차 공부해볼 생각입니다.

  • IOC 등의 핵심 이론의 중요성 → 토비 vol.1 추천!
  • 요즘은 Spring WebFlux 를 많이 쓴다!
  • Kotlin - 코프링도 좋다!

코드 리뷰 결과

  • User Entity : 변경되지 않을 컬럼인 경우 final 키워드를 붙여주는 것이 좋습니다.
  • Service 단에서는 Dto가 아닌 Entity나 VO를 사용해야 한다!
    • Service는 다른 Service에서도 서로 호출 될수 있기 때문에, 도메인 객체들이 사용되어야 합니다!
    • DTO는 데이터를 옮기기 위한 목적이므로 이것은 Controller 단에서 사용해야 함!
  • User Service : Key 중복 오류를 비지니스 예외로 변환해서 throw 하는 방법도 있습니다.
  • ApiResponse(결과 값을 위한 Dto) : data 를 Object 가 아니라 제네릭을 사용하는 것이 좋습니다.
  • 가입 완료를 했을때, 가입완료 문자열이 아닌 가입된 유저정보를 전달하는건 어떨까요?

코드 리뷰 적용

  • User Entity

    • 변경되지 않을 컬럼 → final 키워드 추가

      public class User {
      
        private final Long seq;
        private final Email email;
        ...
      }
    • ToString() → org.apache.commons - commons-lang3 라이브러리를 사용하여 깔끔하게 변경

      • 의존성 추가

        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
        </dependency>
      • ToString() 메서드 재정의

        • 변경 전

          @Override
          public String toString() {
              return "User{" +
                  "seq=" + seq +
                  ", email='" + email + '\'' +
                  '}';
          }
        • 변경 후

          @Override
          public String toString() {
              return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                      .append("seq", seq)
                      .append("email", email)
                      .toString();
          }
  • Service : Dto가 아닌 Entity나 VO를 사용되도록 변경 & 회원 가입 시, 가입된 회원 정보를 반환하도록 수정

    • Service 단 변경 - 예시1

      • 변경 전
        @Transactional
        public void join(JoinRequestDto requestDto) {
            User user = new User(email, password);
            validateDuplicateUser(user);
            userRepository.save(user);
        }
      • 변경 후
        @Transactional
        public User join(Email email, Password password) {
            User user = new User(email, password);
            validateDuplicateUser(user);
            userRepository.save(user);
            return user;
        }
    • Controller 단 변경 - 예시2

      • 변경 전
        @PostMapping("/join")
        public ApiResponse join(@RequestBody JoinRequestDto requestDto) {
            userService.join(requestDto);
            return ApiResponse.ok("가입완료");
        }
      • 변경 후
        @PostMapping("/join")
        public ApiResponse join(@RequestBody JoinRequestDto requestDto) {
            User user = userService.join(
                    new Email(requestDto.getPrincipal()),
                    new Password(requestDto.getCredentials())
            );
            return ApiResponse.ok(new UserResponseDto(user));
        }
  • ApiResponse(결과 값을 위한 Dto) : 제네릭을 사용하여 변경

    • 변경 전

      public class ApiResponse {
          private final Object response;
      
          public static ApiResponse ok(Object data) {
              return new ApiResponse(true, data);
          }
      
          public Object getResponse() {
              return response;
          }
      }
    • 변경 후

      public class ApiResponse<T> {
          private final T response;
      
          public static <T> ApiResponse<T> ok(T data) {
              return new ApiResponse<>(true, data);
          }
      
          public T getResponse() {
              return response;
          }
      }
profile
BackEnd 개발 일기
post-custom-banner

0개의 댓글