![[Tistory] 유저네임 중복체크 (Ajax key event)](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BTistory%255D%2520%25EC%259C%25A0%25EC%25A0%2580%25EB%2584%25A4%25EC%259E%2584%2520%25EC%25A4%2591%25EB%25B3%25B5%25EC%25B2%25B4%25ED%2581%25AC%2520%28Ajax%2520key%2520event%29%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3DCoding_study&w=2048&q=75)
1. keyup 이벤트를 사용할 것 - Ajax는 Get요청

일단 keyup 이벤트 콘솔창 찍히는지만 확인 data 쓰지 말고, 쿼리 스트링으로 바로 보내기 ? +username 하기
2. Get은 쿼리스트링으로 받기 - joinForm.mustache
주의!! GET 은 객체가 아니라 쿼리스트링으로 받는다.
쿼리 다 들어와서 yml
show-sql: false
설정해놓고 값 들어오는지만 확인<!-- username 중복 체크 --> // 비밀번호 입력 필드에 keyup 이벤트 핸들러 추가 $("#username").on('keyup', function() { // 입력된 비밀번호 값을 가져와서 콘솔에 출력 console.log($(this).val()); let username = $(this).val(); //data 쓰지 말고 $.ajax({ url: '/username-check', data: {username: username}, type: 'GET
<!-- username 중복 체크 --> // 비밀번호 입력 필드에 keyup 이벤트 핸들러 추가 $("#username").on('keyup', function() { // 입력된 비밀번호 값을 가져와서 콘솔에 출력 console.log($(this).val()); let username = $(this).val(); //쿼리 스트링으로 $.ajax({ url: '/username-check?username=' + username, type: 'GET'


ajax 날아와서 keyup 이벤트 적용되는 것 확인
ajax에서 넘기는 매개변수와 컨트롤러에서 받는 매개 변수의 이름이 동일하니
@RequestParam("username") 생략 가능!


empty는 empty

입력하는 값 중 정보가 있으면 db에서 조회 된 값이 뜬다.
코드 (일단 확인용)
[ UserJPARepository ]
@Query("select u from User u where u.username = :username") Optional<User> findByUsername(@Param("username") String username);
[ UserService]
// username 중복 검색 public void usernameCheck(String username) { Optional<User> userOP = userJPARepo.findByUsername(username); System.out.println("userOP = " + userOP); }
[ UserController ]
@GetMapping("/username-check") public ResponseEntity<?> usernameCheck(String username) { System.out.println("username = " + username); userService.usernameCheck(username); return null; }
3. 유저네임 중복체크 - Enum을 사용
[ UserEnum ]
package site.metacoding.blogv3.user; public enum UserEnum { USER_EXIST, USER_NO_EXIST }
[ UserService ]
// username 중복 검색 public UserEnum usernameCheck(String username) { // 주어진 username으로 사용자 정보를 조회 Optional<User> userOP = userJPARepo.findByUsername(username); //System.out.println("username = " + username); //System.out.println("userOP = " + userOP); // UserEnum 타입의 변수를 선언 UserEnum userStatus; // 조회된 사용자 정보가 있을 경우 if (userOP.isPresent()) { userStatus = UserEnum.USER_EXIST; // 사용자 존재 상태를 설정(유저 중복) return userStatus; // 설정된 상태를 반환 } else { // 조회된 사용자 정보가 없을 경우 userStatus = UserEnum.USER_NO_EXIST; // 사용자 미존재 상태를 설정(유저 네임 사용 가능) } return userStatus; // USER_EXIST 또는 USER_NO_EXIST 반환 }

결과값이 true인지, false인지에 따라 이렇게 값이 나올 것임
[ UserController ]
서비스에서 이미 if 처리해서 값을 받아왔기 때문에, 여기는 if 처리 해 줄 필요가 없다
@GetMapping("/username-check") public ResponseEntity<?> usernameCheck(String username) { // System.out.println("username = " + username); UserEnum usernameCheck = userService.usernameCheck(username); // System.out.println("usernameCheck = " + usernameCheck); return ResponseEntity.ok(new ApiUtil<>(usernameCheck)); }
ApiUtil body 값에 이 결과 값을 넣어서 전송함

4. 결과 값을 볼 때 제일 좋은 방법은 JSON - done의 res 찍어보기
console.log("Res " + res); 라고만 하니까 문자열로만 나온다. 내가 원하는 값을 보려면 JSON으로 변환해서 봐야함


}).done((res) => { console.log("Res " + JSON.stringify(res));
5. joinForm.mustache
<!-- username 중복 체크 --> // 비밀번호 입력 필드에 keyup 이벤트 핸들러 추가 $("#username").on('keyup', function() { // 입력된 비밀번호 값을 가져와서 콘솔에 출력 console.log($(this).val()); let username = $(this).val(); $.ajax({ url: '/username-check?username=' + username, type: 'GET' }).done((res) => { console.log("Res " + JSON.stringify(res)); // 응답 구조에 따라 확인 if (username === "") { // 입력란이 빈 경우 텍스트 숨기기 $("#usernameError, #usernameSuccess").addClass("my_hidden").hide(); } else if (res.body === "USER_EXIST") { showError(); // 에러 메시지 표시 } else if (res.body === "USER_NO_EXIST") { showSuccess(); // 성공 메시지 표시 } }).fail((res) => { alert("오류가 발생했습니다. 다시 시도해 주세요."); }); });
// 에러 메시지를 표시하고 성공 메시지를 숨기는 함수 function showError() { $("#usernameError").removeClass("my_hidden").show(); $("#usernameSuccess").addClass("my_hidden").hide(); } // 성공 메시지를 표시하고 에러 메시지를 숨기는 함수 function showSuccess() { $("#usernameSuccess").removeClass("my_hidden").show(); $("#usernameError").addClass("my_hidden").hide(); }
6. 화면


Share article