From e08545e106d6f13cf7c824dd13b563901bbbafca Mon Sep 17 00:00:00 2001 From: taehyun Date: Sat, 31 May 2025 13:15:33 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[feat]=20=EC=86=8C=EC=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=8B=89=EB=84=A4=EC=9E=84=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=83=9D=EC=84=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/controller/UsersApiController.java | 2 - .../users/controller/UsersController.java | 6 -- .../io/github/petty/users/entity/Users.java | 5 +- .../users/oauth2/CustomOAuth2UserService.java | 19 +++--- .../users/repository/UsersRepository.java | 2 + .../users/util/DisplayNameGenerator.java | 62 +++++++++++++++++++ 6 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 src/main/java/io/github/petty/users/util/DisplayNameGenerator.java diff --git a/src/main/java/io/github/petty/users/controller/UsersApiController.java b/src/main/java/io/github/petty/users/controller/UsersApiController.java index ab736ed..1f0b3ab 100644 --- a/src/main/java/io/github/petty/users/controller/UsersApiController.java +++ b/src/main/java/io/github/petty/users/controller/UsersApiController.java @@ -7,8 +7,6 @@ import io.github.petty.users.service.EmailService; import io.github.petty.users.service.RefreshTokenService; import io.github.petty.users.util.CookieUtils; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/io/github/petty/users/controller/UsersController.java b/src/main/java/io/github/petty/users/controller/UsersController.java index da1c881..deebcdd 100644 --- a/src/main/java/io/github/petty/users/controller/UsersController.java +++ b/src/main/java/io/github/petty/users/controller/UsersController.java @@ -1,14 +1,9 @@ package io.github.petty.users.controller; -import io.github.petty.users.dto.CustomUserDetails; import io.github.petty.users.dto.JoinDTO; import io.github.petty.users.dto.UserProfileEditDTO; -import io.github.petty.users.entity.Users; import io.github.petty.users.service.JoinService; import io.github.petty.users.service.UserService; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; @@ -16,7 +11,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.security.core.Authentication; diff --git a/src/main/java/io/github/petty/users/entity/Users.java b/src/main/java/io/github/petty/users/entity/Users.java index d08081d..11dc1fb 100644 --- a/src/main/java/io/github/petty/users/entity/Users.java +++ b/src/main/java/io/github/petty/users/entity/Users.java @@ -25,7 +25,10 @@ public class Users { private String password; @Column(nullable = false, length = 50) - private String displayName; + private String name; + + @Column(nullable = false, length = 50, unique = true) + private String displayName; // 닉네임 (자동 생성) @Column(length = 20) private String phone; diff --git a/src/main/java/io/github/petty/users/oauth2/CustomOAuth2UserService.java b/src/main/java/io/github/petty/users/oauth2/CustomOAuth2UserService.java index 4c70e30..36e0202 100644 --- a/src/main/java/io/github/petty/users/oauth2/CustomOAuth2UserService.java +++ b/src/main/java/io/github/petty/users/oauth2/CustomOAuth2UserService.java @@ -3,6 +3,7 @@ import io.github.petty.users.Role; import io.github.petty.users.entity.Users; import io.github.petty.users.repository.UsersRepository; +import io.github.petty.users.util.DisplayNameGenerator; import lombok.RequiredArgsConstructor; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; @@ -21,6 +22,7 @@ public class CustomOAuth2UserService implements OAuth2UserService { private final UsersRepository usersRepository; + private final DisplayNameGenerator displayNameGenerator; @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { @@ -87,27 +89,30 @@ private Users saveOrUpdate(String email, String provider, String providerId, Map user.setPassword(UUID.randomUUID().toString()); // 임의의 패스워드 설정 user.setRole(Role.ROLE_USER.name()); - // Provider 사용자명을 displayName으로 사용 + // DisplayNameGenerator 유니크 displayName 생성 + String uniqueDisplayName = displayNameGenerator.generateUniqueDisplayName(); + user.setDisplayName(uniqueDisplayName); + + // Provider 사용자명을 name으로 사용 if ("github".equals(provider)) { if (attributes.containsKey("name") && attributes.get("name") != null) { - user.setDisplayName((String) attributes.get("name")); + user.setName((String) attributes.get("name")); } else if (attributes.containsKey("login")) { - user.setDisplayName((String) attributes.get("login")); + user.setName((String) attributes.get("login")); } else { - user.setDisplayName(email.split("@")[0]); + user.setName(email.split("@")[0]); } } else if ("kakao".equals(provider)) { Map properties = (Map) attributes.get("properties"); if (properties != null && properties.containsKey("nickname")) { - user.setDisplayName((String) properties.get("nickname")); + user.setName((String) properties.get("nickname")); } else { - user.setDisplayName(email.split("@")[0]); + user.setName(email.split("@")[0]); } } return usersRepository.save(user); } - // 기존 사용자 업데이트 로직 (필요한 경우) return user; } } \ No newline at end of file diff --git a/src/main/java/io/github/petty/users/repository/UsersRepository.java b/src/main/java/io/github/petty/users/repository/UsersRepository.java index 3161d7f..d96cb4f 100644 --- a/src/main/java/io/github/petty/users/repository/UsersRepository.java +++ b/src/main/java/io/github/petty/users/repository/UsersRepository.java @@ -9,4 +9,6 @@ public interface UsersRepository extends JpaRepository { Boolean existsByUsername(String username); Users findByUsername(String username); + + Boolean existsByDisplayName(String displayName); } diff --git a/src/main/java/io/github/petty/users/util/DisplayNameGenerator.java b/src/main/java/io/github/petty/users/util/DisplayNameGenerator.java new file mode 100644 index 0000000..1101120 --- /dev/null +++ b/src/main/java/io/github/petty/users/util/DisplayNameGenerator.java @@ -0,0 +1,62 @@ +package io.github.petty.users.util; + +import io.github.petty.users.repository.UsersRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +@RequiredArgsConstructor +public class DisplayNameGenerator { + + private final UsersRepository usersRepository; + private final Random random = new Random(); + + // 귀여운 형용사들 + private static final String[] ADJECTIVES = { + "귀여운", "활발한", "똑똑한", "용감한", "착한", "재미있는", "친근한", "사랑스러운", + "깜찍한", "멋진", "예쁜", "훌륭한", "행복한", "밝은", "따뜻한", "부드러운" + }; + + // 반려동물들 + private static final String[] ANIMALS = { + "강아지", "고양이", "햄스터", "토끼", "앵무새", "거북이", "금붕어", "페럿", + "친칠라", "기니피그", "고슴도치", "이구아나", "카나리아", "문조", "코카티엘", "잉꼬" + }; + + // 유니크 displayName 생성 + public String generateUniqueDisplayName() { + String candidate; + int attempts = 0; + final int MAX_ATTEMPTS = 50; + + do { + candidate = generateCuteDisplayName(); + attempts++; + + // 50번 실패하면 UUID 폴백 + if (attempts >= MAX_ATTEMPTS) { + candidate = generateUuidFallback(); + break; + } + } while (usersRepository.existsByDisplayName(candidate)); + + return candidate; + } + + // 형용사 + 동물 + 3자리 숫자 + private String generateCuteDisplayName() { + String adjective = ADJECTIVES[random.nextInt(ADJECTIVES.length)]; + String animal = ANIMALS[random.nextInt(ANIMALS.length)]; + String number = String.format("%03d", random.nextInt(1000)); + + return adjective + animal + number; + } + + // UUID 기반 폴백 닉네임 (만약의 경우) + private String generateUuidFallback() { + String uuid = java.util.UUID.randomUUID().toString().replace("-", "").substring(0, 8); + return "petty_" + uuid; + } +} \ No newline at end of file From 85e5dd95bacea904d885ca8e9dd0b19c12a399d5 Mon Sep 17 00:00:00 2001 From: taehyun Date: Sat, 31 May 2025 13:27:54 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[feat]=20=EB=A1=9C=EC=BB=AC=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=8B=89=EB=84=A4=EC=9E=84=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=83=9D=EC=84=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/github/petty/users/dto/JoinDTO.java | 3 +-- .../io/github/petty/users/service/JoinService.java | 10 ++++++++-- src/main/resources/templates/join.html | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/github/petty/users/dto/JoinDTO.java b/src/main/java/io/github/petty/users/dto/JoinDTO.java index 4d2e302..4aed125 100644 --- a/src/main/java/io/github/petty/users/dto/JoinDTO.java +++ b/src/main/java/io/github/petty/users/dto/JoinDTO.java @@ -10,7 +10,6 @@ public class JoinDTO { private String username; private String password; - private String displayName; + private String name; private String phone; - } diff --git a/src/main/java/io/github/petty/users/service/JoinService.java b/src/main/java/io/github/petty/users/service/JoinService.java index 95dde10..bc45677 100644 --- a/src/main/java/io/github/petty/users/service/JoinService.java +++ b/src/main/java/io/github/petty/users/service/JoinService.java @@ -4,6 +4,7 @@ import io.github.petty.users.dto.JoinDTO; import io.github.petty.users.entity.Users; import io.github.petty.users.repository.UsersRepository; +import io.github.petty.users.util.DisplayNameGenerator; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -14,11 +15,12 @@ public class JoinService { private final UsersRepository userRepository; private final BCryptPasswordEncoder bCryptPasswordEncoder; + private final DisplayNameGenerator displayNameGenerator; public boolean joinProcess(JoinDTO joinDTO) { String username = joinDTO.getUsername(); String password = joinDTO.getPassword(); - String displayName = joinDTO.getDisplayName(); + String name = joinDTO.getName(); String phone = joinDTO.getPhone(); String encodedPassword = bCryptPasswordEncoder.encode(password); @@ -30,10 +32,14 @@ public boolean joinProcess(JoinDTO joinDTO) { Users users = new Users(); users.setUsername(username); users.setPassword(encodedPassword); - users.setDisplayName(displayName); + users.setName(name); users.setPhone(phone); users.setRole(Role.ROLE_USER.name()); users.setProvider("local"); + + String uniqueDisplayName = displayNameGenerator.generateUniqueDisplayName(); + users.setDisplayName(uniqueDisplayName); + userRepository.save(users); return true; diff --git a/src/main/resources/templates/join.html b/src/main/resources/templates/join.html index 2c843ce..dc45e99 100644 --- a/src/main/resources/templates/join.html +++ b/src/main/resources/templates/join.html @@ -250,8 +250,8 @@

회원 정보 입력

- -
+ +
From bda6ada1326b796d228e5227cd989fce7d56305f Mon Sep 17 00:00:00 2001 From: taehyun Date: Sat, 31 May 2025 13:55:37 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[fix]=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20HTML?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../petty/users/service/EmailService.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/github/petty/users/service/EmailService.java b/src/main/java/io/github/petty/users/service/EmailService.java index f3a7a3a..ac738fd 100644 --- a/src/main/java/io/github/petty/users/service/EmailService.java +++ b/src/main/java/io/github/petty/users/service/EmailService.java @@ -11,6 +11,7 @@ import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; +import java.io.UnsupportedEncodingException; import java.time.LocalDateTime; import java.util.Random; @@ -35,7 +36,7 @@ public boolean sendVerificationCode(String email) { try { sendEmail(email, code); return true; - } catch (MessagingException e) { + } catch (MessagingException | UnsupportedEncodingException e) { log.error("이메일 전송 실패: {}", e.getMessage()); return false; } @@ -46,19 +47,19 @@ private String generateCode() { return String.format("%06d", random.nextInt(1000000)); // 000000 ~ 999999 } - private void sendEmail(String toEmail, String code) throws MessagingException { + private void sendEmail(String toEmail, String code) throws MessagingException, UnsupportedEncodingException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8"); - helper.setFrom("krpetty54@gmail.com"); // 보내는 사람 이메일 (본인의 실제 이메일 주소로 변경) + helper.setFrom("krpetty54@gmail.com", "Petty Team"); helper.setTo(toEmail); - helper.setSubject("[Petty] 이메일 인증 코드입니다."); + helper.setSubject("Petty 인증 코드"); // HTML 형식의 이메일 본문 String htmlContent = "
" + - "" + + "" + "
" + "

인증 번호

" + "
" + @@ -66,19 +67,18 @@ private void sendEmail(String toEmail, String code) throws MessagingException { "

" + code + "

" + "
" + "

" + - "Petty의 더 많은 서비스를 이용하려면 이메일 인증이 필요해요.
" + - "인증번호를 입력하고 인증을 완료해 주세요!
" + - "(스팸함에 있을 수도 있으니 한 번 확인 부탁드려요!)" + + "위 코드를 입력하여 이메일 인증을 완료해주세요.
" + + "이 코드는 5분간 유효합니다.
" + "

" + "
" + - "이 메일은 5분간 유효합니다." + + "본 메일은 발신전용입니다." + "
" + "
"; helper.setText(htmlContent, true); javaMailSender.send(mimeMessage); - log.info("이메일 ({})로 인증 코드 ({})를 성공적으로 전송했습니다.", toEmail, code); + log.info("이메일 ({})로 인증 코드를 성공적으로 전송했습니다.", toEmail); } // 인증 코드 확인 From 090d24092a1b4ff6b7f4101602022aaec3a25ac0 Mon Sep 17 00:00:00 2001 From: taehyun Date: Sat, 31 May 2025 17:55:24 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[feat]=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/controller/UsersApiController.java | 28 +- .../users/controller/UsersController.java | 41 +- .../petty/users/dto/UserProfileEditDTO.java | 3 +- .../petty/users/service/UserService.java | 44 +- .../resources/templates/profile_edit.html | 414 ++++++++++++++++-- 5 files changed, 469 insertions(+), 61 deletions(-) diff --git a/src/main/java/io/github/petty/users/controller/UsersApiController.java b/src/main/java/io/github/petty/users/controller/UsersApiController.java index 1f0b3ab..a0423a3 100644 --- a/src/main/java/io/github/petty/users/controller/UsersApiController.java +++ b/src/main/java/io/github/petty/users/controller/UsersApiController.java @@ -6,6 +6,7 @@ import io.github.petty.users.jwt.JWTUtil; import io.github.petty.users.service.EmailService; import io.github.petty.users.service.RefreshTokenService; +import io.github.petty.users.service.UserService; import io.github.petty.users.util.CookieUtils; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; @@ -24,12 +25,14 @@ public class UsersApiController { private final JWTUtil jwtUtil; + private final UserService userService; private final EmailService emailService; private final RefreshTokenService refreshTokenService; - public UsersApiController(JWTUtil jwtUtil, EmailService emailService, RefreshTokenService refreshTokenService) { + public UsersApiController(JWTUtil jwtUtil, EmailService emailService, RefreshTokenService refreshTokenService, UserService userService) { this.jwtUtil = jwtUtil; + this.userService = userService; this.emailService = emailService; this.refreshTokenService = refreshTokenService; } @@ -100,4 +103,27 @@ public ResponseEntity refreshToken( .body(Map.of("error", e.getMessage())); } } + + // 닉네임 중복 검사 API 추가 + @GetMapping("/check-displayname") + public ResponseEntity> checkDisplayName( + @RequestParam String displayName) { + + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth == null || !auth.isAuthenticated() || auth instanceof AnonymousAuthenticationToken) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + + // 현재 사용자 ID 가져오기 + UUID currentUserId = userService.getCurrentUserId(auth.getPrincipal()); + + // 한 번의 서비스 호출로 모든 정보 가져오기 + Map result = userService.checkDisplayName(currentUserId, displayName); + + Map response = new HashMap<>(); + response.put("available", result.get("available")); + response.put("message", result.get("message")); + + return ResponseEntity.ok(response); + } } \ No newline at end of file diff --git a/src/main/java/io/github/petty/users/controller/UsersController.java b/src/main/java/io/github/petty/users/controller/UsersController.java index deebcdd..4ce08c7 100644 --- a/src/main/java/io/github/petty/users/controller/UsersController.java +++ b/src/main/java/io/github/petty/users/controller/UsersController.java @@ -57,7 +57,7 @@ public String loginForm() { } @GetMapping("/profile/edit") - public String editProfileForm(Model model) { + public String editProfileForm(Model model, RedirectAttributes redirectAttributes) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated() @@ -65,13 +65,19 @@ public String editProfileForm(Model model) { return "redirect:/login"; } - Object principal = authentication.getPrincipal(); - UUID currentUserId = userService.getCurrentUserId(principal); - UserProfileEditDTO userProfile = userService.getUserById(currentUserId); + try { + // 현재 사용자 ID + UUID currentUserId = userService.getCurrentUserId(authentication.getPrincipal()); + + UserProfileEditDTO userProfile = userService.getUserById(currentUserId); - model.addAttribute("userProfile", userProfile); + model.addAttribute("userProfile", userProfile); + return "profile_edit"; - return "profile_edit"; + } catch (Exception e) { + redirectAttributes.addFlashAttribute("errorMessage", "프로필 정보를 가져오는 중 오류가 발생했습니다."); + return "redirect:/"; + } } @PostMapping("/profile/update") @@ -84,19 +90,26 @@ public String updateProfile(@ModelAttribute UserProfileEditDTO userProfileEditDT return "redirect:/login"; } - Object principal = authentication.getPrincipal(); - UUID currentUserId = userService.getCurrentUserId(principal); - try { - // 사용자 정보 수정 + // 현재 사용자 ID + UUID currentUserId = userService.getCurrentUserId(authentication.getPrincipal()); + userService.updateUserProfile(currentUserId, userProfileEditDTO); + redirectAttributes.addFlashAttribute("successMessage", "프로필이 성공적으로 수정되었습니다."); + return "redirect:/"; + } catch (Exception e) { - redirectAttributes.addFlashAttribute("errorMessage", "프로필 수정 중 오류가 발생했습니다: " + e.getMessage()); - } + // 모든 에러를 하나로 처리 + String errorMessage = e.getMessage(); + if (errorMessage == null || errorMessage.trim().isEmpty()) { + errorMessage = "프로필 수정 중 오류가 발생했습니다."; + } - // 수정 완료 후 메인 페이지로 - return "redirect:/"; + redirectAttributes.addFlashAttribute("errorMessage", errorMessage); + redirectAttributes.addFlashAttribute("userProfile", userProfileEditDTO); // 입력값 유지 + return "redirect:/profile/edit"; + } } } diff --git a/src/main/java/io/github/petty/users/dto/UserProfileEditDTO.java b/src/main/java/io/github/petty/users/dto/UserProfileEditDTO.java index 98056a1..5eefce1 100644 --- a/src/main/java/io/github/petty/users/dto/UserProfileEditDTO.java +++ b/src/main/java/io/github/petty/users/dto/UserProfileEditDTO.java @@ -10,6 +10,7 @@ @NoArgsConstructor @AllArgsConstructor public class UserProfileEditDTO { - private String displayName; // 사용자 이름 + private String name; // 사용자 이름 + private String displayName; // 닉네임 private String phone; // 전화번호 } diff --git a/src/main/java/io/github/petty/users/service/UserService.java b/src/main/java/io/github/petty/users/service/UserService.java index 96b39d9..c929707 100644 --- a/src/main/java/io/github/petty/users/service/UserService.java +++ b/src/main/java/io/github/petty/users/service/UserService.java @@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; @Service @@ -48,16 +50,11 @@ public UUID getCurrentUserId(Object principal) { return null; } - - - - - // 사용자 정보 가져오기 public UserProfileEditDTO getUserById(UUID userId) { Users user = usersRepository.findById(userId) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); - return new UserProfileEditDTO(user.getDisplayName(), user.getPhone()); + return new UserProfileEditDTO(user.getName(), user.getDisplayName(), user.getPhone()); } @@ -66,9 +63,44 @@ public Users updateUserProfile(UUID userId, UserProfileEditDTO userProfileEditDT Users user = usersRepository.findById(userId) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + // 닉네임 중복 검사 + String newDisplayName = userProfileEditDTO.getDisplayName(); + if (!user.getDisplayName().equals(newDisplayName)) { + if (usersRepository.existsByDisplayName(newDisplayName)) { + throw new RuntimeException("이미 사용 중인 닉네임입니다."); + } + } + + user.setName(userProfileEditDTO.getName()); user.setDisplayName(userProfileEditDTO.getDisplayName()); user.setPhone(userProfileEditDTO.getPhone()); return usersRepository.save(user); } + + // 닉네임 유효성 검사 + public Map checkDisplayName(UUID currentUserId, String displayName) { + boolean isCurrentUserDisplayName = isCurrentUserDisplayName(currentUserId, displayName); + boolean isAvailable = !usersRepository.existsByDisplayName(displayName) || isCurrentUserDisplayName; + + String message; + if (isCurrentUserDisplayName) { + message = "현재 사용 중인 닉네임입니다."; + } else if (isAvailable) { + message = "사용 가능한 닉네임입니다."; + } else { + message = "이미 사용 중인 닉네임입니다."; + } + + Map result = new HashMap<>(); + result.put("available", isAvailable); + result.put("message", message); + return result; + } + + // 현재 사용자의 닉네임인지 확인 + public boolean isCurrentUserDisplayName(UUID userId, String displayName) { + Users user = usersRepository.findById(userId).orElse(null); + return user != null && displayName.equals(user.getDisplayName()); + } } diff --git a/src/main/resources/templates/profile_edit.html b/src/main/resources/templates/profile_edit.html index eb10f10..701f1f8 100644 --- a/src/main/resources/templates/profile_edit.html +++ b/src/main/resources/templates/profile_edit.html @@ -2,7 +2,7 @@ - 프로필 수정 + 프로필 수정 - Petty @@ -66,42 +147,297 @@

프로필 수정

-
+ + +
+
+ +
+ 프로필 정보를 불러오는 중... +
+ + + +
- - + + +
+ +
+ +
+ + +
+
+
+
- -
유효한 전화번호를 입력해주세요. (예: 01012345678)
+ +
- + +
+ + ← 메인으로 돌아가기
- + // 페이지 로드 시 초기 검증 수행 + if (nameInput.value.trim()) { + nameInput.dispatchEvent(new Event('input')); + } + if (displayNameInput.value.trim()) { + displayNameInput.dispatchEvent(new Event('input')); + } + if (phoneInput.value.trim()) { + phoneInput.dispatchEvent(new Event('input')); + } + + // 초기 상태 설정 + updateSubmitButton(); + } + - + \ No newline at end of file