Skip to content

Commit

Permalink
[#147] Refactor: 메소드 순서 및 네이밍 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
tkguswls1106 committed Jun 11, 2024
1 parent f2a7e65 commit 4d86dab
Show file tree
Hide file tree
Showing 15 changed files with 162 additions and 166 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,17 @@ public ResponseEntity<ResponseData<AuthDto.SignupResponse>> signup(
return ResponseData.toResponseEntity(ResponseCode.CREATED_USER, signupResponseDto); // 이 reponseDto 내에 새로운 JWT Access 토큰이 들어있음. 이후 앞으로는 이걸로 헤더에 장착해야함.
}

@PostMapping("/reissue")
@Operation(summary = "JWT Access Token 재발급 [JWT X]")
public ResponseEntity<ResponseData<AuthDto.TokenResponse>> reissue(@RequestBody AuthDto.ReissueRequest reissueRequestDto) {
AuthDto.TokenResponse tokenResponseDto = authService.reissue(reissueRequestDto);
return ResponseData.toResponseEntity(ResponseCode.REISSUE_SUCCESS, tokenResponseDto);
}

@DeleteMapping("/users")
@Operation(summary = "마이 Page - 회원탈퇴 [JWT O]")
public ResponseEntity<ResponseData> withdrawal() {
authService.withdrawal();
return ResponseData.toResponseEntity(ResponseCode.DELETE_USER);
}

@PostMapping("/reissue")
@Operation(summary = "로그인 유지 - JWT Access Token 재발급 [JWT X]")
public ResponseEntity<ResponseData<AuthDto.TokenResponse>> reissue(@RequestBody AuthDto.ReissueRequest reissueRequestDto) {
AuthDto.TokenResponse tokenResponseDto = authService.reissue(reissueRequestDto);
return ResponseData.toResponseEntity(ResponseCode.REISSUE_SUCCESS, tokenResponseDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,34 @@ public ResponseEntity<ResponseData<RoomDto.Response>> createRoom(@RequestBody Pr
}

@GetMapping("/rooms")
@Operation(summary = "초대링크 방 조회 [JWT O]", description = "URI : /rooms?link={방링크 string}")
@Operation(summary = "초대 접속 - 초대링크 방 조회 [JWT O]", description = "URI : /rooms?link={방링크 string}")
public ResponseEntity<ResponseData<RoomDto.Response>> findRoomByLink(@RequestParam(value = "link", required = true) String link) {
RoomDto.Response roomResponseDto = roomService.findRoomByLink(link);
return ResponseData.toResponseEntity(ResponseCode.READ_ROOM, roomResponseDto);
}

@PutMapping("/rooms/{roomId}")
@Operation(summary = "입장 Page - 방 입장 대기열 나가기 [JWT O]")
public ResponseEntity<ResponseData> userStopWaitRoom(@PathVariable(value = "roomId") Long roomId) {
userRoomService.userStopWaitRoom(roomId);
return ResponseData.toResponseEntity(ResponseCode.UPDATE_ROOM);
}

@GetMapping("/rooms/{roomId}")
@Operation(summary = "문제풀이 Page - 문제풀이 페이지 정보 조회 [JWT O]")
public ResponseEntity<ResponseData<UserRoomDto.SolvePageResponse>> loadSolvingPage(@PathVariable(value = "roomId") Long roomId) { // value=""를 작성해주어야만, Swagger에서 api테스트할때 이름값이 뜸.
UserRoomDto.SolvePageResponse solvePageResponseDto = userRoomService.loadSolvingPage(roomId);
public ResponseEntity<ResponseData<UserRoomDto.SolvePageResponse>> loadSolvePage(@PathVariable(value = "roomId") Long roomId) { // value=""를 작성해주어야만, Swagger에서 api테스트할때 이름값이 뜸.
UserRoomDto.SolvePageResponse solvePageResponseDto = userRoomService.loadSolvePage(roomId);
return ResponseData.toResponseEntity(ResponseCode.READ_USERROOM, solvePageResponseDto);
}

@GetMapping("/rooms/{roomId}/access-check")
@Operation(summary = "문제풀이 Page - 문제풀이 페이지 접근허용 검사 [JWT O]", description = "isLeave == 0 or 1 or null")
public ResponseEntity<ResponseData<UserRoomDto.CheckAccessResponse>> checkAccess(@PathVariable(value = "roomId") Long roomId) {
UserRoomDto.CheckAccessResponse checkAccessResponseDto = userRoomService.checkAccess(roomId);
return ResponseData.toResponseEntity(ResponseCode.READ_USERROOM, checkAccessResponseDto);
@PostMapping("/rooms/{roomId}") // 의미상 PUT보단 POST가 더 적합하다고 판단했음.
@Operation(summary = "문제풀이 Page - 문제풀이 성공 및 실패/퇴장 [JWT O]", description = "isRetry==0 : 첫풀이 경우 / isRetry==1 : 재풀이 경우")
public ResponseEntity<ResponseData> solveProblem(
@PathVariable(value = "roomId") Long roomId,
@RequestBody UserRoomDto.SolveRequest solveRequest) {

userRoomService.solveProblem(roomId, solveRequest);
return ResponseData.toResponseEntity(ResponseCode.UPDATE_USERROOM); // 비록 POST이지만, 비즈니스 로직은 update임.
}

@GetMapping("/rooms/{roomId}/state-check")
Expand All @@ -64,21 +74,11 @@ public ResponseEntity<ResponseData<RoomDto.CheckStateResponse>> checkState(@Path
return ResponseData.toResponseEntity(ResponseCode.READ_USERROOM, checkStateResponseDto);
}

@PostMapping("/rooms/{roomId}") // 의미상 PUT보단 POST가 더 적합하다고 판단했음.
@Operation(summary = "문제풀이 Page - 문제풀이 성공 및 실패/퇴장 [JWT O]", description = "isRetry==0 : 첫풀이 경우 / isRetry==1 : 재풀이 경우")
public ResponseEntity<ResponseData> passSolvingProblem(
@PathVariable(value = "roomId") Long roomId,
@RequestBody UserRoomDto.SolveRequest solveRequest) {

userRoomService.passSolvingProblem(roomId, solveRequest);
return ResponseData.toResponseEntity(ResponseCode.UPDATE_USERROOM); // 비록 POST이지만, 비즈니스 로직은 update임.
}

@PutMapping("/rooms/{roomId}")
@Operation(summary = "입장 Page - 방 입장 대기열 나가기 [JWT O]")
public ResponseEntity<ResponseData> userStopWaitRoom(@PathVariable(value = "roomId") Long roomId) {
userRoomService.userStopWaitRoom(roomId);
return ResponseData.toResponseEntity(ResponseCode.UPDATE_ROOM);
@GetMapping("/rooms/{roomId}/access-check")
@Operation(summary = "문제풀이 Page - 문제풀이 페이지 접근허용 검사 [JWT O]", description = "isLeave == 0 or 1 or null")
public ResponseEntity<ResponseData<UserRoomDto.CheckAccessResponse>> checkAccess(@PathVariable(value = "roomId") Long roomId) {
UserRoomDto.CheckAccessResponse checkAccessResponseDto = userRoomService.checkAccess(roomId);
return ResponseData.toResponseEntity(ResponseCode.READ_USERROOM, checkAccessResponseDto);
}

@MessageMapping("wait.enter") // 웹소켓 메시지 처리 (백엔드로 '/pub/wait.enter'를 호출시 이 브로커에서 처리)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
public class TestController {

@GetMapping("/health")
@Operation(summary = "서버 헬스체크 [JWT X]")
@Operation(summary = "AWS - 서버 헬스체크 [JWT X]")
public ResponseEntity<ResponseData> healthCheck() {
return ResponseData.toResponseEntity(ResponseCode.HEALTHY_SUCCESS);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ public ResponseEntity<ResponseData> updateUserProfile(
return ResponseData.toResponseEntity(ResponseCode.UPDATE_USER);
}

@GetMapping("/users/solved-count")
@Operation(summary = "문제풀이 Page - 사용자 백준 solvedCount값 조회 [JWT O]")
public ResponseEntity<ResponseData<UserDto.SolvedCountResponse>> findUserSolvedCount() {
UserDto.SolvedCountResponse solvedCountResponseDto = userService.findUserSolvedCount();
return ResponseData.toResponseEntity(ResponseCode.READ_SOLVEDCOUNT, solvedCountResponseDto);
}

@GetMapping("/users/rooms")
@Operation(summary = "내 코드 Page - 코드방 목록 조회/정렬/검색 [JWT O]",
description = """
Expand All @@ -69,15 +76,8 @@ public ResponseEntity<ResponseData<Page<UserRoomDto.CodePageResponse>>> findCode

@GetMapping("/users/rooms-check")
@Operation(summary = "메인 Page - 참여중인 방 여부 검사 [JWT O]", description = "roomId == Long or null")
public ResponseEntity<ResponseData<UserDto.CheckRoomResponse>> checkCurrentRoom() {
UserDto.CheckRoomResponse checkRoomResponseDto = userService.checkCurrentRoom();
public ResponseEntity<ResponseData<UserDto.CheckRoomResponse>> checkRoom() {
UserDto.CheckRoomResponse checkRoomResponseDto = userService.checkRoom();
return ResponseData.toResponseEntity(ResponseCode.READ_ROOM, checkRoomResponseDto);
}

@GetMapping("/users/solved-count")
@Operation(summary = "사용자 백준 solvedCount값 조회 [JWT O]")
public ResponseEntity<ResponseData<UserDto.SolvedCountResponse>> checkUserSolvedCount() {
UserDto.SolvedCountResponse solvedCountResponseDto = userService.checkUserSolvedCount();
return ResponseData.toResponseEntity(ResponseCode.READ_SOLVEDCOUNT, solvedCountResponseDto);
}
}
30 changes: 15 additions & 15 deletions src/main/java/com/sajang/devracebackend/dto/AuthDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ public class AuthDto {

@Getter
@NoArgsConstructor
public static class ReissueRequest {
public static class SignupRequest {

private String accessToken;
private String refreshToken;
private String nickname;
private String bojId;
private Integer isImageChange;
}

@Getter
@NoArgsConstructor
public static class SignupRequest {
public static class ReissueRequest {

private String nickname;
private String bojId;
private Integer isImageChange;
private String accessToken;
private String refreshToken;
}


Expand All @@ -33,21 +33,21 @@ public static class SignupRequest {
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class TokenResponse {
public static class SignupResponse {

private String grantType;
private String accessToken;
private Long accessTokenExpiresIn;
private String refreshToken;
private UserDto.Response userResponseDto;
private AuthDto.TokenResponse tokenResponseDto;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class SignupResponse {
public static class TokenResponse {

private UserDto.Response userResponseDto;
private AuthDto.TokenResponse tokenResponseDto;
private String grantType;
private String accessToken;
private Long accessTokenExpiresIn;
private String refreshToken;
}
}
2 changes: 0 additions & 2 deletions src/main/java/com/sajang/devracebackend/dto/UserRoomDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import com.sajang.devracebackend.domain.enums.Language;
import com.sajang.devracebackend.domain.enums.RoomState;
import com.sajang.devracebackend.domain.mapping.UserRoom;
import com.sajang.devracebackend.dto.ProblemDto;
import com.sajang.devracebackend.dto.UserDto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ public interface UserRepository extends JpaRepository<User, Long> {
// ===================== //

Optional<User> findBySocialTypeAndSocialId(SocialType socialType, String socialId); // '소셜 타입, 식별자'로 해당 회원을 찾기 위한 메소드 (차후 추가정보 입력 회원가입 가능)
boolean existsByBojId(String bojId);
List<User> findByIdIn(List<Long> userIdList);
boolean existsByBojId(String bojId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@

public interface AuthService {
AuthDto.SignupResponse signup(MultipartFile imageFile, AuthDto.SignupRequest SignupRequestDto) throws IOException;
AuthDto.TokenResponse reissue(AuthDto.ReissueRequest reissueRequestDto);
void withdrawal();
AuthDto.TokenResponse reissue(AuthDto.ReissueRequest reissueRequestDto);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
import org.springframework.data.domain.Slice;

public interface ChatService {
ChatDto.Response createChat(ChatDto.SaveRequest saveRequestDto);
Slice<ChatDto.Response> findChatsByRoom(Long roomId, Pageable pageable);
ChatDto.Response createChat(ChatDto.SaveRequest saveRequestDto);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
public interface UserRoomService {
UserRoom findUserRoomWithEagerRoom(Long userId, Long roomId, boolean isIncludeUserRoomList, boolean isIncludeProblem);
RoomDto.WaitResponse userWaitRoom(RoomDto.WaitRequest waitRequestDto);
void usersEnterRoom(Long roomId);
void userStopWaitRoom(Long roomId);
UserRoomDto.SolvePageResponse loadSolvingPage(Long roomId);
UserRoomDto.CheckAccessResponse checkAccess(Long roomId);
void passSolvingProblem(Long roomId, UserRoomDto.SolveRequest solveRequest);
void usersEnterRoom(Long roomId);
void solveProblem(Long roomId, UserRoomDto.SolveRequest solveRequest);
UserRoomDto.SolvePageResponse loadSolvePage(Long roomId);
Page<UserRoomDto.CodePageResponse> findCodeRooms(Integer isPass, Integer number, Pageable pageable);
UserRoomDto.CheckAccessResponse checkAccess(Long roomId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public interface UserService {
<T> List<T> findUsersOriginal(List<Long> userIdList, boolean isDto);
UserDto.Response findUserProfile();
void updateUserProfile(MultipartFile imageFile, UserDto.UpdateRequest updateRequestDto) throws IOException;
UserDto.SolvedCountResponse checkUserSolvedCount();
UserDto.CheckRoomResponse checkCurrentRoom();
UserDto.SolvedCountResponse findUserSolvedCount();
UserDto.CheckRoomResponse checkRoom();
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.sajang.devracebackend.dto.UserDto;
import com.sajang.devracebackend.repository.UserRepository;
import com.sajang.devracebackend.repository.UserRoomBatchRepository;
import com.sajang.devracebackend.repository.UserRoomRepository;
import com.sajang.devracebackend.response.exception.Exception400;
import com.sajang.devracebackend.security.jwt.TokenProvider;
import com.sajang.devracebackend.service.AuthService;
Expand All @@ -30,7 +29,6 @@ public class AuthServiceImpl implements AuthService {
private final AwsS3Service awsS3Service;
private final UserService userService;
private final UserRepository userRepository;
private final UserRoomRepository userRoomRepository;
private final UserRoomBatchRepository userRoomBatchRepository;
private final TokenProvider tokenProvider;

Expand Down Expand Up @@ -86,6 +84,23 @@ else if(imageFile == null && signupRequestDto.getIsImageChange() == 1) { // 기
return signupResponseDto;
}

@Transactional
@Override
public void withdrawal() {
User user = userService.findLoginUser();
List<UserRoom> userRoomList = user.getUserRoomList();

// 자식 UserRoom 삭제 - hard delete
// userRoomRepository.deleteAll(userRoomList); // JPA의 deleteAll()은 SQL 쿼리가 UserRoom 개수만큼 날아가는 문제가 있음.
// userRoomRepository.deleteAllInBatch(userRoomList); // JPA의 deleteAllInBatch()은 10000개 이상의 데이터 처리시 stackoverflow 에러가 발생함.
userRoomBatchRepository.batchDelete(userRoomList); // JDBC의 batch delete를 활용하여, 대용량 Batch 삭제 처리가 가능함. -> DB 여러번 접근 방지 & 성능 향상

// 부모 User 삭제 - soft delete
user.deleteAccount();
awsS3Service.deleteImage(user.getImageUrl()); // 이전의 사진은 AWS S3에서 삭제.
user.updateImage(null); // 탈퇴했기에 기본사진임을 명시하고자 null값으로 imageUrl 업데이트.
}

@Transactional
@Override
public AuthDto.TokenResponse reissue(AuthDto.ReissueRequest reissueRequestDto) { // Refresh Token으로 Access Token 재발급 메소드
Expand Down Expand Up @@ -115,21 +130,4 @@ public AuthDto.TokenResponse reissue(AuthDto.ReissueRequest reissueRequestDto) {
AuthDto.TokenResponse tokenResponseDto = tokenProvider.generateAccessTokenByRefreshToken(userId, role, refreshToken);
return tokenResponseDto;
}

@Transactional
@Override
public void withdrawal() {
User user = userService.findLoginUser();
List<UserRoom> userRoomList = user.getUserRoomList();

// 자식 UserRoom 삭제 - hard delete
// userRoomRepository.deleteAll(userRoomList); // JPA의 deleteAll()은 SQL 쿼리가 UserRoom 개수만큼 날아가는 문제가 있음.
// userRoomRepository.deleteAllInBatch(userRoomList); // JPA의 deleteAllInBatch()은 10000개 이상의 데이터 처리시 stackoverflow 에러가 발생함.
userRoomBatchRepository.batchDelete(userRoomList); // JDBC의 batch delete를 활용하여, 대용량 Batch 삭제 처리가 가능함. -> DB 여러번 접근 방지 & 성능 향상

// 부모 User 삭제 - soft delete
user.deleteAccount();
awsS3Service.deleteImage(user.getImageUrl()); // 이전의 사진은 AWS S3에서 삭제.
user.updateImage(null); // 탈퇴했기에 기본사진임을 명시하고자 null값으로 imageUrl 업데이트.
}
}
Loading

0 comments on commit 4d86dab

Please sign in to comment.