ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.