주요글: 도커 시작하기
반응형

요즘 이런 저런 것들을 정리해보고 있는데, 그 중 일부 내용을 적어본다.


의존의 양면성


다음 코드를 보자.


public class Authenticator {

    public boolean authenticate(String id, String password) {

        Member m = findMemberById(id);

        if (m == null) return false;


        return m.equalPassword(password); // password가 m의 암호와 동일하면 true

    }

    ...

}


이 클래스를 사용하는 코드는 다음과 같이 checkPassword() 메서드를 이용해서 사용자가 입력한 암호가 올바른지 여부를 판단할 것이다.


public class AuthenticationHandler {


    public void handleRequest(String inputId, String inputPassword) {

        Authenticator auth = new Authenticator();

        if (auth.authenticate(inputId, inputPassword)) {

            // 아이디/암호 일치할 때의 처리

        } else {

            // 아이디/암호 일치하지 않을 때의 처리

        }

    }


}


위 코드에서 AuthentcationHandler 클래스는 Authenticator 클래스를 사용하고 있다. 즉, AuthenticationHandler 클래스가 Authenticator 클래스에 의존하고 있고, Authenticator 클래스에 변화가 생기면 AuthenticationHandler 클래스도 영향을 받게 된다.


그런데, 잘못된 아이디를 입력한 것인지 아니면 암호가 틀린 것인지 여부를 확인해서 시스템상에 로그로 남겨달라는 요구가 추가되었다. 이 요구를 충족시키려면 Authenticator의 authenticate() 메서드는 단순히 boolean 값을 리턴하면 안 된다. 아이디가 잘못되었는지 암호가 잘못되었는지 여부를 알려줄 수 있어야 한다. 예를 들면 AuthenticationHandler 클래스의 코드는 다음과 같이 익셉션을 통해서 인증 실패 이유를 구분할 수 있어야 한다.


public class AuthenticationHandler {

    public void handleRequest(String inputId, String inputPassword) {
        Authenticator auth = new Authenticator();
        try {
            auth.authenticate(inputId, inputPassword);
            // 아이디/암호가 일치하는 경우의 처리
        } catch(MemberNotFoundException ex) {
            // 아이디가 잘못된 경우의 처리
        } catch(InvalidPasswordException ex) {
            // 암호가 잘못된 경우의 처리
        }
    }

}


AuthenticationHandler 클래스를 위와 같이 작성하려면 Authenticator 클래스의 authenticate() 메서드가 다음과 같이 변경되어야만 한다.


public class Authenticator {

    public void authenticate(String id, String password) {

        Member m = findMemberById(id);

        if (m == null) throw new MemberNotFoundException();


        if (! m.equalPassword(password)) throw new InvalidPasswordException();

    }

    ...

}


AuthenticationHandler 클래스가 Authenticator 클래스에 의존하고 있는 상황에서, AuthenticationHandler 클래스의 변경 요구 때문에 Authenticator 클래스에 변화가 발생한 것이다. 이는 의존이 다음과 같이 상호간에 영향을 준다는 것을 보여준다.

  • 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다.
  • 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다.

+ Recent posts