백엔드 언어2017. 6. 21. 20:21

1. 전략패턴

public class CarDAO {
    private DBConnection dbConnection = new DBConnection();

    public List selectSUVData() {
        Connection conn = DBConnection.getConnection();
        // 자동차 정보 쿼리
        return list;
    }
}

public class DBConnection {
    public Conneciton getConnection() {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("" +"jdbc:mysql://localhost/testDB","id","pwd");
        return conn;
    }
}

위와 같은 코드는 DBConnection 클래스의 getConnection() 메소드에는 MYSQL에 대한 Connection을 얻는 코드가 있습니다.
만약 DB를 바꾸며 하는 작업이라면 매번 getConnection() 메소드의 내용을 수정해줘야 하고 매우 비효율적입니다.

그래서 CarDAO 부분의 DBConnection 부분을 수정해 보았습니다.



DBConnection dbConnection = new DBConnection() 

↓↓변경↓↓

MySqlDBConnection dbConnection = new MySqlDBConnection; // MySql 사용시
OracleDBConnection dbConnection = new OracleDBConnection; // Oracle 사용시



하지만 위와 같이 매번 변경을 해주는것은 매우 번거롭습니다.
이를 해결하기 위한 방법으로 자바에는 인터페이스가 있습니다.

DBConnection 이라는 인터페이스를 정의하고, 나머지 MySQLDBConnection, OracleDBConnection 등의 클래스를 DBConnection 인터페이스를 상속한 클래스로 만드는 것입니다.
그리고 DBConnection 구현체는 DAO 코드내에서 생성하지 않고, 생성자나 메소드의 파라미터를 통해 전달받으면 매우 유연한 코드가 됩니다.



아래는 변경된 코드 입니다.

public class CarDAO {
    private DBConnection dbConnection;

    public setDbConnection(DBConnection dbConnection) {
        this.dbConnection = dbConnection;
}

    public List selectSUVData() {
        Connection conn = dbConnection.getConnection();
        // 자동차 정보 쿼리
        return list;
    }
}

이 방식이 전략패턴 입니다.
DBConnection 인터페이스를 변수로 선언했기 때문에, 저 변수에는 setDbConnection() 메소드를 이용하여 MySQLDBConnection, OracleDBConnection 등 다른 클래스가 올 수 있습니다.

상황에 따라 구현 클래스를 바꿔 끼워가며 (전략을 바꾸듯이) 사용할 수 있습니다.




2. IOC 패턴

IOC란 Inversion Of Control의 약자로, 제어의 역전 이라는 뜻을 가지고 있습니다.

일반적인 프로그램은 자신이 사용할 오브젝트를 직접 선택하고, 생성합니다. 
변경전의 DAO에서 보셨듯이 DAO는 자신이 사용할 Connection 클래스를 직접 선택하고, 생성했습니다. ex) new MySqlDBConnection();

오브젝트의 대한 제어권을 자신이 가지고 있는, 능동적인 상태인 것이죠.

하지만 마지막에 전략패턴을 적용시키고, 변화에 유연한 코드를 만들면서 우리는 DAO를 수동적인 상태로 변환시켰습니다.

이때까진 필요한 오브젝트를 직접 만들다가, 이젠 남이 만들어준걸 전달받게 되죠.

오브젝트에 대한 제어가 역전 되었죠?

제어의 역전이란 말 그대로 제어권을 역전 시키는 것으로써,

제 3자에게 오브젝트에 대한 제어권을 넘겨주고, 자신은 제 3자가 선택하고 생성한 오브젝트를 받아서 사용하는 수동적인 상태가 되는 것을 말합니다.

public class DaoFactory {
    public CarDAO carDAO() {
        CarDAO carDao = new CarDAO();
        carDao.setDbConnection(getConnection());

        return carDao;
    }

    public DBConnection getConnection() {
        return new MySqlDBConnection_real(); // 변경되는 부분
    }
}

위와 같은 코드를 보면 MySqlDBConnection_real() 함수가 실행되어진 객체를 setDbConnection() 함수를 이용하여 데이터베이스를 선택 해줍니다.

DaoFactory 클래스 코드만 수정하면 데이터베이스 접속부분을 쉽게 변경할 수 있습니다.

이렇게 제어권을 제 3자가 제어하게끔 제어의 역전이 IOC입니다.




3. DI 패턴

DI란 Dependency Injection의 약자로, 의존관계 주입 이라는 의미를 가지고 있습니다.

의존관계란 별다른 뜻이 없습니다. 말 그대로 오브젝트가 서로 의존하고 있는 관계를 말합니다.

객체지향에서 의존하고 있다란 의미는, 하나의 오브젝트에서 다른 오브젝트를 사용할 때를 말합니다.

A라는 클래스에서 B라는 클래스를 사용할 경우, A클래스는 B클래스에 의존하고 있다 라고 표현합니다.

( 의존하고 있기 때문에 B클래스의 변경은 A클래스에 영향을 미칩니다.)



B클래스를 생성해서 A클래스에 넣어주는 과정, 이를 의존관계 주입이라고 보시면 됩니다.

의존관계에 있는 오브젝트를 생성해서 주입 해준다고 보시면 되는거죠.

주입은 누가 해주느냐? 제 3자가 해줍니다. IOC의 개념이네요.

결국 DI는 IOC의 세부적인 개념입니다!

carDao.setDbConnection(dBConnection());

위 코드가 바로 DI 패턴입니다.

CarDAO는 DBConnection 인터페이스에 의존하고, getConnection 메서드는 의존체인 DBConnection을 생성해줍니다.

그리고 제 3자인 DaoFactory가 CarDAO가 의존하는 DBConnection을 생성하고, setter를 통해 넣어줍니다.

이것이 마치 제 3자가 메서드를 통해 주입해주는 것과 같다고 해서 이를 의존관계 주입이라고 부릅니다.




=> 1자 2자 3자가 있다고 할 때, 1자가 2자에게 직접적으로 의존하는게 아니라 3자(조립기)가 2자의 객체를 생성하여 1자에게 넣어주는 것이다.

이렇게 하면 1자는 3자가 만들어준 2자의 객체에 의존하게 된다.

'백엔드 언어' 카테고리의 다른 글

페이징 처리 원칙  (0) 2017.08.02
JSP 파일 업로드 및 다운로드  (0) 2017.06.21
JSP 메일 발송하기  (0) 2017.06.21
LOG4J  (0) 2017.06.21
JSP MyBatis  (0) 2017.06.21
Posted by EL2A