๋ชฉ์ฐจ
์ด๋ค ์ํฉ์์ ์ฐ์ผ๊น?
ํญ์ ๋์ค๋ ์์.. ํ๊ตญ ์ ๊ธฐ์ ํ 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ํจํค์ง์ ์ฝ๋๋ฅผ ๊ฑด๋ค ์ ์๋ ์ํฉ์์
์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํธํ๋๋๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ๋์๋ค!
'๐ฐ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Composite Pattern | ์ปดํฌ์ง ํจํด (0) | 2022.08.15 |
---|---|
Bridge Pattern | ๋ธ๋ฆฟ์ง ํจํด (0) | 2022.08.15 |
Prototype Pattern | ํ๋กํ ํ์ ํจํด (0) | 2022.08.14 |
Abstract Factory | ์ถ์ ํฉํ ๋ฆฌ ํจํด (0) | 2022.08.14 |
Factory Method Pattern | ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด (0) | 2022.07.29 |