Post

03 Login 수정

03 Login 수정

1. 기능요약

  • ID/PWD 로그인
  • OTP 기능
  • 일정횟수 이상 틀릴 경우 계정 Block처리
  • 회원가입 / 비밀번호찾기

2. Note

  • Intent
    • 서비스를 가장 작은 단위로 쪼개서 구성 1개의 Service에 포함시킴.
    • 컨트롤러에서는 전부 성공한다는 가정하에 로직을 구성하고, 패스워드 오류, OTP오기입 등등 케이스는 오류는 전부 Exception 처리해서 excetpionHandler에서 처리하도록 진행함.
    • 로그인 자체는 한번 구성해두면 변경할일이 거의없기 때문에 고정으로 사용하기 위한 방법으로 판단하고 진행.
  • Point
    • Service의 책임이 너무 많음
      • OTP와 검증등을 넣기 시작하면서 service가 엄청 뚱뚱해지는 상황이 발생함.
      • service를 쪼개서 AccountService, AuthenticationService, OtpService 3개로 분리.
      • 기능의 묶음단위로 서비스 구분하기.
    • Exception은 진짜 Exception만 처리
      • 모든 실패와 오류들을 Excetpion으로 처리 했더니, 실제 Exception과 default가 묶어서 보내주는거랑 구분이 안됨.
      • 컨트롤러가 뚱뚱해지는 것을 막기 위해서 Exception으로 분기를 다처리했는데 더 복잡해짐.
      • Exception은 순수하게 오류나는 것만 처리하고, 실제로 타이핑 오류등은 Exception에서 제외
    • 컨트롤러가 매우 뚱뚱함
      • 기본 로직은 유지하고 중간 서비스를 만들어서 관리하는 패턴으로 만들면 해결은 가능
      • 아직은 불필요 하다는 판단은 됨, 로그인 기능 자체는 추가로 확장될 경우의수가 매우 적음
      • 따라서 지금은 일단 진행하고, 다른 기능에서 지금처럼 순서대로 로직이 필요한 경우에는 분리 작업필요할듯.
  • Memo
    • 컨트롤러에서 기능이 굉장히 많아지면서 뭔가 서비스를 수정하면 복합적으로 건드려야하는 상황이 발생하기는 함.
      • 서비스의 각기 메소드는 영향없게 잘처리는 했으나, 원래 있어야했던 영향을 컨트롤러가 부담하게됨.
      • 지금보다 컨트롤러에 들어가던 것들을 더빼야함. => 기능의 결정을 컨트롤러가해서 간단히 서비스 수정해도 더 복잡해짐.
      • 컨트롤러가 책임이 많아진다 / 단일책임 원칙 위배 => 이해완료
    • AP가 돌아가고 무엇인가 요청과 응답이 있다면 무조건 누군가는 책임을 지게 되어있음.
      • 그렇다면 이 책임을 한곳에 몰지 않고, 레벨링을 잘해서 특정 클래스와 레벨단에서 처리하고 대응하도록 조절필요.
      • OOP는 최대한 클래스에 힘을 빼고 비슷한것을 묶는 패턴으로 작업 필요.
      • 조금 더 확장성있게 클래스를 쪼개는게 필요. 컨트롤러와 서비스로 1개씩으로만 작업할 것이 아님!
    • 일단 익숙하지 않은 패키지 구조와 설계부터 천천히 파악!.
  • Um…
    • 클래스의 책임은 어디까지 줘야할까?
    • 그럼 어디부터 어디까지 클래스를 단계와 레벨링을 해야하는걸까?

3. 개선

1. Service의 책임이 너무 많음

클래스메소드명설명반환값 / 결과
AuthenticationServicecheckAccountStatus(UserVO user)계정 상태 확인 (휴면/잠금/정상)없음 (void)
AuthenticationServiceverifyCredentials(UserVO user)ID/PWD 확인없음 (void)
AuthenticationServicecheckSecondVerification(String userNo)2차 인증 필요 여부 확인 (SKIP/OTP)String ("SKIP" / "OTP")
OtpServicesendOtp(String userNo)OTP 발송VerifyOtpVO
OtpServiceverifyOtp(String otp, VerifyOtpVO verifyOtp)입력한 OTP 검증없음 (void)
AccountServicefindId()ID 찾기없음 (void)
AccountServicefindPassword(String email)비밀번호 찾기없음 (void)
AccountServiceregisterAccount(AccountUserVO userVO)계정 등록없음 (void)

2. Exception은 진짜 Exception만 처리

  • Controller에서 결과를 확인하고 처리하도록 변경
    1
    2
    3
    4
    5
    
       LoginResultDTO result = authenticationService.checkAccountStatus(userVo);
           if(!result.isSuccess()){
               model.addAttribute("error", result.getMessage());
               return "login/login";
           }   
    
  • LoginResultDTO
    1
    2
    
     private Status status; -- enum으로 관리
     private String message; -- 메시지 표기
    
  • 뭔가 애매한듯한데 뭐가 문제인지 정의를 잘 모르겠음.(2025.11.03.)
This post is licensed under CC BY 4.0 by the author.