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);
}
}
- 이렇게 직접 구현됨
- 기존 코드가 구현식해야 되는 단점이 있지만
- 복잡도와 코드량이 줄어들고
- 단일 책임원칙을 따지면 원래 분리하는것이 좋긴함
- 하지만 실용적인 측면도 중요하다. 무조건 그 법칙만 고수해서는 안된다.
728x90
반응형
'CS Study > 디자인패턴' 카테고리의 다른 글
2021.12.07_어댑터패턴04.자바와스프링에서찾아보는패턴 (0) | 2021.12.07 |
---|---|
2021.12.07_어댑터패턴03.장점과단점 (0) | 2021.12.07 |
2021.12.07_어댑터패턴01.패턴소개 (0) | 2021.12.07 |
2021.12.05_프로토타입패턴04.자바와스프링에서찾아보는패턴 (0) | 2021.12.05 |
2021.12.04_프로토타입패턴03.장점과단점 (0) | 2021.12.04 |
댓글