OCP
개방폐쇄원칙이란 클래스와 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다라고 정의할 수 있다.
아래 UserDao 클래스는 DB 연결 방법이라는 기능을 확장하는데 있어서 열려 있다.
UserDao에 전혀 영향을 주지 않고도 얼마든지 기능을 확장할 수 있기 때문이다. 동시에 자신의 핵심 기능 코드는 변화에 영향을 받지 않고 유지할 수 있으므로 변경에는 닫혀 있다고 할 수 있다.
package springbook.user.dao;
import springbook.user.domain.User;
import java.sql.*;
public class UserDao {
private ConnectionMaker connectionMaker;
public UserDao(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
public void add(User user) throws ClassNotFoundException, SQLException {
Connection con = connectionMaker.makeConnection();
PreparedStatement ps = con.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();
if(ps!=null)
ps.close();
if(con!=null)
con.close();
}
public User findById(String id) throws ClassNotFoundException, SQLException {
Connection con = connectionMaker.makeConnection();
PreparedStatement ps = con.prepareStatement("select * from users where id = ?");
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
rs.next();
User user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
rs.close();
ps.close();
con.close();
return user;
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
UserDao userDao = new UserDao(new DConnectionMaker());
User user = new User();
user.setId("daum23");
user.setName("song23");
user.setPassword("1!!abc");
userDao.add(user);
System.out.println(user.getId()+" success");
User user2 = userDao.findById(user.getId());
System.out.println("user2.getName() = " + user2.getName());
System.out.println("user2 = " + user2.getPassword());
}
}