Skip to content

Commit 59e358d

Browse files
authored
Merge pull request #7 from Block-Guard/refactor/#6/Global-Handler-Exception
[Refactor] global handler exception 추가
2 parents 4e65eaf + 77ea7ce commit 59e358d

File tree

18 files changed

+374
-78
lines changed

18 files changed

+374
-78
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ dependencies {
3838
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
3939
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
4040

41-
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
41+
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
4242

4343
}
4444

src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
66
import com.blockguard.server.domain.user.dto.response.LoginResponse;
77
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
8+
import com.blockguard.server.global.common.codes.SuccessCode;
9+
import com.blockguard.server.global.common.response.BaseResponse;
10+
import com.blockguard.server.global.config.swagger.CustomExceptionDescription;
11+
import com.blockguard.server.global.config.swagger.SwaggerResponseDescription;
12+
import io.swagger.v3.oas.annotations.Operation;
813
import lombok.AllArgsConstructor;
914
import org.springframework.http.ResponseEntity;
1015
import org.springframework.web.bind.annotation.PostMapping;
@@ -18,25 +23,22 @@
1823
public class AuthApi {
1924
private final AuthService authService;
2025

26+
@Operation(summary = "회원가입")
27+
@CustomExceptionDescription(SwaggerResponseDescription.REGISTER_FAIL)
2128
@PostMapping("/register")
22-
public ResponseEntity<RegisterResponse> register(@RequestBody RegisterRequest registerRequest) {
23-
try {
24-
RegisterResponse registerResponse = authService.register(registerRequest);
25-
return ResponseEntity.ok(registerResponse);
26-
} catch (IllegalStateException e) {
27-
return ResponseEntity.internalServerError().build();
28-
}
29+
public ResponseEntity<BaseResponse<RegisterResponse>> register(@RequestBody RegisterRequest registerRequest) {
30+
RegisterResponse registerResponse = authService.register(registerRequest);
31+
return ResponseEntity.ok(BaseResponse.of(SuccessCode.USER_REGISTERED, registerResponse));
32+
2933
}
3034

35+
36+
@Operation(summary = "로그인")
37+
@CustomExceptionDescription(SwaggerResponseDescription.LOGIN_FAIL)
3138
@PostMapping("/login")
32-
public ResponseEntity<LoginResponse> register(@RequestBody LoginRequest loginRequest) {
33-
try {
34-
LoginResponse loginResponse = authService.login(loginRequest);
35-
return ResponseEntity.ok(loginResponse);
36-
} catch (IllegalStateException e) {
37-
return ResponseEntity.internalServerError().build();
38-
}
39+
public ResponseEntity<BaseResponse<LoginResponse>> login(@RequestBody LoginRequest loginRequest) {
40+
LoginResponse loginResponse = authService.login(loginRequest);
41+
return ResponseEntity.ok(BaseResponse.of(SuccessCode.LOGIN_SUCCESS, loginResponse));
3942
}
4043

41-
4244
}

src/main/java/com/blockguard/server/domain/auth/application/AuthService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
99
import com.blockguard.server.domain.user.dto.response.LoginResponse;
1010
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
11+
import com.blockguard.server.global.common.codes.ErrorCode;
12+
import com.blockguard.server.global.exception.BusinessExceptionHandler;
1113
import lombok.AllArgsConstructor;
1214
import org.springframework.security.authentication.BadCredentialsException;
1315
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -22,7 +24,7 @@ public class AuthService {
2224

2325
public RegisterResponse register(RegisterRequest registerRequest) {
2426
if (userRepository.findByEmail((registerRequest.getEmail())).isPresent()) {
25-
throw new IllegalArgumentException("이미 가입되어 있는 아이디입니다.");
27+
throw new BusinessExceptionHandler(ErrorCode.DUPLICATED_EMAIL);
2628
}
2729

2830
User user = User.builder()
@@ -37,23 +39,21 @@ public RegisterResponse register(RegisterRequest registerRequest) {
3739
userRepository.save(user);
3840

3941
return RegisterResponse.builder()
40-
.msg("회원가입에 성공하였습니다.")
4142
.userId(user.getId())
4243
.build();
4344
}
4445

4546
public LoginResponse login(LoginRequest loginRequest) {
4647
User user = userRepository.findByEmail(loginRequest.getEmail())
47-
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다. 다시 한 번 확인해주세요."));
48+
.orElseThrow(() -> new BusinessExceptionHandler(ErrorCode.INVALID_EMAIL));
4849

4950
if (!passwordEncoder.matches(loginRequest.getPassword(), user.getPassword())){
50-
throw new BadCredentialsException("비밀번호가 일치하지 않습니다.");
51+
throw new BusinessExceptionHandler(ErrorCode.INVALID_PASSWORD);
5152
}
5253

5354
JwtToken jwtToken = jwtTokenGenerator.generateToken(user.getId(), "Bearer");
5455

5556
return LoginResponse.builder()
56-
.msg("로그인에 성공하였습니다.")
5757
.userId(user.getId())
5858
.jwtToken(jwtToken)
5959
.build();

src/main/java/com/blockguard/server/domain/auth/enums/JwtTokenExpireTime.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@Getter
66
public enum JwtTokenExpireTime {
77
ACCESS_TOKEN_EXPIRE_TIME(86400000),
8-
REFRESH_TOKEN_EXPIRE_TIME(86400000);
8+
REFRESH_TOKEN_EXPIRE_TIME(100000000);
99

1010
private final long expireTime;
1111

src/main/java/com/blockguard/server/domain/auth/infra/JwtTokenGenerator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.blockguard.server.domain.auth.infra;
22

3+
import com.blockguard.server.domain.auth.enums.JwtTokenExpireTime;
34
import io.jsonwebtoken.Jwts;
45
import io.jsonwebtoken.SignatureAlgorithm;
56
import io.jsonwebtoken.io.Decoders;
@@ -28,8 +29,13 @@ public JwtToken generateToken(Long userId, String grantType) {
2829
// 권한 가져오기
2930
long now = (new Date()).getTime();
3031

32+
// Jwt token time
33+
long accessTokenExpireTime = JwtTokenExpireTime.ACCESS_TOKEN_EXPIRE_TIME.getExpireTime();
34+
long refreshTokenExpireTime = JwtTokenExpireTime.REFRESH_TOKEN_EXPIRE_TIME.getExpireTime();
35+
36+
3137
// Access Token 생성
32-
Date accessTokenExpiresIn = new Date(now + 86400000);
38+
Date accessTokenExpiresIn = new Date(now + accessTokenExpireTime);
3339
String accessToken = Jwts.builder()
3440
.setSubject(String.valueOf(userId))
3541
.setExpiration(accessTokenExpiresIn)
@@ -38,7 +44,7 @@ public JwtToken generateToken(Long userId, String grantType) {
3844

3945
// Refresh Token 생성
4046
String refreshToken = Jwts.builder()
41-
.setExpiration(new Date(now + 86400000))
47+
.setExpiration(new Date(now + refreshTokenExpireTime))
4248
.signWith(key, SignatureAlgorithm.HS256)
4349
.compact();
4450

src/main/java/com/blockguard/server/domain/user/dto/response/LoginResponse.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
@AllArgsConstructor
1010
@Builder
1111
public class LoginResponse {
12-
private String msg;
1312
private Long userId;
1413
private JwtToken jwtToken;
1514
}

src/main/java/com/blockguard/server/domain/user/dto/response/RegisterResponse.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,5 @@
88
@AllArgsConstructor
99
@Builder
1010
public class RegisterResponse {
11-
private String msg;
1211
private Long userId;
1312
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.blockguard.server.global.common.codes;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import org.springframework.http.HttpStatus;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
public enum ErrorCode {
10+
/// 4000 ~ : client error
11+
DUPLICATED_EMAIL(HttpStatus.BAD_REQUEST, 4001, "이미 가입된 이메일입니다."),
12+
INVALID_EMAIL(HttpStatus.BAD_REQUEST, 4002, "존재하지 않는 이메일입니다."),
13+
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, 4003, "비밀번호가 일치하지 않습니다."),
14+
INVALID_TOKEN(HttpStatus.UNAUTHORIZED, 4004, "유효하지 않은 토큰입니다."),
15+
16+
// 5000~ : server error
17+
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000, "서버 오류가 발생했습니다.");
18+
19+
private final HttpStatus status;
20+
private final int code;
21+
private final String msg;
22+
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.blockguard.server.global.common.codes;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import org.springframework.http.HttpStatus;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
public enum SuccessCode {
10+
11+
OK(HttpStatus.OK, 2000, "OK"),
12+
USER_REGISTERED(HttpStatus.CREATED, 2001, "회원가입이 완료되었습니다."),
13+
LOGIN_SUCCESS(HttpStatus.OK, 2002, "로그인 성공");
14+
15+
private final HttpStatus status;
16+
private final int code;
17+
private final String msg;
18+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.blockguard.server.global.common.response;
2+
3+
import com.blockguard.server.global.common.codes.SuccessCode;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@Builder
10+
@AllArgsConstructor
11+
public class BaseResponse<T> {
12+
private int code;
13+
private String msg;
14+
private T data;
15+
16+
public static <T> BaseResponse<T> of(SuccessCode code, T data) {
17+
return BaseResponse.<T>builder()
18+
.code(code.getCode())
19+
.msg(code.getMsg())
20+
.data(data)
21+
.build();
22+
}
23+
24+
public static BaseResponse<Void> of(SuccessCode code) {
25+
return BaseResponse.<Void>builder()
26+
.code(code.getCode())
27+
.msg(code.getMsg())
28+
.data(null)
29+
.build();
30+
}
31+
}

0 commit comments

Comments
 (0)