Skip to content

Commit 6d665bd

Browse files
committed
feat : 로그인/비로그인 유저 JWT 토큰 생성 로직 구현
1 parent 022bc91 commit 6d665bd

File tree

11 files changed

+130
-22
lines changed

11 files changed

+130
-22
lines changed

src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ public enum BaseResponseMessage {
1616
유저_이름_변경이_완료되었습니다("유저 이름 변경이 완료되었습니다"),
1717
존재하지_않는_유저입니다("존재하지 않는 유저입니다"),
1818
유저_이름의_길이는_1부터_5까지만_가능합니다("유저 이름의 길이는 1부터 5까지만 가능합니다"),
19+
ROLE_필드는_필수입력입니다("ROLE 필드는 필수입력입니다"),
20+
이메일_형식이_올바르지_못합니다("이메일 형식이 올바르지 못합니다"),
21+
유저가_성공적으로_인증되었습니다("유저가 성공적으로 인증되었습니다"),
22+
GUEST_유저_토큰이_정상적으로_생성되었습니다("GUEST 유저 토큰이 정상적으로 생성되었습니다"),
1923

2024
//jwt error message
2125
JWT_토큰_오류입니다("JWT 토큰 오류입니다"),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
package com.neighbors.tohero.application.user.dto;
22

3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.neighbors.tohero.common.enums.Role;
5+
import jakarta.validation.constraints.Email;
6+
import jakarta.validation.constraints.NotBlank;
7+
import jakarta.validation.constraints.NotNull;
8+
import org.hibernate.validator.constraints.Length;
9+
310
public record AuthenticateUserRequest (
11+
@NotNull
12+
Role role,
13+
14+
@NotBlank
15+
@Length(min = 1, max = 5)
16+
String nickname,
417

18+
@JsonInclude(JsonInclude.Include.NON_NULL)
19+
@Email
20+
String email
521
){
622
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.neighbors.tohero.application.user.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.neighbors.tohero.common.enums.Role;
5+
import com.neighbors.tohero.common.jwt.AuthTokens;
6+
import com.neighbors.tohero.domain.domain.user.model.User;
7+
8+
public record AuthenticateUserResponse(
9+
AuthTokens authTokens,
10+
11+
@JsonInclude(JsonInclude.Include.NON_NULL)
12+
UserInfo userInfo
13+
) {
14+
public record UserInfo(
15+
long userId,
16+
String nickname,
17+
String email,
18+
Role role
19+
){
20+
}
21+
22+
public static AuthenticateUserResponse toUserDTO(AuthTokens authTokens, User user) {
23+
UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole());
24+
return new AuthenticateUserResponse(authTokens, userInfo);
25+
}
26+
27+
public static AuthenticateUserResponse toGuestDTO(AuthTokens authTokens) {
28+
return new AuthenticateUserResponse(authTokens, null);
29+
}
30+
}

src/main/java/com/neighbors/tohero/application/user/service/UserService.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
55
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
66
import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest;
7+
import com.neighbors.tohero.application.user.dto.AuthenticateUserResponse;
8+
import com.neighbors.tohero.common.enums.Role;
9+
import com.neighbors.tohero.common.jwt.AuthTokens;
10+
import com.neighbors.tohero.common.jwt.JwtProvider;
11+
import com.neighbors.tohero.common.jwt.JwtUserDetails;
12+
import com.neighbors.tohero.domain.domain.user.model.User;
13+
import com.neighbors.tohero.domain.domain.user.service.CreateUser;
714
import com.neighbors.tohero.domain.domain.user.service.UpdateUser;
815
import lombok.RequiredArgsConstructor;
916
import org.springframework.stereotype.Service;
@@ -13,18 +20,42 @@
1320
public class UserService {
1421

1522
private final UpdateUser updateUser;
23+
private final CreateUser createUser;
24+
private final JwtProvider jwtProvider;
1625

1726
public BaseResponse updateUserName(long userId, String nickname){
1827

1928
updateUser.updateUserName(userId, nickname);
20-
2129
return new BaseResponse(
2230
BaseResponseStatus.OK,
2331
BaseResponseMessage.유저_이름_변경이_완료되었습니다.getMessage()
2432
);
2533
}
2634

27-
public BaseResponse authenticateUser(AuthenticateUserRequest authenticateUserRequest){
28-
return null;
35+
public BaseResponse<AuthenticateUserResponse> authenticateUser(AuthenticateUserRequest authenticateUserRequest){
36+
if(authenticateUserRequest.role() == Role.USER){
37+
return returnLoginedUserToken(authenticateUserRequest);
38+
}
39+
return returnGuestUserToken(authenticateUserRequest);
40+
}
41+
42+
private BaseResponse<AuthenticateUserResponse> returnLoginedUserToken(AuthenticateUserRequest authenticateUserRequest) {
43+
User createdUser = createUser.createUser(User.toEntity(authenticateUserRequest));
44+
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser));
45+
46+
return new BaseResponse(
47+
BaseResponseStatus.OK,
48+
BaseResponseMessage.유저가_성공적으로_인증되었습니다.getMessage(),
49+
AuthenticateUserResponse.toUserDTO(authTokens, createdUser)
50+
);
51+
}
52+
53+
private BaseResponse<AuthenticateUserResponse> returnGuestUserToken(AuthenticateUserRequest authenticateUserRequest) {
54+
AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.makeGuestJwtDetails(authenticateUserRequest.nickname()));
55+
return new BaseResponse(
56+
BaseResponseStatus.OK,
57+
BaseResponseMessage.GUEST_유저_토큰이_정상적으로_생성되었습니다.getMessage(),
58+
AuthenticateUserResponse.toGuestDTO(authTokens)
59+
);
2960
}
3061
}

src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public WebSecurityCustomizer webSecurityCustomizer() {
4141
"/v3/api-docs/**",
4242
"/oauth/kakao/callback",
4343
"/oauth/kakao/callback2",
44+
"/user/auth",
4445
"/auth/refreshToken",
4546
"/address",
4647
"/notice/**",

src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ public class JwtProvider {
2929
private long REFRESH_TOKEN_EXPIRED_IN;
3030

3131
public AuthTokens createToken(JwtUserDetails jwtUserDetails) {
32-
log.info("JWT key={}", JWT_SECRET_KEY);
33-
3432
Claims claims = Jwts.claims()
3533
.setSubject(jwtUserDetails.getNickname())
3634
.setIssuer("ToHero");
@@ -40,7 +38,7 @@ public AuthTokens createToken(JwtUserDetails jwtUserDetails) {
4038
claims.put("userId", jwtUserDetails.getUserId());
4139
claims.put("email", jwtUserDetails.getEmail());
4240
}
43-
41+
4442
Date now = new Date();
4543
Date accessTokenExpiredAt = new Date(now.getTime() + JWT_EXPIRED_IN);
4644
Date refreshTokenExpiredAt = new Date(now.getTime() + REFRESH_TOKEN_EXPIRED_IN);

src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.neighbors.tohero.domain.domain.user.model;
22

3+
import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest;
34
import com.neighbors.tohero.common.enums.Role;
45
import lombok.AllArgsConstructor;
56
import lombok.Builder;
@@ -17,4 +18,12 @@ public class User {
1718
public static User of (Long userId, String userName, String email, Role role) {
1819
return new User(userId, userName, email, role);
1920
}
21+
22+
public static User toEntity(AuthenticateUserRequest authenticateUserRequest) {
23+
return User.builder()
24+
.userName(authenticateUserRequest.nickname())
25+
.email(authenticateUserRequest.email())
26+
.role(authenticateUserRequest.role())
27+
.build();
28+
}
2029
}
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.neighbors.tohero.domain.domain.user.service;
22

33
import com.neighbors.tohero.common.annotaion.DomainService;
4+
import com.neighbors.tohero.domain.domain.user.model.User;
45
import com.neighbors.tohero.domain.query.UserRepository;
56
import lombok.RequiredArgsConstructor;
67

@@ -10,7 +11,11 @@ public class UpdateUser {
1011

1112
private final UserRepository userRepository;
1213

13-
public void updateUserName(long userId, String nickname) {
14-
userRepository.updateUserName(userId, nickname);
14+
public User updateUserName(long userId, String nickname) {
15+
return userRepository.updateUserName(repo -> repo.findByUserId(userId), nickname);
16+
}
17+
18+
public User updateUserName(String email, String nickname){
19+
return userRepository.updateUserName(repo -> repo.findByEmail(email), nickname);
1520
}
1621
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.neighbors.tohero.domain.query;
22

33
import com.neighbors.tohero.domain.domain.user.model.User;
4+
import com.neighbors.tohero.infrastructure.entity.UserEntity;
5+
import com.neighbors.tohero.infrastructure.repository.UserEntityRepository;
6+
7+
import java.util.Optional;
8+
import java.util.function.Function;
49

510
public interface UserRepository {
611
User createUser(User user);
7-
void updateUserName(long userId, String nickname);
12+
User updateUserName(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction, String nickname);
813
User getUserByEmail(String email);
914
}

src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import lombok.RequiredArgsConstructor;
1212
import org.springframework.stereotype.Repository;
1313

14+
import java.util.Optional;
15+
import java.util.function.Function;
16+
1417
@Repository
1518
@RequiredArgsConstructor
1619
public class UserRepositoryImpl implements UserRepository {
@@ -20,27 +23,32 @@ public class UserRepositoryImpl implements UserRepository {
2023

2124
@Override
2225
public User createUser(User user) {
23-
UserEntity userEntity = userMapper.toEntity(user);
24-
userEntityRepository.save(userEntity);
26+
try{
27+
return getUserByEmail(user.getEmail());
28+
}catch(UserException e){
29+
UserEntity userEntity = userMapper.toEntity(user);
30+
userEntityRepository.save(userEntity);
2531

26-
UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail())
27-
.orElseThrow(() -> new UserException(
28-
BaseResponseStatus.NO_RESULT,
29-
BaseResponseMessage.존재하지_않는_유저입니다.getMessage()
30-
));;
31-
return userMapper.toDomain(createdUserEntity);
32+
UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail())
33+
.orElseThrow(() -> new UserException(
34+
BaseResponseStatus.NO_RESULT,
35+
BaseResponseMessage.존재하지_않는_유저입니다.getMessage()
36+
));;
37+
return userMapper.toDomain(createdUserEntity);
38+
}
3239
}
3340

3441
@Override
35-
public void updateUserName(long userId, String nickname) {
36-
UserEntity matchedUserEntity = userEntityRepository.findByUserId(userId)
42+
public User updateUserName(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction, String nickname) {
43+
UserEntity matchedUserEntity = findUserFunction.apply(userEntityRepository)
3744
.orElseThrow(() -> new UserException(
3845
BaseResponseStatus.BAD_REQUEST,
3946
BaseResponseMessage.존재하지_않는_유저입니다.getMessage()
4047
));
4148

4249
matchedUserEntity.changeNickname(nickname);
43-
userEntityRepository.save(matchedUserEntity);
50+
UserEntity userEntity = userEntityRepository.save(matchedUserEntity);
51+
return userMapper.toDomain(userEntity);
4452
}
4553

4654
@Override

0 commit comments

Comments
 (0)