코딩 선조들은 JDBC를 직접 연동해서 코드를 작성하였다. Connection을 DB와 연동하는 코드를 직접 작성해주고 쿼리문을 작성하고 결과값을 한땀한땀 작성하여 객체에 정보를 저장하는 식으로 코드를 짰다.
public void add(User user) throws ClassNotFoundException, SQLException {
Class.forName("org.mariadb.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/user", "user", "123456"
);
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();
}
보기만해도 머리가 지끈지끈 아파온다. 코드가 길어지다 보니 오타가 날 확률도 높다. 또한 비지니스 로직을 하나씩 작성할때마다 일일이 Connection을 작성하고 쿼리문을 적다보니 변경사항이 생겼을때 하나의 수정사항에도 많은 코드를 건드려야할 확률이 높아지게 된다.
현재 MariaDB로 연결시켰놨는데 만약 다른 데이터베이스로 변경해야하는 일이 생겼을 경우 작성한 모든 메서드를 변경해야하는 일이 생기는 것이다.
이러한 코드 작성 방식을 '관심사가 분리되어 있지 않다'라고 한다.
Connection과 PreparedStatement의 역할이 다르다. Connection은 자바와 DB를 연결시켜주는 징검다리의 역할을 하는 것이고 PreparedStatement는 DB로 쿼리문을 날리는 역할을 하는 것이다. 즉 관심사가 다르기 때문에 이들을 분리해줘야 나중에 유지보수 하는 입장에서 편한 것이다.
private Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.mariadb.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/user", "user", "123456"
);
return c;
}
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
}
이렇게 Connection만을 담당하는 메소드를 만들어준다면 나중에 DB를 변경해야하는 경우가 생겼을 때에도 getConnection 메서드만을 수정하면 된다. 관심사가 분리되어 있지 않은 경우에 메서드가 10000줄이라고 가정한다면 10000줄의 코드를 다 손봐야 하게 되는 것이다. 이러한 관심사의 분리는 객체지향 5대 설계 원칙인 단일책임원칙(SRP)과 밀접한 관련이 있다.