[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #9 - 회원가입 기능 개발하기

2025. 7. 22. 23:04·팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트

어제 DDD 공부를 했는데 솔직히 꽤 매력적으로 보인다.. 개발 규모가 커지면 DDD가 낫다고하고..

가을쯤에 진행할 개인 프로젝트는 도메인 방식으로 하려고 하는데 이거는 그냥 기존의 방식대로 하는게 나을지도?

 

암튼 오늘할거

- 회원가입 기능 개발

- DDD 관련 책 빌려서 보기

- 스프링 인 액션 마저 보기 (근데 DDD 공부하다가 못할 수도 있음)


회원가입 기능개발

DB가 연결되지 않았으므로 DB 보내기 직전까지만 진행할 예정이다. 그렇다면 무엇이 필요할까?

우선 받아야할 정보를 리스트업하고 그 정보들의 특성에 대해 다뤄볼 예정이다..

 

네이버가 회원가입 때 받는 정보..

 

대충

 

아이디 - 중복확인하기

비밀번호 - 해싱을 통해 DB로 넘겨야함

재학생 이메일을 통한 인증 - 이건 어떻게 해야할지 모르겠네.. 

실명

 

이정도?


 

 

피그마에서 대충 UI를 짜주고

 

API 명세서도 짜주고

 

원래 순서가 반대가 되야하는데?

암튼 개발해봅시다.


스프링 인 액션 책에서는 URL 지정은 @RequestMapping으로 지정해야하는게 낫다고 한다.

즉, 저 상황에서는 한 컨트롤러에 @RequestMapping("/signup") 으로 해두고 기능에 따라 @GetMapping("/validateId") 이런 식으로 연결시켜주어야한다.

 

생각해보니 이 방식,

전에 선배들이 버스태워준 프로젝트에서 거의 리더격이었던 선배가 쓰던 방식이다.. 역시 대단해

 

package com.hongchelin.Service.signup;

import com.hongchelin.dto.user.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

@Service
public class ValidateIdService {
    public ResponseEntity<ResponseDTO> ValidateIdService(String id) {
        boolean isInDatabase = false;
        //DB확인하기
        
        
        if (isInDatabase) { //중복이 아닌 경우
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(200)
                    .message("사용가능한 이메일입니다.")
                    .build();
            
            return ResponseEntity.ok(responseDTO);
        } else { //중복인경우
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(400)
                    .message("사용 중인 이메일입니다.")
                    .build();
            
            return ResponseEntity
                    .status(HttpStatus.BAD_REQUEST)
                    .body(responseDTO);
        }
    }
}

아이디 중복확인 서비스

도메인도 한 번 짜보려고했는데 사실 간단한 DB조회 기능은 서비스에서 처리해도 된다고한다. 나중에 하는걸로~

 

package com.hongchelin.Service.signup;

import com.hongchelin.Service.Email.EmailSender;
import com.hongchelin.dto.user.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.net.URI;
import java.util.Random;

@Service
public class EmailAccessForSignUpService {
    private final EmailSender emailSender;
    public EmailAccessForSignUpService(EmailSender emailSender) {
        this.emailSender = emailSender;
    }

    public ResponseEntity<ResponseDTO> EAFSS(String email) throws Exception {
        String emailServer = email.split("@")[1];

        if (emailServer.equals("g.hongik.ac.kr")){

            Random random = new Random();
            int pwd = random.nextInt(899999) + 100000;

            String sub = "홍익대학교 재학생 이메일 로그인 인증요청입니다.";
            String text = "안녕하세요.\n저희 홍익대학교 맛집 아카이빙 프로젝트 '홍슐랭'을 이용해주셔서 감사합니다.\n\n인증번호는\n"+pwd+"\n입니다.\n\n감사합니다.";
            ResponseEntity<ResponseDTO> resultsendingEmail = emailSender.EmailSenderService(email, pwd, sub, text);
            Integer code = resultsendingEmail.getBody().getStatus();

            if (code == 200) {
                return ResponseEntity
                        .status(HttpStatus.FOUND)
                        .location(URI.create("/api/login/4/email/password"))
                        .build();

            } else {
                ResponseDTO body = resultsendingEmail.getBody();
                String message = (String) body.getMessage();

                ResponseDTO responseDTO = ResponseDTO.builder()
                        .status(500)
                        .message(message)
                        .build();

                return ResponseEntity
                        .status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .body(responseDTO);

            }
        } else {
            String message = "재학생 이메일이 아닙니다.";
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(401)
                    .message(message)
                    .build();

            return ResponseEntity
                    .status(HttpStatus.UNAUTHORIZED)
                    .body(responseDTO);
        }
    }
}

이메일 보내기

사실 이전에 만들었던거 복붙한거긴하다.

 

package com.hongchelin.Service.signup;

import com.hongchelin.dto.user.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

@Service
public class EmailCheckerService {

    public ResponseEntity<ResponseDTO> EmailCheckerService(String userPwd) {
        //Redis 에서 저장된 pwd 가져오기
        String pwd = "thehiveclusterisunderattack";

        if (userPwd.equals(pwd)) {
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(200)
                    .message("성공")
                    .build();

            return ResponseEntity.ok(responseDTO);
        } else {
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(401)
                    .message("비밀번호가 일치하지 않습니다.")
                    .build();

            return ResponseEntity
                    .status(HttpStatus.UNAUTHORIZED)
                    .body(responseDTO);
        }
    }
}

인증번호 받아서 대조하기

아직 레디스가 없어서 실제로 구현되지는 않지만 그래도 연결 직전까지는 해놨다.


테스트

1. 아이디 중복확인

 

사용 중인 이메일일 때

사용가능한 이메일일 때

프론트에서는 저 validity 값을 확인해서 구분할 수 있다.

 

2. 이메일 전송

홍익대학교 전용 이메일이 아닐 때

맞을 때

메일이 도착했다.

 

3. 비밀번호 대조

레디스가 없어서 임의로 값을 설정했다.

인증번호가 다를 때

지금보니 상태코드가 저게 맞나

인증번호가 같을 때

참고로 인증번호는 지금은 String으로 줬지만 나중에 Integer로 바꿔야함


대충 이정도하면 되려나

전체 signup 요소들을 받아서 DB에 저장하는 것은 DB설계하고부터 할 예정

 

이따가 할 거 및 내일 할 거

- 스프링 인 액션이나 DDD 관련된 책 읽기

- JPA에 대해 알아보기

- CRUD 16시간 타임어택 도전

- 코어타임!

'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글

[GDG]홍대 맛집 아카이빙 프로젝트 #10.1 - H2 DB 강화하기  (2) 2025.07.27
[GDG]홍대 맛집 아카이빙 프로젝트 #10 - H2 DB 연결하기  (3) 2025.07.27
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #8 - 투표기능 개발하기  (4) 2025.07.21
[GDG]홍대 맛집 아카이빙 프로젝트 #7 - 투표기능 기획  (2) 2025.07.20
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #6.1 - DTO 및 로그인 기능 마무리  (0) 2025.07.19
'팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
  • [GDG]홍대 맛집 아카이빙 프로젝트 #10.1 - H2 DB 강화하기
  • [GDG]홍대 맛집 아카이빙 프로젝트 #10 - H2 DB 연결하기
  • [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #8 - 투표기능 개발하기
  • [GDG]홍대 맛집 아카이빙 프로젝트 #7 - 투표기능 기획
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (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)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

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

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #9 - 회원가입 기능 개발하기
상단으로

티스토리툴바