본문 바로가기

객체지향설계 5원칙(S.O.L.I.D)

S. 단일 책임 원칙(Single Responsibility Principle)

단일 책임 원칙이란?

모든 클래스는 `하나의 책임`만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.

클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다. (위키백과)

즉, 단일 책임 원칙은 클래스가 단 하나의 관심사에 집중해야 한다라는 것입니다. 단일 관심사에 집중하는 클래스는

유지보수하기 쉽고, 오류를 찾기가 용이합니다.

단일 책임 원칙을 지키지 않은 예시

//사용자 도메인은 사용자 정보를 저장, 변경의 책임이 있지만, 이메일의 유효성을 검사하거나 이메일을 전송하는 책임을 가질 필요는 없습니다.
public class User {
    private static Pattern EMAIL =
    Pattern.compile("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$");
    private Long id;
    private String name;
    private String email;

    public User(Long id, String name, String email) {
        validateEmail(email);
        this.id = id;
        this.name = name;
        this.email = email;
    }

    private void validateEmail(String email) {
        if(!EMAIL.matcher(email).matches()) {
            throw new IllegalArgumentException("이메일 형식이 아닙니다.");
        }
    }

    public void sendMail() {
        System.out.println("send Mail by" + email);
    }
}

객체가 하나의 관심사를 갖도록 분리한다

public class User {
    private Long id;
    private String name;
    private Email email;

    public User(Long id, String name, Email email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}    
public class Email {
    private final String email;

    public Email(String email) {
        validateEmail(email);
        this.email = email;
    }

    private void validateEmail(String email) {
        if (!EmailString.isValidEmailString(email)) {
            throw new IllegalArgumentException("이메일 형식이 아닙니다.");
        }
    }

    public void sendMail() {
        System.out.println("send Mail by" + email);
    }
}
public class EmailString {
    private static final Pattern EMAIL = Pattern.compile("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$");

    private EmailString() {
    }

    public static boolean isValidEmailString(String emailString) {
        return EMAIL.matcher(emailString).matches();
    }
}

정리

  • 단일 책임 원칙은 클래스가 하나의 관심사에 집중하게 한다.
  • 단일 책임 원칙은 객체의 응집력을 높일 수 있다.

참고 : java-single-responsibility-principle

https://github.com/haedoang/solid.git