[Spring Boot] 닉네임 중복 확인 함수

mi-fasol·2023년 8월 22일
0

이래저래 시간을 보내다 굉장히 오랜만에 글을 작성한다.

그동안 정보처리기사 필기 시험을 준비하고 토이 프로젝트를 진행하고 있었다.
필기 시험은 공부한 범위 내에서 나왔고 80점을 넘기며 넉넉하게 합격했다.

이제 실기 시험만 남았는데, 실기 시험도 열심히 공부를 해야지.

사담은 여기까지 하고 오늘은 스프링부트플러터에서 회원가입 시 닉네임을 확인하는 기능을 포스팅 할 예정이다.

현재 진행하고 있는 토이 프로젝트가 어느정도는 틀이 잡혔는데 생각보다 세세한 부분을 놓친 게 많더라.
오늘은 그 중 하나인 닉네임 중복 확인 기능이다.

우선 스프링의 코드부터 확인하겠다.

UserController.java

    @GetMapping("isExist/{nickname}")
    public ResponseEntity<Boolean> checkNickname(@PathVariable String nickname)
    {
        return ResponseEntity.ok(userService.checkNickname(nickname));
    }

굉장히 간단한 한 줄짜리 함수다.

userService에 분리해둬서 그렇다.

UserService.java

public boolean checkNickname(String nickname) {
        return userRepository.existsByNickname(nickname);
    }

사실 얘도 한 줄짜리다. ㅋㅋㅋㅋ.

뭔가 복잡한 로직이 아니라 해당 닉네임이 존재하는지 안 하는지만 확인해 주면 되기 때문이다.

그 다음은 레포지토리에도 딱 한 줄만 선언해주면 된다.

UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {
    User findByNickname(String nickname);

	// 여기!
    Boolean existsByNickname(String Nickname);
}

이렇게 작성을 마쳐주고 나면, JPA가 스스로 대문자를 필드 이름으로 인식해 매개변수로 들어온 Nickname이 테이블의 nickname 필드에 존재하고 있는지를 확인해 준다.

나는 있는지 없는지 여부만 확인하면 됐기에 Boolean으로 리턴했다.

그럼 이제 Flutter의 코드를 보자.

DBService.dart

Future<bool> checkNicknameDuplicate(String nickname) async {
    final response = await http
        .get(Uri.parse("uri"));

    if (response.statusCode == 200) {
      final data = json.decode(response.body) as bool;
      return data;
    } else {
      throw Exception('Failed to check nickname availability');
    }
  }

위와 같이 함수를 작성했다. uri 주소에 Get 형식의 요청을 보내서 돌아온 json 값을 bool 형식으로 받아 와 반환해줬다.

활용하는 코드는 아래와 같다.

UserController.dart

  Future<bool> checkNickname(String nickname) async {
    DBService db = DBService();
    bool isUsed = await db.checkNicknameDuplicate(nickname);
    if (isUsed == false) {
      return true;
    } else {
      return false;
    }
  }

Future를 활용하여 통신이 가능하게 해줬고 bool 값을 반환하여 존재하는지 안 하는지 여부를 알 수 있게 해줬다.

서버와 통신하는 함수를 분리해서 사용할 때는 꼭 async-await을 사용하는 걸 잊지 말자.

이렇게 controller에 함수를 작성해주면, 마지막으로 아래와 같이 활용해주면 된다.

나는 모든 회원 필드가 입력됐다는 가정 하에 버튼이 활성화 되도록 구현했는데,

  1. 버튼을 클릭하면 닉네임 중복을 확인하고,
    2-1. 닉네임 중복 시 다이얼로그를 띄운다.
    2-2. 닉네임이 중복되지 않을 시 모든 회원 정보를 저장한다.

대충 이런 알고리즘으로 간단하게 작성했다.

RegisterPage.dart

onPressed: () async {
          bool isAvailableNickname = await _userController
                          .checkNickname(_textController.text);
          if (isAvailableNickname) {
                 _userController.saveInfo(
                 _textController.text,
                 _selectedMajor,
                 _selectedGender,
                 userImage[_index],
                        );
          } else {
                 showNicknameUnavailable(
                       context,
                       "닉네임 사용 불가",
                       "이미 사용 중인 닉네임입니다.");
                  }
         },

이렇게 작성해주면 아래와 같이 작동이 된다.

이렇게 이미 존재하는 닉네임을 입력을 해주고, 등록을 누르면

이렇게 간단하게 다이얼로그가 생성되며 회원 저장이 되지 않는다.

어렵지 않은 기능인데도 말로 풀어서 설명하려니 글이 생각보다 길어진 느낌이다.

다음에 구현할 기능은 신고하기 기능인데, 자동으로 이메일이 전송되도록 할 예정이다.

블로그를 돌아보니 내 눈에는 잘 읽히는 코드들이 다른 사람들에게는 잘 이해되지 않을 수도 있을 거라는 게 문득 떠올랐다.
다음에는 처음 본 사람도 이해하기 쉽게 글을 작성하는 걸 우선적으로 생각해야겠다.

profile
정위블

0개의 댓글