어제 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 |