diff --git a/src/main/java/server/poptato/user/api/UserController.java b/src/main/java/server/poptato/user/api/UserController.java index 056de09..59f643f 100644 --- a/src/main/java/server/poptato/user/api/UserController.java +++ b/src/main/java/server/poptato/user/api/UserController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.*; import server.poptato.global.response.BaseResponse; import server.poptato.user.api.request.UserChangeNameRequestDto; +import server.poptato.user.application.response.UserResponseDto; import server.poptato.user.application.service.UserService; import server.poptato.user.resolver.UserId; @@ -27,4 +28,9 @@ public BaseResponse updateUserName(@UserId Long userId, @Validated @RequestBody userService.updateUserName(userId, request.getNewName()); return new BaseResponse(); } + @GetMapping("/mypage") + public BaseResponse getUserNameAndEmail(@UserId Long userId) { + UserResponseDto response = userService.getUserNameAndEmailById(userId); + return new BaseResponse(response); + } } \ No newline at end of file diff --git a/src/main/java/server/poptato/user/application/response/UserResponseDto.java b/src/main/java/server/poptato/user/application/response/UserResponseDto.java new file mode 100644 index 0000000..64fd995 --- /dev/null +++ b/src/main/java/server/poptato/user/application/response/UserResponseDto.java @@ -0,0 +1,12 @@ +package server.poptato.user.application.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UserResponseDto { + private String name; + private String email; +} diff --git a/src/main/java/server/poptato/user/application/service/UserService.java b/src/main/java/server/poptato/user/application/service/UserService.java index ea87864..c7fffe8 100644 --- a/src/main/java/server/poptato/user/application/service/UserService.java +++ b/src/main/java/server/poptato/user/application/service/UserService.java @@ -3,18 +3,16 @@ import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import server.poptato.auth.application.service.JwtService; import server.poptato.todo.domain.repository.TodoRepository; +import server.poptato.user.application.response.UserResponseDto; import server.poptato.user.domain.entity.User; import server.poptato.user.domain.repository.UserRepository; import server.poptato.user.exception.UserException; import server.poptato.user.exception.errorcode.UserExceptionErrorCode; -import java.util.Optional; - @Service @RequiredArgsConstructor public class UserService { @@ -27,26 +25,25 @@ public class UserService { @Transactional public void deleteUser(Long userId) { - User user = userRepository.findById(userId).orElseThrow(() - -> new UserException(UserExceptionErrorCode.USER_NOT_EXIST)); + User user = checkIsExistUser(userId); todoRepository.deleteAllByUserId(userId); jwtService.deleteRefreshToken(String.valueOf(userId)); userRepository.delete(user); entityManager.flush(); } @Transactional - @CacheEvict(value = "users", key = "#kakaoId") - public Optional findUserByKakaoId(String kakaoId) { - entityManager.clear(); // 영속성 컨텍스트 초기화 - return userRepository.findByKakaoId(kakaoId); - } - @Transactional public void updateUserName(Long userId, String newName) { - // 사용자 조회 - User user = userRepository.findById(userId) - .orElseThrow(() -> new UserException(UserExceptionErrorCode.USER_NOT_EXIST)); - + User user = checkIsExistUser(userId); // name 업데이트 user.changeName(newName); } + @Transactional(readOnly = true) + public UserResponseDto getUserNameAndEmailById(Long userId) { + User user = checkIsExistUser(userId); + return new UserResponseDto(user.getName(), user.getEmail()); + } + private User checkIsExistUser(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> new UserException(UserExceptionErrorCode.USER_NOT_EXIST)); + } } diff --git a/src/test/java/server/poptato/user/api/UserControllerTest.java b/src/test/java/server/poptato/user/api/UserControllerTest.java index 357cddb..4a23cc2 100644 --- a/src/test/java/server/poptato/user/api/UserControllerTest.java +++ b/src/test/java/server/poptato/user/api/UserControllerTest.java @@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -53,6 +54,26 @@ class UserControllerTest { void 액세스토큰_비활성화() { jwtService.deleteRefreshToken(userId); } + + @Test + @DisplayName("프로필 조회 성공 테스트") + void getUserNameAndEmail() throws Exception { + mockMvc.perform(get("/user/mypage") + .header("Authorization", "Bearer "+accessToken) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + } + @Test + @DisplayName("프로필 조회 실패 테스트 - invalid token") + void getUserNameAndEmailFailedInvalidToken() throws Exception { + String invalidToken = "invalidToken"; + mockMvc.perform(get("/user/mypage") + .header("Authorization", "Bearer "+invalidToken) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + } @Test @DisplayName("사용자 이름 변경 성공 테스트") void updateUserName_ShouldReturnSuccess() throws Exception { diff --git a/src/test/java/server/poptato/user/application/UserServiceTest.java b/src/test/java/server/poptato/user/application/UserServiceTest.java index 6534b40..34e82b3 100644 --- a/src/test/java/server/poptato/user/application/UserServiceTest.java +++ b/src/test/java/server/poptato/user/application/UserServiceTest.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import server.poptato.user.application.response.UserResponseDto; import server.poptato.user.application.service.UserService; import server.poptato.user.domain.entity.User; import server.poptato.user.domain.repository.UserRepository; @@ -54,5 +55,29 @@ void updateUserName_ShouldThrowException_WhenUserNotFound() { assertThat(exception.getMessage()).isEqualTo(UserExceptionErrorCode.USER_NOT_EXIST.getMessage()); } + @Test + @DisplayName("getUserNameAndEmailById 메서드는 유효한 userId가 주어졌을 때 사용자 이름과 이메일을 반환한다") + public void shouldReturnUserNameAndEmail_WhenUserIdIsValid() { + // Given + Long userId = 1L; + + // When + UserResponseDto responseDto = userService.getUserNameAndEmailById(userId); + + // Then + assertThat(responseDto.getName()).isEqualTo("Poptato"); + assertThat(responseDto.getEmail()).isEqualTo("poptato@naver.com"); + } + + @Test + @DisplayName("getUserNameAndEmailById 메서드는 유효하지 않은 userId가 주어졌을 때 UserException을 던진다") + public void shouldThrowUserException_WhenUserIdIsInvalid() { + // Given + Long invalidUserId = 2L; + + // When & Then + org.junit.jupiter.api.Assertions.assertThrows(UserException.class, + () -> userService.getUserNameAndEmailById(invalidUserId)); + } }