본문 바로가기
슬기로운 자바 개발자 생활/Java more

메서드 축출 기법(extract method)

by 슬기로운 동네 형 2019. 9. 17.
반응형

 책장 구석에 꽃혀 있는 토비의 스프링책을 무심히 쳐다본다. 책을 입수한 후로 열심히 봤는데 안본지 3년은 지난 듯하다. 아무 기대 없이 첫 장을 읽다보니 두장, 세장... 계속 페이지를 넘기게 된다.

 

첫 번째 예제를 옮겨본다.

//변경 전
public class UserDao {

    public void add(User user) throws  ClassNotFoundException, SQLException{

        Class.forName("org.mariadb.jdbc.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:mariadb://127.0.0.1:3306/redmango",
                "root",
                "1234");

        PreparedStatement ps = c.prepareStatement("insert into users(id,name,password) values(?,?,?)");
        ps.setString(1,user.getId());
        ps.setString(2,user.getName());
        ps.setString(3,user.getPassword());

        ps.executeUpdate();

        ps.close();
        c.close();
    }

    public User get(String id) throws ClassNotFoundException, SQLException{
        Class.forName("org.mariadb.jdbc.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:mariadb://127.0.0.1:3306/redmango",
                "root",
                "1234");

        PreparedStatement ps = c.prepareStatement("select * from users where id=?");
        ps.setString(1,id);

        ResultSet rs = ps.executeQuery();

        rs.next();
        User user = new User(rs.getString("id"),
                             rs.getString("name"),
                             rs.getString("password")
                            );
        rs.close();
        ps.close();
        c.close();

        return user;
    }

}

 

리팩토링 메서드 추출 기법

public class UserDao {

    public void add(User user) throws  ClassNotFoundException, SQLException{

        Class.forName("org.mariadb.jdbc.Driver");
        Connection c = getConnection();

        PreparedStatement ps = c.prepareStatement("insert into users(id,name,password) values(?,?,?)");
        ps.setString(1,user.getId());
        ps.setString(2,user.getName());
        ps.setString(3,user.getPassword());

        ps.executeUpdate();

        ps.close();
        c.close();
    }

    public User get(String id) throws ClassNotFoundException, SQLException{
        Class.forName("org.mariadb.jdbc.Driver");
        Connection c = getConnection();

        PreparedStatement ps = c.prepareStatement("select * from users where id=?");
        ps.setString(1,id);

        ResultSet rs = ps.executeQuery();

        rs.next();
        User user = new User(rs.getString("id"),
                             rs.getString("name"),
                             rs.getString("password")
                            );
        rs.close();
        ps.close();
        c.close();

        return user;
    }

    //연결되는 부분을분리한다.
    private Connection getConnection() throws ClassNotFoundException, SQLException{
        Connection c = DriverManager.getConnection(
                "jdbc:mariadb://127.0.0.1:3306/redmango",
                "root",
                "1234");
        return c;
    }

}

책에서는 관심사의 분리를 설명해준다.

위의 코드에서 특정 기능을 나누어 본다면 DB연결, 쿼리, 객체 닫기 라고 책에서 말한다.

 

첫번째로 DB 연결부분을 메서드 추출 기법을 이용해 아래 처럼 메서드로 만들었다.

  private Connection getConnection() throws ClassNotFoundException, SQLException{
        Connection c = DriverManager.getConnection(
                "jdbc:mariadb://127.0.0.1:3306/redmango",
                "root",
                "1234");
        return c;
    }

메서드로 변경하는 이유를 책에서는 설명해준다. ==>"지금은 UserDao 클래스의 메소드가 두개지만 나중에 메소드가 2,000개쯤 된다고 상상해보자." 

 

 

여기 가지만 읽어도 대충 감이 온다. 2,000개 다 고칠 수는 없다. 이렇게 분리해 놓으면 나중에 DB IP가 변경되면 getConnection() 함수만 고치면 된다.

 

DB 커넥션 관심(코드) 내용이 분리되었으므로 수정도 간단해졌다. 다른 코드에 영향도 안준다.

 

알고 나면 별 내용이 아닌듯 하지만 이런 기본 내용이 훗날 시스템 변경에 큰 영향을 준다.

오랬만에 PreparedStatement 객체를 생성 해봤다. 윽.... 날밤 까던 지난 날 추억이 새록새록 피어오른다. ㅠ.ㅠ

반응형

댓글