Skip to content

Commit 8748ab1

Browse files
authored
[Refactor] 예외 메시지를 구체화한다 (#93)
feature: 예외 메시지를 구체화한다
1 parent 270ff28 commit 8748ab1

File tree

12 files changed

+83
-30
lines changed

12 files changed

+83
-30
lines changed

src/main/java/daybyquest/badge/domain/Badge.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package daybyquest.badge.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.INVALID_BADGE_NAME;
34
import static jakarta.persistence.GenerationType.IDENTITY;
45

56
import daybyquest.global.error.exception.InvalidDomainException;
@@ -38,7 +39,7 @@ public Badge(String name, Image image) {
3839

3940
private void validateName() {
4041
if (name.isEmpty() || name.length() > MAX_NAME_LENGTH) {
41-
throw new InvalidDomainException();
42+
throw new InvalidDomainException(INVALID_BADGE_NAME);
4243
}
4344
}
4445
}

src/main/java/daybyquest/comment/domain/Comment.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package daybyquest.comment.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.INVALID_COMMENT_CONTENT;
34
import static jakarta.persistence.GenerationType.IDENTITY;
45

56
import daybyquest.global.error.exception.InvalidDomainException;
@@ -48,7 +49,7 @@ public Comment(Long userId, Long postId, String content) {
4849

4950
private void validateContent() {
5051
if (content.isEmpty() || content.length() > MAX_CONTENT_SIZE) {
51-
throw new InvalidDomainException();
52+
throw new InvalidDomainException(INVALID_COMMENT_CONTENT);
5253
}
5354
}
5455
}

src/main/java/daybyquest/global/error/ExceptionCode.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,32 @@ public enum ExceptionCode {
2020

2121
INVALID_FILE("GLO-04", FORBIDDEN, "파일 오류 입니다"),
2222

23+
// Image
24+
INVALID_IMAGE_IDENTIFIER("IMG-00", BAD_REQUEST, "사진 식별자는 1~255자여야 합니다"),
25+
2326
// User
2427
NOT_EXIST_USER("USR-00", BAD_REQUEST, "사용자가 존재하지 않습니다"),
2528
DUPLICATED_USERNAME("USR-01", BAD_REQUEST, "이미 존재하는 사용자 이름 입니다"),
2629
DUPLICATED_EMAIL("USR-02", BAD_REQUEST, "이미 존재하는 이메일 입니다"),
30+
INVALID_USER_USERNAME("USR-03", BAD_REQUEST, "사용자의 username은 1~15자여야 합니다"),
31+
INVALID_USER_NAME("USR-04", BAD_REQUEST, "사용자의 이름은 1~20자여야 합니다"),
32+
INVALID_USER_EMAIL("USR-05", BAD_REQUEST, "이메일은 1~30자여야 하며, 형식을 지켜야합니다"),
33+
INVALID_USER_INTEREST("USR-06", BAD_REQUEST, "사용자의 관심사는 5개 이하여야 합니다"),
34+
NOT_UPDATABLE_USER("USR-07", BAD_REQUEST, "업데이트할 수 없는 사용자입니다"),
2735

2836
// Post
2937
NOT_EXIST_POST("POT-00", BAD_REQUEST, "게시물이 존재하지 않습니다"),
3038
ALREADY_LIKED_POST("POT-01", BAD_REQUEST, "이미 좋아요한 게시물입니다"),
3139
ALREADY_DISLIKED_POST("POT-02", BAD_REQUEST, "이미 관심없음한 게시물입니다"),
3240
NOT_EXIST_LIKE("POT-03", BAD_REQUEST, "좋아요하지 않은 게시물은 취소할 수 없습니다"),
3341
NOT_EXIST_DISLIKE("POT-04", BAD_REQUEST, "관심없음하지 않은 게시물은 취소할 수 없습니다"),
42+
INVALID_POST_IMAGE("POT-05", BAD_REQUEST, "게시물 사진은 1~5장이어야 합니다"),
43+
INVALID_POST_CONTENT("POT-06", BAD_REQUEST, "게시물 내용은 500자 이하여야 합니다"),
44+
ALREADY_JUDGED_POST("POT-07", BAD_REQUEST, "이미 판정된 게시물 입니다"),
3445

3546
// Comment
3647
NOT_EXIST_COMMENT("COM-00", BAD_REQUEST, "존재하지 않는 댓글입니다"),
48+
INVALID_COMMENT_CONTENT("COM-01", BAD_REQUEST, "댓글 내용은 1~200자여야 합니다"),
3749

3850
// Quest
3951
NOT_EXIST_QUEST("QUE-00", BAD_REQUEST, "존재하지 않는 퀘스트입니다"),
@@ -44,6 +56,15 @@ public enum ExceptionCode {
4456
EXCEED_MAX_QUEST("QUE-05", BAD_REQUEST, "최대 수행 가능 퀘스트를 초과하였습니다"),
4557
NOT_ACCEPTED_QUEST("QUE-06", BAD_REQUEST, "수행 중이지 않은 퀘스트입니다"),
4658
NO_RECOMMENDED_QUEST("QUE-07", BAD_REQUEST, "추천 할 퀘스트가 없습니다"),
59+
NOT_DOING_QUEST("QUE-08", BAD_REQUEST, "진행 중이지 않은 퀘스트입니다"),
60+
INVALID_QUEST_NAME("QUE-09", BAD_REQUEST, "퀘스트 이름은 1~30자여야 합니다"),
61+
INVALID_QUEST_CONTENT("QUE-10", BAD_REQUEST, "퀘스트 내용은 300자 이하여야 합니다"),
62+
INVALID_QUEST_IMAGE_DESCRIPTION("QUE-11", BAD_REQUEST, "퀘스트 사진 설명은 1~100자여야 합니다"),
63+
INVALID_QUEST_REWARD_COUNT("QUE-12", BAD_REQUEST, "목표 횟수는 1~365이어야 합니다"),
64+
INVALID_QUEST_IMAGE("QUE-13", BAD_REQUEST, "퀘스트 사진은 3장이어야 합니다"),
65+
INVALID_QUEST_REWARD("QUE-14", BAD_REQUEST, "보상과 목표 횟수는 둘 중 하나만 존재할 수 없습니다"),
66+
INVALID_QUEST_EXPIRED_AT("QUE-15", BAD_REQUEST, "만료일자는 현재보다 미래여야 합니다"),
67+
ALREADY_LABELED("QUE-16", BAD_REQUEST, "이미 라벨링된 퀘스트입니다"),
4768

4869
// Group
4970
NOT_EXIST_GROUP("GRP-00", BAD_REQUEST, "존재하지 않는 그룹입니다"),
@@ -53,15 +74,19 @@ public enum ExceptionCode {
5374
ALREADY_MEMBER("GRP-04", BAD_REQUEST, "이미 가입한 그룹입니다"),
5475
NOT_MEMBER("GRP-05", BAD_REQUEST, "가입하지 않은 그룹은 탈퇴할 수 없습니다"),
5576
NO_RECOMMENDED_GROUP("GRP-06", BAD_REQUEST, "추천 할 그룹이 없습니다"),
77+
INVALID_GROUP_NAME("GRP-07", BAD_REQUEST, "그룹 이름은 1~15자여야 합니다"),
78+
INVALID_GROUP_DESCRIPTION("GRP-08", BAD_REQUEST, "그룹 설명은 200자 이하여야 합니다"),
5679

5780
// Badge
5881
NOT_EXIST_BADGE("BDE-00", BAD_REQUEST, "존재하지 않는 뱃지입니다"),
5982
NOT_OWNING_BADGE("BDE-01", BAD_REQUEST, "보유하지 않은 뱃지는 프로필에 배치할 수 없습니다"),
6083
EXCEED_BADGE("BDE-02", BAD_REQUEST, "뱃지는 최대 15개만 지정가능합니다"),
84+
INVALID_BADGE_NAME("BDE-03", BAD_REQUEST, "뱃지 이름은 1~15글자여야 합니다."),
6185

6286
// Interest
6387
NOT_EXIST_INTEREST("INT-00", BAD_REQUEST, "존재하지 않는 관심사입니다"),
6488
ALREADY_EXIST_INTEREST("INT-01", BAD_REQUEST, "이미 존재하는 관심사 이름입니다"),
89+
INVALID_INTEREST_NAME("INT-02", BAD_REQUEST, "관심사 이름은 1~20글자여야 합니다"),
6590

6691
// Relationship
6792
NOT_FOLLOWING_USER("REL-00", BAD_REQUEST, "팔로우하지 않은 사용자입니다"),

src/main/java/daybyquest/global/error/exception/CustomException.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66
import lombok.Getter;
77
import org.springframework.http.HttpStatus;
88

9-
public class CustomException extends RuntimeException {
9+
public abstract class CustomException extends RuntimeException {
1010

1111
private final ExceptionCode exceptionCode;
1212

1313
@Getter
1414
private final List<String> fields;
1515

1616
public CustomException(ExceptionCode exceptionCode, List<String> fields) {
17+
super(exceptionCode.getMessage());
1718
this.exceptionCode = exceptionCode;
1819
this.fields = fields;
1920
}
2021

2122
public CustomException(ExceptionCode exceptionCode) {
22-
this.exceptionCode = exceptionCode;
23-
this.fields = Collections.emptyList();
23+
this(exceptionCode, Collections.emptyList());
2424
}
2525

2626
public String getCode() {

src/main/java/daybyquest/group/domain/Group.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package daybyquest.group.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.INVALID_GROUP_DESCRIPTION;
4+
import static daybyquest.global.error.ExceptionCode.INVALID_GROUP_NAME;
35
import static jakarta.persistence.GenerationType.IDENTITY;
46
import static lombok.AccessLevel.PROTECTED;
57

@@ -57,13 +59,13 @@ private void validate() {
5759

5860
private void validateName() {
5961
if (name.isEmpty() || name.length() > MAX_NAME_LENGTH) {
60-
throw new InvalidDomainException();
62+
throw new InvalidDomainException(INVALID_GROUP_NAME);
6163
}
6264
}
6365

6466
private void validateDescription() {
6567
if (description != null && description.length() > MAX_DESCRIPTION_LENGTH) {
66-
throw new InvalidDomainException();
68+
throw new InvalidDomainException(INVALID_GROUP_DESCRIPTION);
6769
}
6870
}
6971
}

src/main/java/daybyquest/group/domain/Groups.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package daybyquest.group.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.ALREADY_MEMBER;
4+
35
import daybyquest.global.error.exception.InvalidDomainException;
46
import daybyquest.global.error.exception.NotExistGroupException;
57
import daybyquest.interest.domain.Interests;
@@ -63,7 +65,7 @@ public void validateExistentById(final Long id) {
6365

6466
private void validateNotMember(final Long userId, final Long groupId) {
6567
if (groupUserRepository.existsByUserIdAndGroupId(userId, groupId)) {
66-
throw new InvalidDomainException();
68+
throw new InvalidDomainException(ALREADY_MEMBER);
6769
}
6870
}
6971
}

src/main/java/daybyquest/image/domain/Image.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package daybyquest.image.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.INVALID_IMAGE_IDENTIFIER;
34
import static lombok.AccessLevel.PROTECTED;
45

56
import daybyquest.global.error.exception.InvalidDomainException;
@@ -26,7 +27,7 @@ public Image(String identifier) {
2627

2728
private void validateIdentifier() {
2829
if (identifier == null || identifier.isEmpty() || identifier.length() > MAX_IDENTIFIER_LENGTH) {
29-
throw new InvalidDomainException();
30+
throw new InvalidDomainException(INVALID_IMAGE_IDENTIFIER);
3031
}
3132
}
3233

src/main/java/daybyquest/interest/domain/Interest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package daybyquest.interest.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.INVALID_INTEREST_NAME;
4+
35
import daybyquest.global.error.exception.InvalidDomainException;
46
import daybyquest.image.domain.Image;
57
import jakarta.persistence.Column;
@@ -36,7 +38,7 @@ public String getImageIdentifier() {
3638

3739
private void validateName() {
3840
if (name.isEmpty() || name.length() > MAX_NAME_LENGTH) {
39-
throw new InvalidDomainException();
41+
throw new InvalidDomainException(INVALID_INTEREST_NAME);
4042
}
4143
}
4244
}

src/main/java/daybyquest/participant/domain/Participant.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static daybyquest.global.error.ExceptionCode.ALREADY_REWARDED_QUEST;
44
import static daybyquest.global.error.ExceptionCode.NOT_CONTINUABLE_QUEST;
5+
import static daybyquest.global.error.ExceptionCode.NOT_DOING_QUEST;
56
import static daybyquest.global.error.ExceptionCode.NOT_FINISHABLE_QUEST;
67
import static daybyquest.participant.domain.ParticipantState.CONTINUE;
78
import static daybyquest.participant.domain.ParticipantState.DOING;
@@ -86,7 +87,7 @@ public void doContinue() {
8687

8788
public void increaseLinkedCount() {
8889
if (state != DOING && state != CONTINUE) {
89-
throw new InvalidDomainException();
90+
throw new InvalidDomainException(NOT_DOING_QUEST);
9091
}
9192
linkedCount += 1;
9293
}

src/main/java/daybyquest/post/domain/Post.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package daybyquest.post.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.ALREADY_JUDGED_POST;
4+
import static daybyquest.global.error.ExceptionCode.INVALID_POST_CONTENT;
5+
import static daybyquest.global.error.ExceptionCode.INVALID_POST_IMAGE;
6+
import static daybyquest.global.error.ExceptionCode.NOT_EXIST_USER;
37
import static daybyquest.post.domain.PostState.NEED_CHECK;
48
import static daybyquest.post.domain.PostState.NOT_DECIDED;
59
import static daybyquest.post.domain.PostState.SUCCESS;
@@ -77,32 +81,32 @@ public Post(Long userId, Long questId, String content, List<Image> images) {
7781

7882
private void validateUserId() {
7983
if (userId == null) {
80-
throw new InvalidDomainException();
84+
throw new InvalidDomainException(NOT_EXIST_USER);
8185
}
8286
}
8387

8488
private void validateImages() {
8589
if (images.isEmpty() || images.size() > MAX_IMAGE_SIZE) {
86-
throw new InvalidDomainException();
90+
throw new InvalidDomainException(INVALID_POST_IMAGE);
8791
}
8892
}
8993

9094
private void validateContent() {
9195
if (content.length() > MAX_CONTENT_SIZE) {
92-
throw new InvalidDomainException();
96+
throw new InvalidDomainException(INVALID_POST_CONTENT);
9397
}
9498
}
9599

96100
public void success() {
97101
if (state != NOT_DECIDED) {
98-
throw new InvalidDomainException();
102+
throw new InvalidDomainException(ALREADY_JUDGED_POST);
99103
}
100104
state = SUCCESS;
101105
}
102106

103107
public void needCheck() {
104108
if (state != NOT_DECIDED) {
105-
throw new InvalidDomainException();
109+
throw new InvalidDomainException(ALREADY_JUDGED_POST);
106110
}
107111
state = NEED_CHECK;
108112
}

src/main/java/daybyquest/quest/domain/Quest.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package daybyquest.quest.domain;
22

3+
import static daybyquest.global.error.ExceptionCode.ALREADY_LABELED;
4+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_CONTENT;
5+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_EXPIRED_AT;
6+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_IMAGE;
7+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_IMAGE_DESCRIPTION;
8+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_NAME;
9+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_REWARD;
10+
import static daybyquest.global.error.ExceptionCode.INVALID_QUEST_REWARD_COUNT;
11+
import static daybyquest.global.error.ExceptionCode.NOT_EXIST_GROUP;
312
import static daybyquest.quest.domain.QuestState.ACTIVE;
413
import static daybyquest.quest.domain.QuestState.NEED_LABEL;
514
import static jakarta.persistence.GenerationType.IDENTITY;
@@ -117,7 +126,7 @@ public static Quest createGroupQuest(final Long groupId, final String interestNa
117126

118127
private static void validateGroupId(final Long groupId) {
119128
if (groupId == null) {
120-
throw new InvalidDomainException();
129+
throw new InvalidDomainException(NOT_EXIST_GROUP);
121130
}
122131
}
123132

@@ -133,19 +142,19 @@ private void validate() {
133142

134143
private void validateTitle() {
135144
if (title.isEmpty() || title.length() > MAX_TITLE_LENGTH) {
136-
throw new InvalidDomainException();
145+
throw new InvalidDomainException(INVALID_QUEST_NAME);
137146
}
138147
}
139148

140149
private void validateContent() {
141150
if (content.length() > MAX_CONTENT_LENGTH) {
142-
throw new InvalidDomainException();
151+
throw new InvalidDomainException(INVALID_QUEST_CONTENT);
143152
}
144153
}
145154

146155
private void validateImageDescription() {
147156
if (imageDescription.isEmpty() || imageDescription.length() > MAX_IMAGE_DESCRIPTION_LENGTH) {
148-
throw new InvalidDomainException();
157+
throw new InvalidDomainException(INVALID_QUEST_IMAGE_DESCRIPTION);
149158
}
150159
}
151160

@@ -154,31 +163,31 @@ private void validateRewardCount() {
154163
return;
155164
}
156165
if (rewardCount < MIN_REWARD_COUNT || rewardCount > MAX_REWARD_COUNT) {
157-
throw new InvalidDomainException();
166+
throw new InvalidDomainException(INVALID_QUEST_REWARD_COUNT);
158167
}
159168
}
160169

161170
private void validateImageCount() {
162171
if (images.size() != IMAGE_COUNT) {
163-
throw new InvalidDomainException();
172+
throw new InvalidDomainException(INVALID_QUEST_IMAGE);
164173
}
165174
}
166175

167176
private void validateReward() {
168177
if (rewardCount == null ^ badgeId == null) {
169-
throw new InvalidDomainException();
178+
throw new InvalidDomainException(INVALID_QUEST_REWARD);
170179
}
171180
}
172181

173182
private void validateExpiredAt() {
174183
if (expiredAt != null && expiredAt.isBefore(LocalDateTime.now())) {
175-
throw new InvalidDomainException();
184+
throw new InvalidDomainException(INVALID_QUEST_EXPIRED_AT);
176185
}
177186
}
178187

179188
public void setLabel(final String label) {
180189
if (this.state != NEED_LABEL) {
181-
throw new InvalidDomainException();
190+
throw new InvalidDomainException(ALREADY_LABELED);
182191
}
183192
this.label = label;
184193
this.state = ACTIVE;

0 commit comments

Comments
 (0)