/api/v5-3/membersaccount를 key로 저장)@PostMapping
public ResponseEntity<?> create(@RequestBody @Valid MemberCreateDto dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
Map<String, String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach(err -> {
errorMap.put(err.getField(), err.getDefaultMessage());
});
log.warn("회원가입 입력값 오류 발생!");
return ResponseEntity.badRequest().body(errorMap);
}
Member member = MemberCreateDto.from(dto);
memberStore.put(dto.getUserAcc(), member);
return ResponseEntity.ok("created member: " + member);
}
@GetMapping
public ResponseEntity<?> memberList() {
log.trace("memberList 메서드 호출됨");
log.info("회원 목록 요청 시작!");
List<MemberListResponse> responses = memberStore.values().stream()
.map(MemberListResponse::from)
.collect(Collectors.toList());
if (responses.isEmpty()) {
log.warn("회원 데이터 없음");
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(responses);
}
역할: 회원 가입 시 필요한 데이터 받는 전용 객체
검증 어노테이션 사용:
@Email, @NotBlank, @Pattern정적 팩토리 메서드로 Entity 변환
@Email(message = "계정명은 이메일 형식 필요")
@NotBlank(message = "계정명은 필수")
private String userAcc;
@Pattern(regexp = ..., message = "비밀번호는 특수문자, 숫자 포함 8자 이상")
private String pw;
@NotBlank(message = "닉네임은 필수")
private String nick;
public static Member from(MemberCreateDto dto) {
return Member.builder()
.account(dto.getUserAcc())
.password(dto.getPw())
.nickname(dto.getNick())
.build();
}
uid, account, password, nicknameid, email, nick, creationTimepublic static MemberListResponse from(Member member) {
return MemberListResponse.builder()
.id(member.getUid())
.email(member.getAccount())
.nick(maskingNickName(member.getNickname()))
.creationTime(LocalDate.now())
.build();
}
| 레벨 | 용도 설명 |
|---|---|
| TRACE | 흐름 추적용 (메서드 진입/종료 등) |
| DEBUG | 변수값 추적, 디버깅용 로그 |
| INFO | 운영 중 발생하는 일반 상태 정보 기록 |
| WARN | 심각하지 않지만 의심가는 상태 |
| ERROR | 치명적인 예외 상황 기록 |
@Valid + BindingResult를 활용한 입력값 검증 구현