2021.12.07_어댑터패턴02.패턴적용하기
본문 바로가기
CS Study/디자인패턴

2021.12.07_어댑터패턴02.패턴적용하기

by KyeongMin 2021. 12. 7.
728x90
반응형

소스코드

Security

LoginHandler.java

public class LoginHandler {

    UserDetailsService userDetailsService;

    public LoginHandler(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    public String login(String username, String password) {
        UserDetails userDetails = userDetailsService.loadUser(username);
        if (userDetails.getPassword().equals(password)) {
            return userDetails.getUsername();
        } else {
            throw new IllegalArgumentException();
        }
    }
}

UserDetails.java

public interface UserDetails {

    String getUsername();

    String getPassword();

}

UserDetailService.java

public interface UserDetailsService {

    UserDetails loadUser(String username);

}

이외 Security와 다른 class

Account.java

public class Account {

    private String name;

    private String password;

    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

AccountService.java

public class AccountService {

    public Account findAccountByUsername(String username) {
        Account account = new Account();
        account.setName(username);
        account.setPassword(username);
        account.setEmail(username);
        return account;
    }

    public void createNewAccount(Account account) {

    }

    public void updateAccount(Account account) {

    }
}

어댑터코드 적용

AccountUserDetailService.java

public class AccountUserDetailsService implements UserDetailsService {

    private AccountService accountService;

    public AccountUserDetailsService(AccountService accountService) {
        this.accountService = accountService;
    }

    @Override
    public UserDetails loadUser(String username) {
      	Account account = accountService.findAccountByUsername(username);
        return new AccountUserDetails(account);
    }
}

AccountUserDetail.java

public class AccountUserDetails implements UserDetails {

    private Account account;

    public AccountUserDetails(Account account) {
        this.account = account;
    }

    @Override
    public String getUsername() {
        return account.getName();
    }

    @Override
    public String getPassword() {
        return account.getPassword();
    }
}
  • 이제 로그인 핸들러 사용해서 잘 동작되는지 확인

App

public class App {
    public static void main(String[] args) {
        AccountService accountService = new AccountService();
        UserDetailsService userDetailsService = new AccountUserDetailsService(accountService);
        LoginHandler loginHandler = new LoginHandler();
        String login = loginHandler.login("kmp","kmp");
        System.out.println(login);
    }
}
  • 기존의 코드를 그대로 두고 사용이 가능해진다.

직접 코드를 수정된다면

Account.java

public class Account implements UserDetails{

    private String name;

    private String password;

    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String getUsername(){
        return this.name;
    }
    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}
  • UserDetails 구현 추가해서 getUsername과 getPassword를 Override해주면됨

AccountService.java

public class AccountService implements UserDetailsService{

    public Account findAccountByUsername(String username) {
        Account account = new Account();
        account.setName(username);
        account.setPassword(username);
        account.setEmail(username);
        return account;
    }

    public void createNewAccount(Account account) {

    }

    public void updateAccount(Account account) {

    }
    @Override
    public UserDetails loadUser(String username){
        return findAccountByUsername(username);
    }
}
  • 이렇게 직접 구현됨
  • 기존 코드가 구현식해야 되는 단점이 있지만
  • 복잡도와 코드량이 줄어들고
    • 단일 책임원칙을 따지면 원래 분리하는것이 좋긴함
    • 하지만 실용적인 측면도 중요하다. 무조건 그 법칙만 고수해서는 안된다.

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/02.%EA%B5%AC%EC%A1%B0%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/%EC%96%B4%EB%8C%91%ED%84%B0%ED%8C%A8%ED%84%B4/2021/1207/02.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/2021.12.07_%EC%96%B4%EB%8C%91%ED%84%B0%ED%8C%A8%ED%84%B402.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글