숙박 예약 프로젝트 - 3. 회원

소금·2025년 5월 8일
0

우선 사이트의 가장 기본이 되는 기능인 회원 기능을 만들어보려고 한다
내가 생각한 회원 관련 기능은 아래와 같다

우선 기본적인 틀만 구현해놓고 그 뒤에 자세한 기능을 추가로 구현하고자 함
1. 가입
2. 로그인
3. 정보 수정(비밀번호 변경, 비밀번호 초기화, 그외정보 수정)
4. 정보 불러오기
5. 탈퇴
그 외 부수적인 기능으로 아이디/닉네임 중복체크

1. domain

  • 첫번째로, DB와 직접적 연관이 있는 domain 부터 정의해 준다
@lombok.Getter
@lombok.Setter
public class User {
    private Long memSeqno;
    private String memberId;
    private String password;
    private String name;
    private String email;
    private String countryCode;
    private String phone;
    private int roleNo;
    private int statusNo;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

2. DTO

  • 요청(request)과 응답(response) 패키지를 분리하여 정의해 준다

2-1. request

아래 request dto는 각 api 필수값의 NotBlack 어노테이션을 포함한다

  • LoginRequest -> 로그인 요청 데이터를 담는다
  • SignupRequest -> 회원가입 요청 데이터를 담는다
  • ResetPasswordRequest -> 비밀번호 재설정 요청 데이터
  • ChangePasswordRequest -> 비밀번호 변경 요청 데이터
  • UpdateMyInfoRequest -> 사용자 정보 수정 요청 데이터
  • WithdrawRequest -> 사용자 회원 탈퇴 요청 데이터

2-2. response

  • LoginResponse -> 로그인 성공 시 응답 데이터로 반환될 데이터를 담는다
  • DuplicateCheckResponse -> 아이디/닉네임 중복 여부를 boolean으로 반환한다
  • UserInfoResponse -> 회원 정보 반환 데이터를 담는다
  • SignupResponse -> 회원가입 성공 시 응답 데이터로 반환될 데이터를 담는다
  • ResetPasswordResponse -> 비밀번호 재설정 후 반환될 데이터를 담는다
  • ChangePasswordResponse -> 비밀번호 변경 후 반환될 데이터를 담는다
  • WithdrawResponse -> 회원 탈퇴처리 후 반환될 데이터를 담는다

3. mapper

  • Mapper xml 파일의 sql문과 1:1로 매핑되는 메서드를 정의한다
@Mapper
public interface UserMapper {
    void signupUser(SignupRequest request);

    User loginUser(LoginRequest request);

    int isIdDuplicate(String memberId);

    int isNicknameDuplicate(String nickname);

    void resetPassword(ResetPasswordRequest request);

    void changePassword(ChangePasswordRequest request);

    User getUserInfo(String memberId);

    User updateUserInfo(String memberId, UpdateMyInfoRequest request);

    void withdrawUser(String memberId);
}

4. Service / ServiceImpl

  • Service -> 비즈니스 로직 선언 인터페이스
  • ServiceImpl -> Service 인터페이스를 실제로 구현하는 클래스

상세한 기능 구현(ServiceImpl)은 후에 포스팅하기로 하고, 우선 Service만 ..

public interface UserService {
    void sinupUser(SignupRequest request);
    
    LoginResponse loginUser(LoginRequest request);

    DuplicateCheckResponse isIdDuplicate(String memberId);

    DuplicateCheckResponse isNicknameDuplicate(String nickname);

    void resetPassword(ResetPasswordRequest request);

    void changePassword(ChangePasswordRequest request);

    UserInfoResponse getUserInfo(String memberId);

    UserInfoResponse updateUserInfo(String memberId, UpdateMyInfoRequest request);

    void withdrawUser(String memberId);
}

5. Controller

상단에 정의해놓은 기능들을 우선 형태만 구현해놓는다

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
    @Autowired
    private final UserServiceImpl uSer;

    @PostMapping("")
    public CommonResponse<Void> signup(@RequestBody SignupRequest request) {
        uSer.sinupUser(request);
        return CommonResponse.success();
    }

    @PostMapping("/login")
    public CommonResponse<LoginResponse> login(@RequestBody LoginRequest request) {
        uSer.loginUser(request);
        return CommonResponse.success(uSer.loginUser(request));
    }

    @PostMapping("/check-id")
    public CommonResponse<DuplicateCheckResponse> checkIdCuplicate(@RequestParam String memberId) {
        return CommonResponse.success(uSer.isIdDuplicate(memberId));
    }

    @PostMapping("/check-nickname")
    public CommonResponse<DuplicateCheckResponse> checkNicknameDuplicate(@RequestParam String nickname) {
        return CommonResponse.success(uSer.isNicknameDuplicate(nickname));
    }
    
    @PostMapping("/reset-password")
    public CommonResponse<Void> resetPassword(@RequestBody ResetPasswordRequest request) {
        uSer.resetPassword(request);
        return CommonResponse.success();
    }

    @PostMapping("/password")
    public CommonResponse<Void> changePassword(@RequestBody ChangePasswordRequest request) {
        uSer.changePassword(request);
        return CommonResponse.success();
    }

    @PostMapping("/me")
    public CommonResponse<UserInfoResponse> getMyInfo(@PathVariable String memberId) {
        return CommonResponse.success(uSer.getUserInfo(memberId));
    }

    @PutMapping("/me")
    public CommonResponse<UserInfoResponse> updateMyInfo(@PathVariable String memberId,
                                                         @RequestBody UpdateMyInfoRequest request) {
        return CommonResponse.success(uSer.updateUserInfo(memberId, request));
    }

    @DeleteMapping("/me")
    public CommonResponse<Void> withdraw(@PathVariable String memberId) {
        uSer.withdrawUser(memberId);
        return CommonResponse.success();
    }
}

다음 포스팅부터 각 기능별 상세 구현을 진행할 예정...

0개의 댓글