😱 오늘은 온라인, 오프라인, 자리비움, 방해금지 등 상태변경 코드를 구현했다. 또 직전 상태를 기억하기 위해 컬럼을 하나 더 만들어서 직전상태 저장용으로 사용했다. 숫자 1234가 계속 왔다갔다 하니까 코드를 구현하면서도 너무 헷갈렸다 ㅠㅠ

실제 디스코드를 보면 나의 상태를 지정할 수 있는데, 온라인 오프라인은 구현하기 쉽지만 자리비움과 방해금지는 데이터베이스에 저장해둬야해서 생각보다 구현하는데 시간이 걸렸다. 또 entity 에서 @oneTOone으로 어노테이션을 바꿔서 듀플리케이트 오류도 만났었다.
// 로그인 상태로 변경
int number = view.get().getPreState();
State stateId = new State();
switch (number) {
case 1:
stateId.setStateId(1L);
break;
case 2:
stateId.setStateId(2L);
break;
case 3:
stateId.setStateId(3L);
break;
default:
stateId.setStateId(1L);
break;
}
userService.modifyState(stateId, view.get().getUserId());
기존 로그인 코드에 상태값만 넣는 것이라 기존코드는 생략했다.
1번 온라인 , 2번 자리비움, 3번 방해금지, 4번 오프라인 이기 때문에 preState의 값에 따라 stateId를 바꿔줘야하는데 내가 if > if > if 이렇게 이어지는 것을 싫어해 다른 방법을 생각하다가 오랜만에 switch문을 사용했다. 마침 pre_state는 기본자료형이라 사용이 가능했다 ㅎㅎ
try {
Optional<User> view = userService.findByEmail(user.getEmail());
if (view.isPresent()) {
Long userId = view.get().getUserId();
Long stateId = view.get().getStateId().getStateId();
userService.modifyPreState(userId, stateId == 1 ? 4 : (stateId == 2 ? 2 : 3));
State newState = new State();
newState.setStateId(4L);
userService.modifyState(newState, userId);
userService.removeRefreshToken(user.getEmail());
return ResponseEntity.ok("로그아웃 완료입니다.");
}
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("로그아웃 실패입니다.");
}
원래 로그아웃 코드는 RefreshToken을 삭제만 하는 코드였지만 상태를 저장해야 하므로 modifyPreState서비스를 추가했다. 여기서도 if문이 필요했지만 삼항연산으로 처리했다. 로그아웃을 작성할 때도 숫자때문에 헷갈렸지만 로깅 하나씩 찍어보며 처리했다.
@PutMapping("/user/state")
public ResponseEntity<String> changeStatus(@RequestBody ViewUser user) {
try {
userService.modifyState(user.getStateId(), user.getUserId());
return ResponseEntity.ok("상태 변경이 완료되었습니다.");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("프로필 변경에 실패했습니다.");
}
}
제일 간단한 상태변경은 putMapping으로 처리했다. 드디어 회원 관련 백엔드가 끝났고 프론트는 차근차근 다른 팀원이 만들고 있다. 내일부터는 친구요청, 친구삭제, 친구차단 등을 구현할 예정이다. 실시간으로 알려주는건 어떻게 구현해야할까? 고민이다... 회원 끝!