프로그래머스에서 하는 백엔드 스터디를 신청했고, 어제 처음으로 첫 세션을 듣게 되었습니다.
일단 강의자료를 참고해서 여러가지 측면에서 생각하면서 차근차근 개발을 진행하면서,
그 관련된 내용을 여기에 작성해 나아갈 계획입니다.
※ 현재 진행 중 스터디
[12기] 웹 백엔드 시스템 구현 스터디(SpringBoot) (← 클릭 시 이동!)
참 간단한 미션이었는데도 생각이 많아져서 쉽지 않았던것 같습니다.
일단 Lombok을 당연하게 쓰고 있었는데, 이걸 배제하고 일일이 구현하면서 어려움을 많이 겪었습니다.
그리고 @Builder
어노테이션을 제대로 알지도 못한채로 당연하게 쓰고 있었는데,
직접 구현하게 되면서 Builder Pattern
도 알게되었고 질문 통해서도 많은 부분들을 깨닫게 되었습니다.
Service단의 경우에도 아래의 리뷰 결과를 보면 알겠지만,
책에서 쓰는 방식을 당연하게 쓰고 있었는데 규모가 커졌을때, 그리고 서로 엮었을 때를 생각하면,
dto를 매개변수를 받는게 치명적이라는 것도 알게 되었습니다.
확실히 코드 리뷰 통해서 부족한 부분들을 많이 알게되어 정말 좋았습니다.
그리고 아래의 꿀팁들도 알려주셔서 메모해두고 추후에 차차 공부해볼 생각입니다.
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;
}
}