![[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요청
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F20e4de7d-eb8f-4723-b836-929297cd176d%252Fimage.png%3Ftable%3Dblock%26id%3D47778cd8-3427-4e9e-ba7d-afaabef2d3eb%26cache%3Dv2&w=2048&q=75)
일단 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'
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F789eb1af-dbf0-4218-a0e2-d54d53406ef3%252Fimage.png%3Ftable%3Dblock%26id%3D28f87c51-2d4b-4a56-9783-95a38537b2a5%26cache%3Dv2&w=1080&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F60e8bcd9-4cd0-4b59-8b53-11a5587814c0%252Fimage.png%3Ftable%3Dblock%26id%3D55e68318-e467-49b2-b914-2bfeea569c17%26cache%3Dv2&w=1920&q=75)
ajax 날아와서 keyup 이벤트 적용되는 것 확인
ajax에서 넘기는 매개변수와 컨트롤러에서 받는 매개 변수의 이름이 동일하니
@RequestParam("username") 생략 가능!
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F51e2e2d6-6762-41be-a0b1-bcd435e5d0c0%252Fimage.png%3Ftable%3Dblock%26id%3D91984a11-980b-4397-86b8-4e0d96297059%26cache%3Dv2&w=640&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F0cd9d671-6246-4c43-8dae-6744f8100c91%252Fimage.png%3Ftable%3Dblock%26id%3De6814858-5d18-4d40-98c1-3ec307c7cc5a%26cache%3Dv2&w=1920&q=75)
empty는 empty
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F5b6a1218-e234-43a3-a081-7e521b929846%252FUntitled.png%3Ftable%3Dblock%26id%3D6b9ccac3-3e6a-47ef-ae53-b2dca79d5bb9%26cache%3Dv2&w=2048&q=75)
입력하는 값 중 정보가 있으면 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 반환 }
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252Fa2925c49-687e-4ebe-82b3-ae65f217db6a%252FUntitled.png%3Ftable%3Dblock%26id%3D673dbc64-a7a9-4bb6-a050-a9a9898d4a4f%26cache%3Dv2&w=750&q=75)
결과값이 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 값에 이 결과 값을 넣어서 전송함
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252Fa13c8065-0e63-4583-8f97-c0207046389d%252Fimage.png%3Ftable%3Dblock%26id%3D370dbe80-7907-4df1-993b-9090caa92185%26cache%3Dv2&w=1920&q=75)
4. 결과 값을 볼 때 제일 좋은 방법은 JSON - done의 res 찍어보기
console.log("Res " + res); 라고만 하니까 문자열로만 나온다. 내가 원하는 값을 보려면 JSON으로 변환해서 봐야함
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252Fee31a506-884b-4b83-8b20-bc78bd85a641%252FUntitled.png%3Ftable%3Dblock%26id%3Dbc194288-d235-4427-b6dc-9e7f46246150%26cache%3Dv2&w=640&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F620d54f7-9b56-4940-8546-83397b0b25c6%252Fimage.png%3Ftable%3Dblock%26id%3D73fa02a8-6de1-4e49-b4d7-422a64808559%26cache%3Dv2&w=2048&q=75)
}).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. 화면
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F3203937c-e5bd-45e4-b749-d1e9b2141c64%252Fimage.png%3Ftable%3Dblock%26id%3Dd54952c5-cebc-4354-958f-897440baed3a%26cache%3Dv2&w=1080&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fa21638a1-cc1f-4c5f-be54-d65c3bb6a357%252F285df210-32c8-4812-9896-bf2bf7ae296e%252Fimage.png%3Ftable%3Dblock%26id%3Dc841b115-2333-4480-a632-6a7b3f477557%26cache%3Dv2&w=1080&q=75)
Share article