diff --git a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java index 2eb49b5..e423bd3 100644 --- a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java +++ b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java @@ -29,8 +29,17 @@ public class UserController { private final UserServiceImpl userService; + @GetMapping("/check-username") + @Operation(summary = "아이디 중복 체크", description = "사용 가능하면 false, 이미 사용 중이면 true 반환") + public ResponseEntity> checkUsernameDuplicate( + @RequestParam String username + ) { + boolean isDuplicate = userService.checkUsernameDuplicate(username); + return ResponseEntity.ok(BaseResponse.success("아이디 중복 체크 성공", isDuplicate)); + } + @PostMapping("/signup") - @Operation(summary = "회원가입", description = "이메일과 비밀번호로 회원가입") + @Operation(summary = "회원가입", description = "아이디와 비밀번호로 회원가입") public ResponseEntity> signUp(@RequestBody @Valid SignUpRequest request) { SignUpResponse response = userService.signUp(request); return ResponseEntity.status(HttpStatus.CREATED) diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java index b393eae..e22af72 100644 --- a/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java @@ -1,15 +1,16 @@ package com.be.sportizebe.domain.user.dto.request; +import com.be.sportizebe.common.enums.SportType; import com.be.sportizebe.domain.user.entity.Gender; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; +import java.util.List; + public record SignUpRequest( - @Schema(description = "사용자 아이디(이메일 형식)", example = "user@example.com") + @Schema(description = "사용자 아이디", example = "sportize_user") @NotBlank(message = "아이디를 입력해주세요.") - @Email(message = "아이디는 이메일 형식만 지원합니다.") String username, @Schema(description = "비밀번호", example = "password123") @@ -26,6 +27,9 @@ public record SignUpRequest( @Schema(description = "전화번호", example = "010-xxxx-xxxx") @NotBlank(message = "전화번호를 입력해주세요") - String phoneNumber + String phoneNumber, + + @Schema(description = "관심 종목 목록 (선택)", example = "[\"SOCCER\", \"BASKETBALL\"]") + List interestSports ) { } \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/response/SignUpResponse.java b/src/main/java/com/be/sportizebe/domain/user/dto/response/SignUpResponse.java index 7473c87..560a0a8 100644 --- a/src/main/java/com/be/sportizebe/domain/user/dto/response/SignUpResponse.java +++ b/src/main/java/com/be/sportizebe/domain/user/dto/response/SignUpResponse.java @@ -8,7 +8,7 @@ public record SignUpResponse( @Schema(description = "사용자 식별자", example = "1") Long userId, - @Schema(description = "사용자 아이디(이메일 형식)", example = "user@example.com") + @Schema(description = "사용자 아이디", example = "sportize_user") String username, @Schema(description = "사용자 권한", example = "USER") diff --git a/src/main/java/com/be/sportizebe/domain/user/entity/User.java b/src/main/java/com/be/sportizebe/domain/user/entity/User.java index 8461eec..22364df 100644 --- a/src/main/java/com/be/sportizebe/domain/user/entity/User.java +++ b/src/main/java/com/be/sportizebe/domain/user/entity/User.java @@ -43,8 +43,12 @@ public class User extends BaseTimeEntity { @Enumerated(EnumType.STRING) private Role role; + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "user_interest_types", joinColumns = @JoinColumn(name = "user_id")) + @Column(name = "sport_type") @Enumerated(EnumType.STRING) - private List interestType; // 사용자 관심 종목 + @Builder.Default + private List interestType = new ArrayList<>(); // 사용자 관심 종목 private String profileImage; // 프로필 사진 URL diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java index 8d2267d..5eea1e0 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java @@ -25,4 +25,7 @@ public interface UserService { // 비밀번호 변경 void changePassword(Long userId, ChangePasswordRequest request); + + // 아이디 중복 체크 + boolean checkUsernameDuplicate(String username); } diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java index ed07490..ad53243 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java @@ -55,6 +55,7 @@ public SignUpResponse signUp(SignUpRequest request) { .phoneNumber(request.phoneNumber()) .gender(request.gender()) .role(Role.USER) + .interestType(request.interestSports() != null ? request.interestSports() : new java.util.ArrayList<>()) .build(); User savedUser = userRepository.save(user); @@ -121,6 +122,11 @@ public UserInfoResponse getUserInfo(Long userId) { return UserInfoResponse.from(userAuthInfo); } + @Override + public boolean checkUsernameDuplicate(String username) { + return userRepository.existsByUsername(username); + } + @Override @Transactional public void changePassword(Long userId, ChangePasswordRequest request) {