- DIP(Dependency Inversion Principle) : 의존 역전 원칙
의존 역전 원칙은 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 되며, 추상화된 것은 구체적인 것에 의존해서도 안 된다는 원칙이다. 이 원칙을 지키면서 코드를 작성하면, 모듈간의 결합도를 낮출 수 있다.
아래는 의존 역전 원칙이 위배된 코드이다.
public class UserService {
private Database database = new Database();
public void createUser(String username, String password) {
// DB에 사용자 생성
database.insertUser(username, password);
}
public void deleteUser(String username) {
// DB에서 사용자 삭제
database.deleteUser(username);
}
}
public class Database {
public void insertUser(String username, String password) {
System.out.println("Inserting user into database...");
}
public void deleteUser(String username) {
System.out.println("Deleting user from database...");
}
}
위의 코드에서는 UserService 클래스가 Database 클래스에 직접 의존하고 있다. Database 클래스를 수정할 경우 UserService 클래스도 함께 수정해야 한다.
아래 코드는 의존 역전 원칙이 적용된 코드이다.
public interface UserRepository {
void insertUser(String username, String password);
void deleteUser(String username);
}
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createUser(String username, String password) {
// UserRepository를 이용하여 사용자 생성
userRepository.insertUser(username, password);
}
public void deleteUser(String username) {
// UserRepository를 이용하여 사용자 삭제
userRepository.deleteUser(username);
}
}
public class DatabaseUserRepository implements UserRepository {
public void insertUser(String username, String password) {
System.out.println("Inserting user into database...");
}
public void deleteUser(String username) {
System.out.println("Deleting user from database...");
}
}
위의 코드에서는 UserService 클래스가 UserRepository 인터페이스에 의존하도록 변경되었다. UserService 클래스는 UserRepository 인터페이스의 메서드만 사용하도록 하며, 실제로 사용할 구현체는 생성자를 통해 주입받는다.
이렇게 하면 DatabaseUserRepository 클래스를 수정하더라도 UserService 클래스는 영향을 받지 않는다.