[JPA] 온라인,오프라인,자리비움 등 상태 표시하기

김정연·2024년 2월 19일
post-thumbnail

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

실제 디스코드를 보면 나의 상태를 지정할 수 있는데, 온라인 오프라인은 구현하기 쉽지만 자리비움과 방해금지는 데이터베이스에 저장해둬야해서 생각보다 구현하는데 시간이 걸렸다. 또 entity 에서 @oneTOone으로 어노테이션을 바꿔서 듀플리케이트 오류도 만났었다.

구현 순서

  1. 로그인시 pre_state(직전상태) 가 단순 온라인 오프라인이였다면 상태는 온라인
  2. 로그인시 pre_state가 자리비움이나 방해금지라면 상태는 자리비움 or 방해금지
  3. 로그아웃시 stateId가 온라인이라면 오프라인으로 변경 후 pre_state 업데이트
  4. 만약 자리비움이나 방해금지라면 pre_state 업데이트 후 stateId는 오프라인으로 변겨 ㅇ

로그인

			// 로그인 상태로 변경
			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으로 처리했다. 드디어 회원 관련 백엔드가 끝났고 프론트는 차근차근 다른 팀원이 만들고 있다. 내일부터는 친구요청, 친구삭제, 친구차단 등을 구현할 예정이다. 실시간으로 알려주는건 어떻게 구현해야할까? 고민이다... 회원 끝!

profile
백엔드 개발자

0개의 댓글