Skip to content

Commit 576e884

Browse files
committed
feat: BusinessException 으로 에러 처리
1 parent 84cdee3 commit 576e884

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

src/main/java/timeeat/controller/web/auth/AuthMemberArgumentResolver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
99
import org.springframework.web.method.support.ModelAndViewContainer;
1010
import timeeat.controller.web.jwt.JwtManager;
11+
import timeeat.exception.BusinessErrorCode;
12+
import timeeat.exception.BusinessException;
1113

1214
@AllArgsConstructor
1315
public class AuthMemberArgumentResolver implements HandlerMethodArgumentResolver {
@@ -26,8 +28,7 @@ public Object resolveArgument(MethodParameter parameter,
2628
WebDataBinderFactory binderFactory) throws Exception {
2729
String accessToken = webRequest.getHeader(HttpHeaders.AUTHORIZATION);
2830
if (accessToken == null) {
29-
// TODO : BusinessException 으로 변경 - UNAUTHORIZED_MEMBER("AUTH001", "인증되지 않은 회원입니다.");
30-
throw new RuntimeException("인증되지 않은 회원입니다.");
31+
throw new BusinessException(BusinessErrorCode.UNAUTHORIZED_MEMBER);
3132
}
3233
long memberId = jwtManager.resolveAccessToken(accessToken);
3334
return new LoginMember(memberId);

src/main/java/timeeat/controller/web/jwt/JwtManager.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.Date;
88
import org.springframework.boot.context.properties.EnableConfigurationProperties;
99
import org.springframework.stereotype.Component;
10+
import timeeat.exception.BusinessErrorCode;
11+
import timeeat.exception.BusinessException;
1012

1113
@Component
1214
@EnableConfigurationProperties(JwtProperties.class)
@@ -56,19 +58,16 @@ private long resolveToken(String token, TokenType tokenType) {
5658
validateTokenType(claims, tokenType);
5759
return Long.parseLong(claims.getSubject());
5860
} catch (ExpiredJwtException exception) {
59-
// TODO : BusinessException 으로 변경 - EXPIRED_TOKEN("AUTH002", "이미 만료된 토큰입니다.");
60-
throw new RuntimeException("이미 만료된 토큰입니다.");
61+
throw new BusinessException(BusinessErrorCode.EXPIRED_TOKEN);
6162
} catch (Exception e) {
62-
// TODO : BusinessException 으로 변경 - UNAUTHORIZED_MEMBER("AUTH001", "인증되지 않은 회원입니다.");
63-
throw new RuntimeException("인증되지 않은 회원입니다.");
63+
throw new BusinessException(BusinessErrorCode.UNAUTHORIZED_MEMBER);
6464
}
6565
}
6666

6767
private void validateTokenType(Claims claims, TokenType tokenType) {
6868
String extractTokenType = claims.get("type", String.class);
6969
if (!extractTokenType.equals(tokenType.name())) {
70-
// TODO : BusinessException 으로 변경 - UNAUTHORIZED_MEMBER("AUTH001", "인증되지 않은 회원입니다.");
71-
throw new RuntimeException("인증되지 않은 회원입니다.");
70+
throw new BusinessException(BusinessErrorCode.UNAUTHORIZED_MEMBER);
7271
}
7372
}
7473
}

src/main/java/timeeat/exception/BusinessErrorCode.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ public enum BusinessErrorCode {
3636
DUPLICATE_BOOKMARK("BOK001", "이미 북마크된 매장입니다."),
3737
BOOKMARK_NOT_FOUND("BOK002", "북마크를 찾을 수 없습니다."),
3838
BOOKMARK_MEMBER_REQUIRED("BOK003", "북마크 생성 시 회원 정보는 필수입니다."),
39-
BOOKMARK_STORE_REQUIRED("BOK004", "북마크 생성 시 가게 정보는 필수입니다.");
39+
BOOKMARK_STORE_REQUIRED("BOK004", "북마크 생성 시 가게 정보는 필수입니다."),
40+
41+
// Auth
42+
UNAUTHORIZED_MEMBER("AUTH001", "인증되지 않은 회원입니다."),
43+
EXPIRED_TOKEN("AUTH002", "이미 만료된 토큰입니다."),
44+
;
4045

4146
private final String code;
4247
private final String message;

src/test/java/timeeat/controller/web/jwt/JwtManagerTest.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.assertj.core.api.Assertions.assertThatCode;
5-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
66

77
import java.time.Duration;
88
import org.junit.jupiter.api.Nested;
99
import org.junit.jupiter.api.Test;
10+
import timeeat.exception.BusinessErrorCode;
11+
import timeeat.exception.BusinessException;
1012

1113
class JwtManagerTest {
1214

@@ -59,28 +61,31 @@ class ResolveAccessToken {
5961
long id = 12345L;
6062
String accessToken = jwtManager.issueAccessToken(id);
6163

62-
assertThatThrownBy(() -> jwtManager.resolveAccessToken(accessToken))
63-
.isInstanceOf(RuntimeException.class)
64-
.hasMessage("이미 만료된 토큰입니다.");
64+
BusinessException exception = assertThrows(BusinessException.class,
65+
() -> jwtManager.resolveAccessToken(accessToken));
66+
67+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.EXPIRED_TOKEN);
6568
}
6669

6770
@Test
6871
void 유효하지_않은_액세스_토큰을_해석하면_에러가_발생한다() {
6972
String accessToken = "aaa.bbb.ccc";
7073

71-
assertThatThrownBy(() -> jwtManager.resolveAccessToken(accessToken))
72-
.isInstanceOf(RuntimeException.class)
73-
.hasMessage("인증되지 않은 회원입니다.");
74+
BusinessException exception = assertThrows(BusinessException.class,
75+
() -> jwtManager.resolveAccessToken(accessToken));
76+
77+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.UNAUTHORIZED_MEMBER);
7478
}
7579

7680
@Test
7781
void 액세스_토큰의_타입이_다르면_에러가_발생한다() {
7882
long id = 12345L;
7983
String refreshToken = jwtManager.issueRefreshToken(id);
8084

81-
assertThatThrownBy(() -> jwtManager.resolveAccessToken(refreshToken))
82-
.isInstanceOf(RuntimeException.class)
83-
.hasMessage("인증되지 않은 회원입니다.");
85+
BusinessException exception = assertThrows(BusinessException.class,
86+
() -> jwtManager.resolveAccessToken(refreshToken));
87+
88+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.UNAUTHORIZED_MEMBER);
8489
}
8590
}
8691

@@ -105,28 +110,31 @@ class ResolveRefreshToken {
105110
long id = 12345L;
106111
String refreshToken = jwtManager.issueRefreshToken(id);
107112

108-
assertThatThrownBy(() -> jwtManager.resolveRefreshToken(refreshToken))
109-
.isInstanceOf(RuntimeException.class)
110-
.hasMessage("이미 만료된 토큰입니다.");
113+
BusinessException exception = assertThrows(BusinessException.class,
114+
() -> jwtManager.resolveRefreshToken(refreshToken));
115+
116+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.EXPIRED_TOKEN);
111117
}
112118

113119
@Test
114120
void 유효하지_않은_리프레시_토큰을_해석하면_에러가_발생한다() {
115121
String refreshToken = "aaa.bbb.ccc";
116122

117-
assertThatThrownBy(() -> jwtManager.resolveRefreshToken(refreshToken))
118-
.isInstanceOf(RuntimeException.class)
119-
.hasMessage("인증되지 않은 회원입니다.");
123+
BusinessException exception = assertThrows(BusinessException.class,
124+
() -> jwtManager.resolveRefreshToken(refreshToken));
125+
126+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.UNAUTHORIZED_MEMBER);
120127
}
121128

122129
@Test
123130
void 리프레시_토큰의_타입이_다르면_에러가_발생한다() {
124131
long id = 12345L;
125132
String accessToken = jwtManager.issueAccessToken(id);
126133

127-
assertThatThrownBy(() -> jwtManager.resolveRefreshToken(accessToken))
128-
.isInstanceOf(RuntimeException.class)
129-
.hasMessage("인증되지 않은 회원입니다.");
134+
BusinessException exception = assertThrows(BusinessException.class,
135+
() -> jwtManager.resolveRefreshToken(accessToken));
136+
137+
assertThat(exception.getErrorCode()).isEqualTo(BusinessErrorCode.UNAUTHORIZED_MEMBER);
130138
}
131139
}
132140
}

0 commit comments

Comments
 (0)