[SOLID] 단일 책임 원칙(SRP)을 적용하지 않은 샘플과 적용한 샘플 비교

엔스마트·2024년 6월 27일

단일 책임 원칙 (Single Responsibility Principle, SRP)은 클래스나 모듈은 단 하나의 책임만 가져야 하며, 그 책임에 대해서만 변경되어야 한다는 것을 말합니다. 이 원칙을 적용하지 않은 코드와 적용한 코드를 Java로 작성하여 비교해 보겠습니다.

단일 책임 원칙(SRP)을 적용하지 않은 샘플

아래 코드는 User 클래스가 사용자 정보 관리, 데이터 저장, 이메일 전송의 여러 책임을 모두 가지고 있습니다.

User.java (SRP 미적용)

public class User {
    private String username;
    private String email;

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public String getEmail() {
        return email;
    }

    // 데이터 저장 로직
    public void save() {
        System.out.println("Saving user " + username + " to the database.");
        // 데이터베이스 저장 로직
    }

    // 이메일 전송 로직
    public void sendEmail(String message) {
        System.out.println("Sending email to " + email + ": " + message);
        // 이메일 전송 로직
    }

    public static void main(String[] args) {
        User user = new User("john_doe", "john@example.com");
        user.save();
        user.sendEmail("Welcome to our service!");
    }
}

단일 책임 원칙(SRP)을 적용한 샘플

아래 코드는 각 클래스가 하나의 책임만 가지도록 분리되었습니다.

User.java

public class User {
    private String username;
    private String email;

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public String getEmail() {
        return email;
    }
}

UserRepository.java

public class UserRepository {
    public void save(User user) {
        System.out.println("Saving user " + user.getUsername() + " to the database.");
        // 데이터베이스 저장 로직
    }
}

EmailService.java

public class EmailService {
    public void sendEmail(User user, String message) {
        System.out.println("Sending email to " + user.getEmail() + ": " + message);
        // 이메일 전송 로직
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        User user = new User("john_doe", "john@example.com");
        UserRepository userRepository = new UserRepository();
        EmailService emailService = new EmailService();

        userRepository.save(user);
        emailService.sendEmail(user, "Welcome to our service!");
    }
}

비교 분석

SRP 미적용 코드의 문제점:

  • 유지보수성: User 클래스가 여러 가지 책임을 가지므로, 변경이 발생할 때마다 클래스의 다른 부분에 영향을 줄 수 있습니다. 예를 들어, 저장 로직이 변경되면 User 클래스의 이메일 전송 기능도 테스트해야 합니다.
  • 재사용성: User 클래스가 여러 책임을 가지므로, 재사용하기 어렵습니다. 다른 프로젝트에서 이메일 전송 기능만 필요하더라도, User 클래스를 가져와야 합니다.
  • 가독성: 하나의 클래스에 여러 책임이 포함되어 있으므로, 코드가 복잡해지고 가독성이 떨어집니다.

SRP 적용 코드의 장점:

  • 유지보수성: 각 클래스가 하나의 책임만 가지므로, 변경이 발생할 때 다른 클래스에 영향을 주지 않습니다. 예를 들어, 저장 로직이 변경되더라도 User 클래스나 이메일 전송 기능에는 영향을 미치지 않습니다.
  • 재사용성: 각 기능이 독립된 클래스로 분리되어 있으므로, 필요한 클래스만 재사용할 수 있습니다. 다른 프로젝트에서 이메일 전송 기능만 필요하면 EmailService 클래스만 가져오면 됩니다.
  • 가독성: 각 클래스가 하나의 책임만 가지므로, 코드가 단순해지고 가독성이 높아집니다. 각 클래스의 역할이 명확하여 이해하기 쉽습니다.

결론

단일 책임 원칙을 적용하면 코드의 유지보수성, 재사용성, 가독성이 크게 향상됩니다. 각 클래스가 하나의 책임만 가지도록 설계하면 변경에 유연하고, 코드의 복잡도를 낮출 수 있습니다. 따라서 소프트웨어 개발에서 SRP를 준수하는 것이 중요합니다.

profile
클라우드 전환, MSA 서비스, DevOps 환경 구축과 기술지원 그리고 엔터프라이즈 시스템을 구축하는 최고 실력과 경험을 가진 Architect Group 입니다.

0개의 댓글