7월 30일에 중간발표를 했다
무슨 일이 있어도 8월 1일 전까지는 지도를 제외한 모든 기능을 개발하기로 생각했다. 늦어도 8월 2일까지는 완성하기로
우선은 회원가입 / 로그인 기능에 대한 리팩토링을 하기로 생각했다.
- 유효성검사
- 전역 exception
- DB기능 완전분리
- 코드 리팩토링
- 회원가입 때 같은 테이블에 같은 유저가 있다면 회원가입 못하게 막기 (이메일을 통해서)
- 완벽구현, 프론트엔드와 연결 직전까지 개발
대충 이정도의 기능들을 개발하는 것을 목표로 하고 진행했다.
1. 유효성검사 -> 전역Exception
스프링인액션에서 배운 유효성검사를 토대로 진행하려한다.
우선 try-catch 문을 사용하려 했는데.. Exception은 유효성검사 통과 실패 시의 에러를 잡지 못한다고 한다. 뭐 컨트롤러가 호출되기 전에 에러가 생긴다나 뭐라나...
암튼 유효성검사는 methodArgumentNotValidException가 반환되므로 그에 대한 전역Exception 처리를 해주면 된다.
다음의 포스트를 참고했습니다 -> https://curiousjinan.tistory.com/entry/spring-boot-exception-handling
Spring Boot: @ControllerAdvice/@RestControllerAdvice로 예외처리하기
@ControllerAdvice와 @RestControllerAdvice에 대해 자세히 알아보자 📌 서론 프로그래밍에서 예외 처리는 매우 중요한 부분이며, Spring Boot에서는 @ControllerAdvice와 @RestControllerAdvice를 통해 이를 효율적으로
curiousjinan.tistory.com
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ResponseDTO> methodArgumentNotValidException(MethodArgumentNotValidException ex) {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(400)
.message(ex.getBindingResult().getFieldError().getDefaultMessage())
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.BAD_REQUEST);
}
}
이렇게 핸들러를 만든다. RestControllerAdvice는 컨트롤러 클래스가 공유하는 공통적인 로직이 담긴다.
RestControllerAdvice 어노테이션과 ControllerAdvice 어노테이션이 있는데, RESTful API를 작성할 때는 RestControllerAdvice를 적용시키면 된다.
@PostMapping
public ResponseEntity<ResponseDTO> signUp(@RequestBody @Valid MemberRequestDTO memberRequestDTO) throws Exception {
return signUpService.signUp(memberRequestDTO);
}
적용시킬 컨트롤러 중 일부
package com.hongchelin.dto.Request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberRequestDTO {
String nickname;
@NotNull(message = "아이디를 입력해주세요.")
String userId;
@NotNull(message = "비밀번호를 입력해주세요")
String password;
String email;
}
적용시킬 메서드
닉네임 이메일은 회원가입 때만 쓰고, 유저아이디와 비밀번호는 회원가입과 로그인 때 모두 사용해서 NotNull 처리했다.




성공적으로 끝났다.
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ResponseEntity<ResponseDTO> httpRequestMethodNotSupportedException(
HttpRequestMethodNotSupportedException ex) {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(500)
.message(ex.getLocalizedMessage())
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.METHOD_NOT_ALLOWED);
}
@ExceptionHandler(BadSqlGrammarException.class)
public ResponseEntity<ResponseDTO> badSqlGrammarException(BadSqlGrammarException ex) {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(500)
.message(ex.getLocalizedMessage())
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.BAD_REQUEST);
}
몇 개 정도 더 추가해주고..

이제 추가해야할 사항은
- 닉네임 중복여부
- 아이디 중복여부
- 비밀번호 유효성검사 추가
- 인증번호 대조하기
1. 닉네임 / 아이디 중복여부
@Service
public class CheckNameService {
private final MemberRepository memberRepository;
public CheckNameService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public ResponseEntity<ResponseDTO> CheckName(String name) {
Member member = new Member();
member.setNickname(name);
boolean checkName = memberRepository.checkingName(member);
if (checkName) {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(200)
.message("중복되지 않습니다.")
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.OK);
} else {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(401)
.message("동일한 아이디가 이미 있습니다.")
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.UNAUTHORIZED);
}
}
}
그냥 이메일이나 비밀번호 대조와 비슷한 코드다.

성공
아이디 중복여부도 똑같은 개발이라서

금방 만들었다.
2. 비밀번호 유효성검사 추가


그냥 어노테이션 몇 줄만 추가하면 되는거라 금방 끝남
3. 인증번호 대조하기
지금은 DB에 저장하기로 했다. 레디스는 나중에 써보기로

재학생 이메일이 아닐 때

JDBC 작업이 거의 반복이기도하고 코드도 일일이 계속 짜기 귀찮기도해서 그냥 기능구현만 했다. 블로그에 적지는 못함
대충 이메일 받기 -> 인증번호 발급, DB저장 -> 입력받아 대조 -> 아닐 경우 에러, 맞을 경우 성공하고 DB에서 지운다.
이렇게 일련의 플로우는 다 세워놨고..
회원가입과 로그인 기능에서 JDBC로 DB에 접근하던 것을 JPA로 바꾸면 된다. 전역 Exception 처리도 꾸준히 해주고
내일할거
- 코어타임 (9시)
- 투표기능 개발 시작
- 금요일까지 지도api를 제외하고는 끝내기
'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
| [GDG]홍대 맛집 아카이빙 프로젝트 #13 - 투표기능 (6) | 2025.08.06 |
|---|---|
| [GDG] 홍대 맛집 아카이빙 프로젝트 #12 - 투표기능 DB연결 (2) | 2025.08.06 |
| [GDG] 개발코스 4주차 WIL (5) | 2025.07.29 |
| [GDG]홍대 맛집 아카이빙 프로젝트 #10.1 - H2 DB 강화하기 (2) | 2025.07.27 |
| [GDG]홍대 맛집 아카이빙 프로젝트 #10 - H2 DB 연결하기 (3) | 2025.07.27 |