본문 바로가기

Spring공부

회원 가입 API

  • [ ] 닉네임, 비밀번호, 비밀번호 확인을 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