- [ ] 닉네임, 비밀번호, 비밀번호 확인을 request에서 전달받기
- [ ] 닉네임은 최소 3자 이상, 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성하기
- [ ] 비밀번호는 최소 4자 이상이며, 닉네임과 같은 값이 포함된 경우 회원가입에 실패로 만들기
- [ ] 비밀번호 확인은 비밀번호와 정확하게 일치하기
- [ ] 데이터베이스에 존재하는 닉네임을 입력한 채 회원가입 버튼을 누른 경우 "중복된 닉네임입니다." 라는 에러메세지를 response에 포함하기
UserController
import com.example.amazing.common.CommonCode;
import com.example.amazing.request.SignupRequestDTO;
import com.example.amazing.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping("/api")
public class UserController {
private final UserService userService;
@PostMapping("/user/signup")
public ResponseEntity<String> signup(@Validated @RequestBody SignupRequestDTO signupRequestDTO) {
// 메서드 시그니처는 괜찮아 보입니다. 유효성 검사된 요청 본문을 받아와서 문자열을 포함한 ResponseEntity를 반환합니다.
userService.signup(signupRequestDTO); // userService의 signup 메서드를 호출합니다.
return ResponseEntity.ok(CommonCode.OK.getMessage()); // CommonCode에서 가져온 메시지와 함께 OK 상태를 가진 ResponseEntity를 반환합니다.
}
}
user(entity)
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 사용자의 고유 식별자
@Column(nullable = false, unique = true)
private String username; // 사용자의 로그인 아이디, 중복 불가
@Column(nullable = false)
private String password; // 사용자의 암호
// 생성자: 사용자의 로그인 아이디와 암호를 받아 새로운 사용자 객체를 생성합니다.
public User(String username, String password) {
this.password = password;
this.username = username;
}
}
UserRepository
import com.example.amazing.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
// 사용자의 로그인 아이디를 기반으로 사용자를 찾습니다.
// 만약 사용자가 존재하면 해당 사용자를 감싼 Optional 객체를 반환합니다.
Optional<User> findByUsername(String username);
}
SignupRequestDTO
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
@Getter
public class SignupRequestDTO {
@NotBlank(message = "아이디는 필수 입력 값입니다.")
@Pattern(regexp = "^[a-zA-Z0-9]{3,}$", message = "닉네임은 최소 3자 이상, 알파벳 대소문자와 숫자로만 구성되어야 합니다.")
private String username; // 사용자의 아이디 또는 닉네임
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
@Pattern(regexp = ".{4,}", message = "비밀번호는 최소 4자 이상이어야 합니다.")
private String password; // 사용자의 비밀번호
@NotBlank(message = "비밀번호 확인은 필수 입력 값입니다.")
private String confirmPassword; // 비밀번호 확인 값
// 기본 생성자
public SignupRequestDTO() {
}
}
UserService
import com.example.amazing.userException.UserException;
import com.example.amazing.entity.User;
import com.example.amazing.repository.UserRepository;
import com.example.amazing.request.SignupRequestDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Optional;
import static com.example.amazing.userException.UserErrorCode.*;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
/**
* 사용자 등록 메서드
*
* @param signupRequestDTO 사용자 등록 요청 DTO
* @throws UserException 사용자 등록 시 발생 가능한 사용자 예외
*/
public void signup(SignupRequestDTO signupRequestDTO) {
String username = signupRequestDTO.getUsername();
String password = signupRequestDTO.getPassword();
String confirmPassword = signupRequestDTO.getConfirmPassword();
// 회원 중복 확인
Optional<User> checkUsername = userRepository.findByUsername(username);
if (checkUsername.isPresent()) {
throw new UserException(ALREADY_EXIST_USER); // 이미 존재하는 사용자인 경우 예외 발생
}
// 비밀번호 확인
if (password.contains(username)) {
throw new UserException(SET_PASSWORD); // 비밀번호에 사용자 아이디가 포함되어 있는 경우 예외 발생
} else if (confirmPassword.equals(password)) {
// 비밀번호 확인이 일치하면 새로운 사용자 등록
User user = new User(username, password);
userRepository.save(user);
} else {
throw new UserException(CHECK_SET_PASSWORD); // 비밀번호 확인이 일치하지 않는 경우 예외 발생
}
}
}
'Spring공부' 카테고리의 다른 글
@Transactional (0) | 2024.02.01 |
---|---|
DTO의 필요성 (0) | 2024.01.29 |
IoC(제어의 역전), DI(의존성 주입) (0) | 2023.12.13 |
3 Layer Architecture (0) | 2023.12.12 |
SQL (0) | 2023.12.12 |