ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SOLID - SRP 단일 책임의 원칙 파헤치기
    Java/디자인패턴 2024. 10. 22. 14:31
    반응형

    SRP 단일 책임의 원칙

    **Single Responsibility Principle (SRP)**는 객체 지향 설계 원칙 중 하나로, 클래스는 하나의 책임만 가져야 한다는 것을 의미합니다. 즉, 클래스가 여러 가지 역할을 동시에 수행하지 않고, 하나의 역할 또는 기능만을 처리해야 합니다. SRP를 위반하면 코드의 유지 보수성이 낮아지고, 변경에 대한 영향 범위가 넓어질 수 있습니다.

     

     

    SRP에 위배된 코드

    public class UserService {
        public void saveUser(User user) {
            // Save user to database
            System.out.println("User saved to database: " + user.getName());
        }
    
        public void sendWelcomeEmail(User user) {
            // Send welcome email to user
            System.out.println("Welcome email sent to: " + user.getEmail());
        }
    
        public void logUserActivity(User user) {
            // Log user activity
            System.out.println("Logging activity for user: " + user.getName());
        }
    }
    
    class User {
        private String name;
        private String email;
    
        public User(String name, String email) {
            this.name = name;
            this.email = email;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    }

     

     

    위 코드에서 SRP 위반 요소

    위 코드에서는 UserService 클래스가 여러 가지 책임을 맡고 있습니다:

    1. saveUser 메서드: 사용자 정보를 데이터베이스에 저장하는 역할.
    2. sendWelcomeEmail 메서드: 사용자에게 환영 이메일을 보내는 역할.
    3. logUserActivity 메서드: 사용자 활동을 기록하는 역할.

    이 클래스는 사용자 관련 서비스의 여러 기능을 모두 포함하고 있기 때문에, 하나의 책임에 집중하지 못하고 있습니다. 만약 이메일 전송 로직에 문제가 생기거나, 사용자 로그 기록 로직을 변경해야 하는 경우 UserService 클래스 전체에 영향을 줄 수 있습니다.


     

    개선된 코드

    // User 클래스는 그대로 사용
    class User {
        private String name;
        private String email;
    
        public User(String name, String email) {
            this.name = name;
            this.email = email;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    }
    
    // 사용자 저장 책임을 담당하는 클래스
    class UserRepository {
        public void saveUser(User user) {
            // Save user to database
            System.out.println("User saved to database: " + user.getName());
        }
    }
    
    // 이메일 전송 책임을 담당하는 클래스
    class EmailService {
        public void sendWelcomeEmail(User user) {
            // Send welcome email to user
            System.out.println("Welcome email sent to: " + user.getEmail());
        }
    }
    
    // 사용자 활동 로그 책임을 담당하는 클래스
    class ActivityLogger {
        public void logUserActivity(User user) {
            // Log user activity
            System.out.println("Logging activity for user: " + user.getName());
        }
    }
    
    // 각 서비스를 조합하여 사용하는 UserService 클래스
    class UserService {
        private UserRepository userRepository;
        private EmailService emailService;
        private ActivityLogger activityLogger;
    
        public UserService(UserRepository userRepository, EmailService emailService, ActivityLogger activityLogger) {
            this.userRepository = userRepository;
            this.emailService = emailService;
            this.activityLogger = activityLogger;
        }
    
        public void registerUser(User user) {
            userRepository.saveUser(user);
            emailService.sendWelcomeEmail(user);
            activityLogger.logUserActivity(user);
        }
    }

    개선된 코드 설명

    • UserRepository: 사용자 데이터를 데이터베이스에 저장하는 책임을 담당하는 클래스입니다.
    • EmailService: 이메일 전송을 담당하는 클래스입니다. 이 클래스를 통해 이메일 관련 로직이 변경될 때에도 다른 기능에 영향을 주지 않게 됩니다.
    • ActivityLogger: 사용자 활동을 로그로 기록하는 책임을 갖는 클래스입니다.

    이처럼 각 클래스가 하나의 책임만을 가지므로, 유지 보수나 수정이 필요한 경우 특정 클래스만 변경하면 됩니다. SRP 원칙을 잘 준수하면 코드의 결합도가 낮아지고, 각 클래스의 역할이 명확해지기 때문에 코드를 읽거나 관리하기 훨씬 수월해집니다.

    반응형

    댓글

Designed by Tistory.