Skip to content

Commit

Permalink
[refactor] 코드 스타일 통일 (#68)
Browse files Browse the repository at this point in the history
* [feat] 유효하지 않은 가게 생성시 발생하는 커스텀 예외

* [feat] 가게 카테고리를 찾지 못할 때 발생하는 커스텀 예외

* [feat] 가게 관련 에러 코드 Enum 정의

에러 코드는 클라이언트에게 보여지는 부분이다.

* [feat] 사용하지 않는 StoreException 제거

코드 스타일 통일에 따라 해당 예외는 제거함

* [refactor] 가게 카테고리를 찾지 못할 때, NotFoundStoreCategoryException 을 던지도록 수정

* [refactor] 가게 Store 객체를 생성하지 못할 때, InvalidStoreCreationException 를 던지도록 수정

* [test] 커스텀 예외 변경에 따라, 테스트 코드 수정 및 테스트

* [style] 서비스 메서드에서 발생할 수 있는 런타임 예외 javadocs 주석 추가

* [refactor] 컨트롤러/서비스 계층 코드 스타일 통일

1. 컨트롤러 계층 - xxxRequest
1. 서비스 계층 - xxxCommand
2. 변경함에 따라 서비스 계층에서 Vendor 를 조회하는 로직이 추가됨

* [test] 컨트롤러/서비스 계층 코드 스타일 변경에 따라 테스트 코드 수정 및 테스트

* [style] 가게 등록 서비스 계층에서 발생할 수 있는 RuntimeException javadocs 명시

* [refactor] MenuLineItem DTO를 외부 클래스로 분리

Request, Command DTO로 분리하는 과정에서 MenuLineItem 을 외부 클래스로 분리함

* [refactor] 서비스 계층 코드 스타일 통일

1. 서비스 계층 - xxxCommand
2. 변경함에 따라 서비스 계층에서 Vendor 를 조회하는 로직이 추가됨

* [test] 서비스 계층 코드 스타일 변경에 따라 테스트 코드 수정 및 테스트

* [refactor] 패키지 이동

* [feat] 가게 메뉴 등록 API 구현

- storeId는 request param 에서 path variable 로 이동
- StoreMenuRegistrationResponse 을 반환하도록 함

* [refactor] responseDTO 를 반환하도록 수정

* [feat] responseDTO 클래스 구현

- 가게 등록 response
- 가게 메뉴 등록 response

* [refactor] 가게 등록, 가게 메뉴 등록 메서드 반환타입 변경

* [refactor] 기존 커스텀 예외가 NotFoundException, BadRequestException 상속하도록 수정

* [feat] 메뉴 에러 코드 Enum

* [feat] Store 예외 핸들러 구현

* [style] 가게 메뉴 등록 서비스에서 발생할 수 있는 RuntimeException javadocs 주석 처리

* [style] 테스트 코드의 주석 제거

* [refactor] 커스텀 예외의 생성자 제거

String message 는 로그를 의미함
로그성 메시지를 강제하기 위해, 이외의 생성자는 제거함

* [fix] Not Null 예외 메시지 추가

* [merge] resolve merge conflict
  • Loading branch information
june-777 authored Aug 15, 2024
1 parent c778333 commit c6f1b26
Show file tree
Hide file tree
Showing 30 changed files with 468 additions and 206 deletions.
4 changes: 4 additions & 0 deletions src/main/java/camp/woowak/lab/menu/domain/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ public Menu(Store store, MenuCategory menuCategory, String name, Integer price,
this.imageUrl = imageUrl;
}

public Long getId() {
return id;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package camp.woowak.lab.menu.domain;

import static camp.woowak.lab.menu.exception.MenuErrorCode.*;

import camp.woowak.lab.menu.exception.InvalidMenuCategoryCreationException;
import camp.woowak.lab.menu.exception.MenuErrorCode;
import camp.woowak.lab.store.domain.Store;

public class MenuCategoryValidator {
Expand All @@ -16,23 +19,24 @@ public static void validate(final Store store, final String name) {
private static void validateNotNull(final Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new InvalidMenuCategoryCreationException(target + "은 Null 이 될 수 없습니다.");
throw new InvalidMenuCategoryCreationException(MenuErrorCode.NULL_EXIST, target + "은 Null 이 될 수 없습니다.");
}
}
}

private static void validateNotBlank(final String... targets) {
for (String target : targets) {
if (target.isBlank()) {
throw new InvalidMenuCategoryCreationException(target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
throw new InvalidMenuCategoryCreationException(BLANK_EXIST, target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
}
}
}

private static void validateNameLength(final String name) {
if (name.length() > MAX_NAME_LENGTH) {
throw new InvalidMenuCategoryCreationException("메뉴 카테고리 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
throw new InvalidMenuCategoryCreationException(INVALID_NAME_RANGE,
"메뉴 카테고리 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
}
}

}
10 changes: 6 additions & 4 deletions src/main/java/camp/woowak/lab/menu/domain/MenuValidator.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package camp.woowak.lab.menu.domain;

import static camp.woowak.lab.menu.exception.MenuErrorCode.*;

import camp.woowak.lab.menu.exception.InvalidMenuCreationException;
import camp.woowak.lab.store.domain.Store;

Expand All @@ -18,28 +20,28 @@ public static void validate(final Store store, final MenuCategory menuCategory,
private static void validateNotNull(final Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new InvalidMenuCreationException(target + "은 Null 이 될 수 없습니다.");
throw new InvalidMenuCreationException(NULL_EXIST, target + "은 Null 이 될 수 없습니다.");
}
}
}

private static void validateNotBlank(final String... targets) {
for (String target : targets) {
if (target.isBlank()) {
throw new InvalidMenuCreationException(target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
throw new InvalidMenuCreationException(BLANK_EXIST, target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
}
}
}

private static void validateNameLength(final String name) {
if (name.length() > MAX_NAME_LENGTH) {
throw new InvalidMenuCreationException("메뉴 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
throw new InvalidMenuCreationException(INVALID_NAME_RANGE, "메뉴 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
}
}

private static void validatePriceNegative(final Integer price) {
if (price <= 0) {
throw new InvalidMenuCreationException("메뉴의 가격은 양수만 가능합니다");
throw new InvalidMenuCreationException(INVALID_PRICE, "메뉴의 가격은 양수만 가능합니다");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class InvalidMenuCategoryCreationException extends RuntimeException {
import camp.woowak.lab.common.exception.BadRequestException;
import camp.woowak.lab.common.exception.ErrorCode;

public InvalidMenuCategoryCreationException(String message) {
super(message);
public class InvalidMenuCategoryCreationException extends BadRequestException {

public InvalidMenuCategoryCreationException(ErrorCode errorCode, String message) {
super(errorCode, message);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class InvalidMenuCreationException extends RuntimeException {
import camp.woowak.lab.common.exception.BadRequestException;
import camp.woowak.lab.common.exception.ErrorCode;

public InvalidMenuCreationException(String message) {
super(message);
public class InvalidMenuCreationException extends BadRequestException {

public InvalidMenuCreationException(ErrorCode errorCode, String message) {
super(errorCode, message);
}

}
11 changes: 10 additions & 1 deletion src/main/java/camp/woowak/lab/menu/exception/MenuErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,17 @@
import camp.woowak.lab.common.exception.ErrorCode;

public enum MenuErrorCode implements ErrorCode {

DUPLICATE_MENU_CATEGORY(HttpStatus.BAD_REQUEST, "m_1", "이미 생성된 카테고리입니다."),
UNAUTHORIZED_MENU_CATEGORY_CREATION(HttpStatus.FORBIDDEN, "m_2", "점주만 카테고리를 생성할 수 있습니다.");
UNAUTHORIZED_MENU_CATEGORY_CREATION(HttpStatus.FORBIDDEN, "m_2", "점주만 카테고리를 생성할 수 있습니다."),

NULL_EXIST(HttpStatus.BAD_REQUEST, "M0", "값이 존재해야 합니다."),
BLANK_EXIST(HttpStatus.BAD_REQUEST, "M1", "빈 문자열이거나 공백 문자열이 포함되면 안됩니다."),
INVALID_NAME_RANGE(HttpStatus.BAD_REQUEST, "M2", "이름의 길이 범위를 벗어났습니다."),

INVALID_PRICE(HttpStatus.BAD_REQUEST, "M3", "메뉴의 가격 범위를 벗어났습니다."),

NOT_FOUND_MENU_CATEGORY(HttpStatus.BAD_REQUEST, "M3", "메뉴 카테고리를 찾을 수 없습니다.");

private final int status;
private final String errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class NotFoundMenuCategoryException extends RuntimeException {
import camp.woowak.lab.common.exception.BadRequestException;
import camp.woowak.lab.common.exception.ErrorCode;

public NotFoundMenuCategoryException(String message) {
super(message);
public class NotFoundMenuCategoryException extends BadRequestException {

public NotFoundMenuCategoryException(ErrorCode errorCode, String message) {
super(errorCode, message);
}

}
26 changes: 15 additions & 11 deletions src/main/java/camp/woowak/lab/store/domain/StoreValidator.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package camp.woowak.lab.store.domain;

import static camp.woowak.lab.store.exception.StoreException.ErrorCode.*;
import static camp.woowak.lab.store.exception.StoreErrorCode.*;

import java.time.LocalDateTime;

import camp.woowak.lab.store.exception.StoreException;
import camp.woowak.lab.store.exception.InvalidStoreCreationException;
import camp.woowak.lab.vendor.domain.Vendor;

public class StoreValidator {
Expand All @@ -31,7 +31,7 @@ public static void validate(final Vendor owner, StoreCategory storeCategory, fin
private static void validateNotNull(Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new StoreException(NULL_EXIST);
throw new InvalidStoreCreationException(NULL_EXIST, "Null 값은 허용하지 않습니다.");
}
}
}
Expand All @@ -40,45 +40,49 @@ private static void validateName(final String name) {
if (MIN_NAME_LENGTH <= name.length() && name.length() <= MAX_NAME_LENGTH) {
return;
}
throw new StoreException(INVALID_NAME_RANGE);
throw new InvalidStoreCreationException(INVALID_NAME_RANGE,
"이름의 길이는 " + MIN_NAME_LENGTH + " ~ " + MAX_NAME_LENGTH + " 만 가능합니다. cur: " + name.length());
}

private static void validateAddress(final String address) {
if (StoreAddress.DEFAULT_DISTRICT.equals(address)) {
return;
}
throw new StoreException(INVALID_ADDRESS);
throw new InvalidStoreCreationException(INVALID_ADDRESS, "주소는 송파만 가능합니다. cur: " + address);
}

private static void validateMinOrderPrice(final Integer minOrderPrice) {
if (minOrderPrice < MIN_ORDER_PRICE) {
throw new StoreException(INVALID_MIN_ORDER_PRICE);
throw new InvalidStoreCreationException(INVALID_MIN_ORDER_PRICE,
"최소 주문 금액은 " + MIN_ORDER_PRICE + " 보다 이상이어야 합니다. cur: " + minOrderPrice);
}
}

private static void validateUnitOrderPrice(final Integer minOrderPrice) {
if (minOrderPrice % UNIT_OF_MIN_ORDER_PRICE != 0) {
throw new StoreException(INVALID_UNIT_OF_MIN_ORDER_PRICE);
throw new InvalidStoreCreationException(INVALID_UNIT_OF_MIN_ORDER_PRICE,
"최소 주문 금액의 단위는 천원이어야 합니다. cur: " + minOrderPrice);
}
}

private static void validateTime(final LocalDateTime startTime,
final LocalDateTime endTime
) {
if (isInvalidStoreTimeUnit(startTime)) {
throw new StoreException(INVALID_TIME_UNIT);
throw new InvalidStoreCreationException(INVALID_TIME_UNIT, "가게 시간은 분단위까지 가능합니다. cur: " + startTime);
}

if (isInvalidStoreTimeUnit(endTime)) {
throw new StoreException(INVALID_TIME_UNIT);
throw new InvalidStoreCreationException(INVALID_TIME_UNIT, "가게 시간은 분단위까지 가능합니다. cur:" + endTime);
}

if (endTime.isBefore(startTime)) {
throw new StoreException(INVALID_TIME);
throw new InvalidStoreCreationException(INVALID_TIME,
"가게 종료 시간이 시작 시간보다 이전입니다. cur:" + startTime + "," + endTime);
}

if (startTime.isEqual(endTime)) {
throw new StoreException(INVALID_TIME);
throw new InvalidStoreCreationException(INVALID_TIME, "가게 시작 시간과 종료 시간이 같습니다. cur:" + startTime + endTime);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package camp.woowak.lab.store.exception;

import camp.woowak.lab.common.exception.BadRequestException;
import camp.woowak.lab.common.exception.ErrorCode;

public class InvalidStoreCreationException extends BadRequestException {

public InvalidStoreCreationException(ErrorCode errorCode, String message) {
super(errorCode, message);
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package camp.woowak.lab.store.exception;

public class NotEqualsOwnerException extends RuntimeException {
import static camp.woowak.lab.store.exception.StoreErrorCode.*;

import camp.woowak.lab.common.exception.BadRequestException;

public class NotEqualsOwnerException extends BadRequestException {

public NotEqualsOwnerException(String message) {
super(message);
super(NOT_EQUALS_VENDOR, message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package camp.woowak.lab.store.exception;

import camp.woowak.lab.common.exception.NotFoundException;

public class NotFoundStoreCategoryException extends NotFoundException {

public NotFoundStoreCategoryException(String message) {
super(StoreErrorCode.INVALID_STORE_CATEGORY, message);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package camp.woowak.lab.store.exception;

// TODO: 404Exception 상속하도록 수정
public class NotFoundStoreException extends RuntimeException {
import static camp.woowak.lab.store.exception.StoreErrorCode.*;

import camp.woowak.lab.common.exception.NotFoundException;

public class NotFoundStoreException extends NotFoundException {

public NotFoundStoreException(String message) {
super(message);
super(NOT_FOUND_STORE, message);
}

}
49 changes: 49 additions & 0 deletions src/main/java/camp/woowak/lab/store/exception/StoreErrorCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package camp.woowak.lab.store.exception;

import org.springframework.http.HttpStatus;

import camp.woowak.lab.common.exception.ErrorCode;

public enum StoreErrorCode implements ErrorCode {
NULL_EXIST(HttpStatus.BAD_REQUEST, "S0", "값이 존재해야 합니다."),

INVALID_NAME_RANGE(HttpStatus.BAD_REQUEST, "S1", "가게 이름은 2글자 ~ 10글자 이어야합니다."),

INVALID_ADDRESS(HttpStatus.BAD_REQUEST, "S2", "가게 주소는 송파구만 가능합니다."),

INVALID_MIN_ORDER_PRICE(HttpStatus.BAD_REQUEST, "S3", "최소 주문 금액은 5,000원 이상이어야 합니다."),
INVALID_UNIT_OF_MIN_ORDER_PRICE(HttpStatus.BAD_REQUEST, "S4", "최소 주문 금액은 1,000원 단위이어야 합니다."),

INVALID_TIME_UNIT(HttpStatus.BAD_REQUEST, "S5", "가게 시작 시간은 분 단위까지 가능합니다"),
INVALID_TIME(HttpStatus.BAD_REQUEST, "S6", "가게 시작 시간은 종료 시간보다 이전이어야 합니다"),

INVALID_STORE_CATEGORY(HttpStatus.BAD_REQUEST, "S7", "존재하지 않는 가게 카테고리입니다."),

NOT_EQUALS_VENDOR(HttpStatus.BAD_REQUEST, "S8", "가게의 점주와 일치하지 않습니다."),
NOT_FOUND_STORE(HttpStatus.BAD_REQUEST, "S9", "가게를 찾을 수 없습니다.");

private final int status;
private final String errorCode;
private final String message;

StoreErrorCode(HttpStatus status, String errorCode, String message) {
this.status = status.value();
this.errorCode = errorCode;
this.message = message;
}

@Override
public int getStatus() {
return status;
}

@Override
public String getErrorCode() {
return errorCode;
}

@Override
public String getMessage() {
return message;
}
}
39 changes: 0 additions & 39 deletions src/main/java/camp/woowak/lab/store/exception/StoreException.java

This file was deleted.

Loading

0 comments on commit c6f1b26

Please sign in to comment.