회원가입 로직 구현

bigtr3·2024년 9월 3일

회원가입 로직

  1. post 요청으로 username과 password를 담아 /join 엔드포인트로 전달.
  2. JoinController에서 DTO로 전달된 username과 password를 받음
  3. JoinController에서 JoinService를 호출하여 DTO 전달
  4. JoinService에서 UserEntity 불러와 DTO를 UserEntity로 바꿔줌
  5. UserRepository에서 바꾼 내용을 DB에 저장

JoinDTO


@Setter
@Getter
public class JoinDTO {

    private String username;
    private String password;
}
  • 예전에는 web안에 controller와 dto 디렉토리를 만들었었는데, 여기선 web 없이 따로따로 생성

  • 원래 UserDTO를 만들고 그 안에 user와 관련된 DTO들을 클래스로 저장했었음 -> 이게 더 좋은 방법 같음

JoinController

@Controller
@ResponseBody
public class JoinController {
    
    private final JoinService joinService;

    public JoinController(JoinService joinService) {
        
        this.joinService = joinService;
    }

    @PostMapping("/join")
    public String joinProcess(JoinDTO joinDTO) {

        System.out.println(joinDTO.getUsername());
        joinService.joinProcess(joinDTO);

        return "ok";
    }
}
  • 어노테이션으로 Controller임을 명시
  • 이전엔 ApiReponse를 만들어서 Response 형식을 정하고 그걸 return 했었기 때문에 @RequestBody 어노테이션을 쓰지 않았음 -> 이 방법이 더 좋은듯
  • 생성자로 joinService 초기화 해줌 -> 원래 @Autowired로 했었는데, 이 방법은 권장되지 않는다고 함
  • 원래 회원가입에 실패하면 if 문을 사용하여 fail을 반환해야하는데, 이번엔 간단하게 구현하는거니까 무조건 ok return 하게 함.

JoinService

@Service
public class JoinService {

    private final UserRepository userRepository;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;

    public JoinService(UserRepository userRepository, BCryptPasswordEncoder bCryptPasswordEncoder){

        this.userRepository = userRepository;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    // 원래는 return 값이 boolean
    public void joinProcess(JoinDTO joinDTO) {
        String username = joinDTO.getUsername();
        String password = joinDTO.getPassword();

        Boolean isExist = userRepository.existsByUsername(username);

        if (isExist){
            // 사용자가 이미 등록되어 있으면 실행 안함
            return;
        }

        UserEntity data = new UserEntity();

        data.setUsername(username);
        // 암호화하여 password를 넣음
        data.setPassword(bCryptPasswordEncoder.encode(password));
        // 강제로 admin 권한을 줌
        data.setRole("ROLE_ADMIN");

        userRepository.save(data);

    }
}
  • Service 어노테이션
  • 원래는 query랑 command service를 분리하고 인터페이스도 분리했었는데, 하나로 통일. 어느 방법이 좋은진 모르겠음
  • 원래는 return 값이 boolean으로 회원가입 실패시 false여야하는데, 그냥 테스트 용이니 이렇게 함
  • joinDTO에서 username과 password를 가져옴 -> userRepository에서 이미 존재하는 사용자인지 검증 -> 존재한다면 중단, 존재하지 않는다면 회원가입 로직 진행 -> UserEntity를 새로 생성한 후 username과 암호화한 password, role을 넣음 -> userRepository에 저장
  • 암호화는 SecurityConfig의 bCryptPasswordEncoder를 통해함.
  • role은 임의로 admin, 스프링은 속성 앞에 ROLE 처럼 구분을 해줘야 함.

실행화면

  • postman에서 /join으로 username과 password 값 보냄
  • userEntity 생성된 화면
profile
스프링 공부기록🧾

0개의 댓글