๐ŸŽฐ Design Pattern

Adapter Pattern | ์–ด๋Œ‘ํ„ฐํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 8. 14. 23:37
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

     

    ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ผ๊นŒ?

    ํ•ญ์ƒ ๋‚˜์˜ค๋Š” ์˜ˆ์‹œ.. ํ•œ๊ตญ ์ „๊ธฐ์ œํ’ˆ 220V์™€ ๋ฏธ๊ตญ ์ „๊ธฐ์ œํ’ˆ 110V ์‚ฌ์ด์— ๊ฝ‚์•„์„œ ์ „์••์„ ๋งž์ถ”์–ด์ฃผ๋Š” ๊ฒƒ์„ ์–ด๋Œ‘ํ„ฐ๋ผ๊ณ ํ•œ๋‹ค!

    ์†Œํ”„ํŠธ์›จ์–ด์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ, ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งž์ถ”์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

     

     

     

    ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์ด๋ž€?

    ๊ทœ๊ฒฉ์— ๋งž์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค.

     

     

     

    ์žฅ์ 

    - ๊ธฐ์กด ์ฝ”๋“œ(Account)๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด(AccountUserDetails)๋ฅผ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋‹จ์ 

    - ์ƒˆ ํด๋ž˜์Šค(AccountUserDetails)๊ฐ€ ์ƒ๊ฒจ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ๊ตฌํ˜„๋ฐฉ๋ฒ•

    ๊ธฐ์กด์ฝ”๋“œ

     

    Security์—์„œ ์ œ๊ณตํ•˜๋Š” LoginHandler. Security ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค!!!

    public interface UserDetails {
        String getUsername();
        String getPassword();
    }
    
    
    public interface UserDetailsService {
    	UserDetails loadUser(String username);
    }
    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();
            }
        }
        
    }

     

     

    ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Application์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์ •์ •๋ณด

    @Data
    public class Account {
        private String name;
        private String password;
        private String email;
    }
    
    
    public class AccountService {
    	public Account findAccountByUsername(String username){
        	Account account = new Account();
            account.setName(username);
            account.setPassword(username);
            acoount.setEmail(username);
            return account;
        }
    }

     

     

    UserDetails๋ฅผ Account์™€ ํ˜ธํ™˜์‹œํ‚ค๊ณ ,

    UserDetailsService๋ฅผ AccountService์™€ ํ˜ธํ™˜์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ๊นŒ?

     

     

     

     

    ๋ณ€๊ฒฝ์ฝ”๋“œ

    //์‹œํ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€์— ์žˆ๋Š” UserDetails๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
    public class AccountUserDetails implments UserDetails {
    
        Account account;
        public AccountUserDetails(Account account){
        	this.account = account;
        }
    
    	@Override
        public String getUsername(){
        	return this.account.getName();
        }
        
        @Override
        public String getPassword(){
        	return this.account.getPassword();
        }
    
    }
    //์‹œํ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
    public class AccountUserDetailsService implements UserDetailsService {
    
        AccountService accountService;
        public AccountUserDetailsService(AccountService accountService){
        	this.accountService = accountService;
        }   
        
        @Override
        public UserDetails loadUser(String username){
        	Account account = accountService.findByAccountByUsername(username);
           	//์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ Account๋ฅผ ์ฐพ๋Š”๋‹ค 
           
            return new AccountUserDetails(account);
            //account๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด AccountUserDetails์—์„œ Account๋ฅผ UserDetails์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•œ๋‹ค (์–ด๋Œ‘ํ„ฐ!)
        }
       	
    }
    public class App {
    
        public static void main(String[] args) {
        
            AccountService accountService = new AccountService();
            UserDetailsService userDetailsService = new AccountUserDetailsService(accountService);
            //Account๋ฅผ UserDetails๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” AccountUserDetailsService๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
            
            LoginHandler loginHandler = new LoginHandler(userDetailsService);
            //๋กœ๊ทธ์ธ ํ•ธ๋“ค๋Ÿฌ์— ์ฃผ์ž…ํ•˜์—ฌ Account๊ฐ€ UserDetails๋กœ ๋ณ€ํ™˜๋˜๋„๋ก ํ•œ๋‹ค
            
            String login = loginHandler.login("keesun", "keesun");
            System.out.println(login);
            
        }
    }

     

    LoginHandler <- UserDetailsService <- UserDetails

     

    UserDetailsService <- AccountUserDetailsService <- AccountService

     

    UserDtails <- AccountUserDetails <- Account 

     

    ๋‘๊ฐœ์˜ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ SecurityํŒจํ‚ค์ง€์˜ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“ค ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ

    ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค!

     

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ