[GDG] 홍대 맛집 아카이빙 프로젝트 #11 - 로그인/회원가입 마무리 (진)

2025. 7. 31. 02:28·팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트

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
'팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
  • [GDG]홍대 맛집 아카이빙 프로젝트 #13 - 투표기능
  • [GDG] 홍대 맛집 아카이빙 프로젝트 #12 - 투표기능 DB연결
  • [GDG] 개발코스 4주차 WIL
  • [GDG]홍대 맛집 아카이빙 프로젝트 #10.1 - H2 DB 강화하기
윤마치
윤마치
개발을 합니다.
  • 윤마치
    윤마치
    윤마치
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • 링크

      • 컬러잇 개발블로그
    • 공지사항

    • 인기 글

    • 태그

      144
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.5
    윤마치
    [GDG] 홍대 맛집 아카이빙 프로젝트 #11 - 로그인/회원가입 마무리 (진)
    상단으로

    티스토리툴바