Skip to content

Commit 93a467e

Browse files
authored
[Feat] 회원정보 조회/수정 API 개발 (#63)
* feat: 회원정보 조회 응답 DTO 구현 (#53) * feat: 회원정보 조회 서비스 구현 (#53) * feat: 회원정보 조회 컨트롤러 구현 (#53) * feat: 회원정보 수정 요청 및 응답 DTO 구현 (#54) * feat: 닉네임 유효성 검사 로직 구현 (#54) * feat: 회원정보 수정 서비스 구현 (#54) * fix: 닉네임이 기존과 동일한 경우 중복 검사 없이 바로 반환 (#54) * feat: 회원정보 수정 컨트롤러 구현 (#54)
1 parent b97d9df commit 93a467e

File tree

11 files changed

+110
-11
lines changed

11 files changed

+110
-11
lines changed

src/main/java/com/moa/moa_server/domain/group/handler/GroupErrorCode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public enum GroupErrorCode implements BaseErrorCode {
1111
CANNOT_JOIN_PUBLIC_GROUP(HttpStatus.BAD_REQUEST),
1212
INVALID_INPUT(HttpStatus.BAD_REQUEST),
1313
INVITE_CODE_GENERATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR),
14-
DUPLICATE_NAME(HttpStatus.CONFLICT);
14+
DUPLICATED_NAME(HttpStatus.CONFLICT);
1515

1616
private final HttpStatus status;
1717

src/main/java/com/moa/moa_server/domain/group/service/GroupService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public GroupCreateResponse createGroup(Long userId, GroupCreateRequest request)
101101

102102
// 그룹 이름 중복 검사
103103
if (groupRepository.existsByName(request.name())) {
104-
throw new GroupException(GroupErrorCode.DUPLICATE_NAME);
104+
throw new GroupException(GroupErrorCode.DUPLICATED_NAME);
105105
}
106106

107107
// 초대 코드 생성

src/main/java/com/moa/moa_server/domain/user/controller/UserController.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.moa.moa_server.domain.user.controller;
22

33
import com.moa.moa_server.domain.global.dto.ApiResponse;
4+
import com.moa.moa_server.domain.user.dto.request.UserUpdateRequest;
45
import com.moa.moa_server.domain.user.dto.response.GroupLabelResponse;
56
import com.moa.moa_server.domain.user.dto.response.JoinedGroupResponse;
7+
import com.moa.moa_server.domain.user.dto.response.UserInfoResponse;
8+
import com.moa.moa_server.domain.user.dto.response.UserUpdateResponse;
69
import com.moa.moa_server.domain.user.service.UserService;
710
import lombok.RequiredArgsConstructor;
811
import org.springframework.http.ResponseEntity;
912
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10-
import org.springframework.web.bind.annotation.GetMapping;
11-
import org.springframework.web.bind.annotation.RequestMapping;
12-
import org.springframework.web.bind.annotation.RequestParam;
13-
import org.springframework.web.bind.annotation.RestController;
13+
import org.springframework.web.bind.annotation.*;
1414

1515
@RestController
1616
@RequiredArgsConstructor
@@ -38,4 +38,21 @@ public ResponseEntity<ApiResponse> getJoinedGroups(
3838
JoinedGroupResponse response = userService.getJoinedGroups(userId, cursor, size);
3939
return ResponseEntity.ok(new ApiResponse("SUCCESS", response));
4040
}
41+
42+
@GetMapping
43+
public ResponseEntity<ApiResponse> getUserInfo(
44+
@AuthenticationPrincipal Long userId
45+
) {
46+
UserInfoResponse response = userService.getUserInfo(userId);
47+
return ResponseEntity.ok(new ApiResponse("SUCCESS", response));
48+
}
49+
50+
@PatchMapping
51+
public ResponseEntity<ApiResponse> updateUserInfo(
52+
@AuthenticationPrincipal Long userId,
53+
@RequestBody UserUpdateRequest request
54+
) {
55+
UserUpdateResponse response = userService.updateUserInfo(userId, request);
56+
return ResponseEntity.ok(new ApiResponse("SUCCESS", response));
57+
}
4158
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.moa.moa_server.domain.user.dto.request;
2+
3+
public record UserUpdateRequest(
4+
String nickname
5+
) {}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.moa.moa_server.domain.user.dto.response;
2+
3+
public record UserInfoResponse(
4+
String nickname
5+
) {
6+
public static UserInfoResponse from(String nickname) {
7+
return new UserInfoResponse(nickname);
8+
}
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.moa.moa_server.domain.user.dto.response;
2+
3+
public record UserUpdateResponse(
4+
String nickname
5+
) {}

src/main/java/com/moa/moa_server/domain/user/entity/User.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,8 @@ public enum UserStatus {
4848
WITHDRAWN,
4949
DORMANT,
5050
}
51+
52+
public void updateNickname(String nickname) {
53+
this.nickname = nickname;
54+
}
5155
}

src/main/java/com/moa/moa_server/domain/user/handler/UserErrorCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ public enum UserErrorCode implements BaseErrorCode {
77

88
USER_NOT_FOUND(HttpStatus.NOT_FOUND),
99
USER_WITHDRAWN(HttpStatus.UNAUTHORIZED),
10-
INVALID_CURSOR_FORMAT(HttpStatus.BAD_REQUEST),;
10+
INVALID_CURSOR_FORMAT(HttpStatus.BAD_REQUEST),
11+
INVALID_NICKNAME(HttpStatus.BAD_REQUEST),
12+
DUPLICATED_NICKNAME(HttpStatus.CONFLICT);
1113

1214
private final HttpStatus status;
1315

src/main/java/com/moa/moa_server/domain/user/repository/UserRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
import org.springframework.data.jpa.repository.JpaRepository;
55

66
public interface UserRepository extends JpaRepository<User, Long> {
7+
boolean existsByNickname(String nickname);
78
}

src/main/java/com/moa/moa_server/domain/user/service/UserService.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
import com.moa.moa_server.domain.group.entity.GroupMember;
66
import com.moa.moa_server.domain.group.repository.GroupMemberRepository;
77
import com.moa.moa_server.domain.group.service.GroupService;
8-
import com.moa.moa_server.domain.user.dto.response.GroupDetail;
9-
import com.moa.moa_server.domain.user.dto.response.GroupLabel;
10-
import com.moa.moa_server.domain.user.dto.response.GroupLabelResponse;
11-
import com.moa.moa_server.domain.user.dto.response.JoinedGroupResponse;
8+
import com.moa.moa_server.domain.user.dto.request.UserUpdateRequest;
9+
import com.moa.moa_server.domain.user.dto.response.*;
1210
import com.moa.moa_server.domain.user.entity.User;
1311
import com.moa.moa_server.domain.user.handler.UserErrorCode;
1412
import com.moa.moa_server.domain.user.handler.UserException;
1513
import com.moa.moa_server.domain.user.repository.UserRepository;
1614
import com.moa.moa_server.domain.user.util.AuthUserValidator;
15+
import com.moa.moa_server.domain.user.util.UserValidator;
1716
import jakarta.annotation.Nullable;
1817
import lombok.RequiredArgsConstructor;
1918
import org.springframework.stereotype.Service;
19+
import org.springframework.transaction.annotation.Isolation;
2020
import org.springframework.transaction.annotation.Transactional;
2121

2222
import java.util.LinkedList;
@@ -95,4 +95,39 @@ public JoinedGroupResponse getJoinedGroups(Long userId, @Nullable String cursor,
9595

9696
return new JoinedGroupResponse(groups, nextCursor, hasNext, groups.size());
9797
}
98+
99+
@Transactional(readOnly = true)
100+
public UserInfoResponse getUserInfo(Long userId) {
101+
User user = userRepository.findById(userId)
102+
.orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND));
103+
AuthUserValidator.validateActive(user);
104+
105+
return UserInfoResponse.from(user.getNickname());
106+
}
107+
108+
@Transactional(isolation = Isolation.READ_COMMITTED)
109+
public UserUpdateResponse updateUserInfo(Long userId, UserUpdateRequest request) {
110+
String newNickname = request.nickname();
111+
112+
User user = userRepository.findById(userId)
113+
.orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND));
114+
AuthUserValidator.validateActive(user);
115+
116+
// 닉네임 유효성 검사
117+
UserValidator.validateNickname(newNickname);
118+
119+
// 동일 닉네임이면 중복 처리 없이 바로 반환
120+
if (user.getNickname().equals(newNickname)) {
121+
return new UserUpdateResponse(user.getNickname());
122+
}
123+
124+
// 닉네임 중복 검사
125+
if (userRepository.existsByNickname(newNickname)) {
126+
throw new UserException(UserErrorCode.DUPLICATED_NICKNAME);
127+
}
128+
129+
// 닉네임 변경
130+
user.updateNickname(newNickname);
131+
return new UserUpdateResponse(newNickname);
132+
}
98133
}

0 commit comments

Comments
 (0)