모든 응답은 CommonResponse를 사용해서 반환한다. 200외의 다른 status를 반환할 경우 @ResponseStatus를 사용한다.
CommonResponse에는 T data
, PageInfo pageInfo
, String message
가 있다.
data: MemberResponse, VideoResponse, List<MemberResponse> 등 dto 또는 dto의 컬렉션을 의미한다.
PageInfo: Page 정보에 관한 dto다.
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.data.domain.Page;
@Getter
@AllArgsConstructor
public class PageInfo {
private int currentPage;
private int totalPages;
private int numberOfElements;
private int pageSize;
private int totalElements;
public static <T> PageInfo from(Page<T> page) {
return new PageInfo(
page.getNumber(),
page.getTotalPages(),
page.getNumberOfElements(),
page.getSize(),
(int) page.getTotalElements()
);
}
}
message : 응답 메시지다. 각 도메인 ui(Controller)패키지에 “OOResponseMessage” enum을 생성해서 메시지를 관리한다.
정적 팩토리 메서드가 3개 있는데 상황에 맞게 사용하면 된다. 입력하지 않으면 null 값이 할당되고, JsonInclude(NON_NULL)어노테이션이 적용되어 null인 값은 json으로 변환되지 않는다.
T data예시 - dto 혹은 dto의 컬렉션
@Getter
@AllArgsConstructor
public class HealthCheckResponse {
private String groupName;
private MemberResponse me;
private List<MemberResponse> friends;
public static HealthCheckResponse of(String groupName, MemberResponse member, List<MemberResponse> friends) {
return new HealthCheckResponse(groupName, me, friends);
}
}
@Getter
@AllArgsConstructor
public class MemberResponse {
private Long id;
private String userId;
private String email;
private String name;
private String studentNumber;
private String phoneNumber;
public static MemberResponse from (Member member) {
return new MemberResponse(
member.getId(),
member.getUserId(),
member.getEmail(),
member.getName(),
member.getStudentNumber(),
member.getPhoneNumber()
);
}
}
//ex1
return CommonResponse.of(HealthCheckResponse.of(groupName, me, friends), HEALTH_CHECK_MESSAGE.getMessage());
return CommonResponse.of(MemberResponse.of(member), HEALTH_CHECK_MESSAGE.getMessage());
return CommonResponse.of(List<MemberResponse>, HEALTH_CHECK_MESSAGE.getMessage());
return CommonResponse.from(MEMBER_DELETE_SUCCESS.getMessage());
응답 메시지 관리 예시
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum HealthCheckResponseMessage {
HEALTH_CHECK_MESSAGE("서버 정상 작동");
MEMBER_DELETE_SUCCESS("회원 탈퇴 성공");
private final String message;
}
각 도메인에 exception 패키지를 생성해 다양한 예외를 추가한다. (BaseException을 상속받아야 한다.)
예외를 추가하면 common - exception - ExceptionType.java (enum)에 예외를 추가한다. 이렇게 하면 모든 예외를 편하게 관리할 수 있다.
새로운 예외가 필요한 상황 예시:
(예외처리 컨트롤러는 이미 구현해놨기 때문에 위 과정만 거치면 커스텀 예외 편하게 사용 가능)