-
12/19스파르타코딩클럽/스프링 개인 프로젝트 - 복습 2023. 12. 19. 22:08
1일차 회원가입
닉네임, 비밀번호, 비밀번호 확인을 request에서 전달받기닉네임은 최소 3자 이상, 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성하기
-> 정규식 + validation 적용비밀번호는 최소 4자 이상이며, 닉네임과 같은 값이 포함된 경우 회원가입에 실패로 만들기
-> 정규식
-> if (requestDto.getPassword().contains(requestDto.getUsername())) {
throw new ApiException(ErrorCode.CAN_NOT_INCLUDE_USERNAME);
}
에러코드를 몇번으로 해야할지 고민되었는데
GPT가 422 로 직접 커스텀한 코드를 사용하라고 추천하여
422를 사용.비밀번호 확인은 비밀번호와 정확하게 일치하기
-> if문 검증데이터베이스에 존재하는 닉네임을 입력한 채 회원가입 버튼을 누른 경우 "중복된 닉네임입니다." 라는 에러메세지를 response에 포함하기
-> 기존에 findById 로직 사용하던것과 동일함회원 가입 버튼을 누르기 전, 같은 닉네임이 존재하는지 "확인" 버튼을 눌러 먼저 유효성 검증부터 할 수 있도록 해보기
-> 컨트롤러에서 메소드 하나 더 만들면 된다.(챌린지 과제) 데이터베이스에 비밀번호를 평문으로 저장하는 것이 아닌, 단방향 암호화 알고리즘을 이용하여 암호화 해서 저장하도록 하기
-> BCryptPasswordEncoder 사용- (챌린지 과제) 회원 가입 시, 이메일 혹은 SNS로 인증 번호를 전달 받고 5분 이내에 해당 인증 번호를 검증해야 회원 가입에 성공하도록 해보기 (redis TTL 특징을 좀 더 파악하기 위함.)
-> 굳이 redis를 쓰지않아도 이메일 인증코드 유효기간을 5분으로 설정해주면 되는데 이 부분은 좀 더 알아봐야 것 같다.
redis TTL을 써야하는 이유
1. 사용하지 않을 경우 만료 시간 5분 이후 인증코드를 제거하기 위한 스케줄링 로직을 구현해야함.
2. 인증코드를 DB에서 삭제하기 위해 계속 DB를 호출해야하므로 부하가 증가함.
-> 이러한 이유로 redis TTL을 사용하여 5분후에 자동으로 삭제되도록 하면 위의 두 문제점을 해결할 수 있음.
build.gradle에 의존성 추가 // redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' application.yml spring: redis: host: docker 컨테이너 이름 // 도커로 띄웠기 때문에 도커 컨테이너이름 적음 port: 6379 // redis 기본 포트
@Configuration public class RedisConfig { @Value("${spring.redis.host") private String host; @Value("${spring.redis.port") private int port; @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(host, port); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); // K - V 시리얼라이저 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); // Hash 시리얼라이저 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new StringRedisSerializer()); // 그외 모든 케이스 redisTemplate.setDefaultSerializer(new StringRedisSerializer()); return redisTemplate; } }
이렇게 레디스 기본 설정을 구현하고 도커를 실행
'스파르타코딩클럽 > 스프링 개인 프로젝트 - 복습' 카테고리의 다른 글
다했으면 리팩토링 이어서 해야지? (0) 2023.12.22 12/20 (0) 2023.12.20 Preview (1) 2023.12.18