Solid - ISP

ChoiDevv·2023년 1월 5일
0

Before

마찬가지로 SRP, OCP의 개념 정리 이후의 글이다. 연결되어 지기에 그 전 글을 참고해주길 바란다. 현재 상황은 유저가 입력한 비밀번호의 검증이 추가된다고 가정한다.

ISP - 인터페이스 분리 원칙

비밀번호 검증에 대한 메소드가 추가되었기 때문에 인터페이스에 로직을 추가할 것이다. 이 로직 추가하는 것에 있어서 인터페이스의 특징이 문제가 되는데 이는 코드를 통해 알아보자.

Code

public interface PasswordEncode {

    StringBuilder passwordEncode(String password);

    boolean match(String password, StringBuilder encodedPassword);
}

인터페이스에 match 라는 메소드를 추가해준다.

public class BCryptPasswordEncoder implements PasswordEncode {
    ...

    @Override
    public boolean match(String password, StringBuilder encodedPassword) {
        boolean response;
        StringBuilder sb = new StringBuilder();
        StringBuilder encodingPassword = sb.append("{BCrypt}" + password);

        if (encodingPassword == encodedPassword) {
            response = true;
        } else {
            response = false;
        }

        return response;
    }
}

그럼 인터페이스의 규칙에 의해 모든 메소드를 오버라이딩 해야하기 때문에 빨간 줄이 그어지는데 위와 같이 검증 로직을 만들어낸다.

여기서 문제는 passwordEncode 메소드만 존재했을 때는 해당 메소드만 접근하기에 불필요한 접근이 없었는데 새로 메소드가 구현이 되면서 passwordEncode 메소드까지 접근이 가능해져버렸기 때문에 ISP를 위배하게 된다.

이런 경우에는 다음과 같이 수정한다.

public interface PasswordCheck {

    boolean match(String password, StringBuilder encodedPassword);
}

비밀번호 검사의 인터페이스를 따로 구성해준다.

public class BCryptPasswordEncoder implements PasswordEncode, PasswordCheck {
    ...
    
    @Override
    public boolean match(String password, StringBuilder encodedPassword) {
        boolean response;
        StringBuilder sb = new StringBuilder();
        StringBuilder encodingPassword = sb.append("{BCrypt}" + password);

        if (encodingPassword == encodedPassword) {
            response = true;
        } else {
            response = false;
        }

        return response;
    }
}

인터페이스는 다중 상속이 가능한 점을 이용해서 다중 상속을 진행하면 인터페이스가 분리되면서 불필요한 메소드 접근이 사라지게 된다. 이를 인터페이스 분리 원칙이라고 한다.

profile
기억보단 기록을

0개의 댓글