public class User {
String id;
String name;
String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class UserDao {
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = DriverManager.getConnection(
"jdbc:h2:~/tobyspring", "sa", "");
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 {
Connection c = DriverManager.getConnection(
"jdbc:h2:~/tobyspring", "sa", "");
PreparedStatement ps = c.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();
c.close();
return user;
}
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
UserDao dao = new UserDao();
User user = new User();
user.setId("yylee");
user.setName("유영");
user.setPassword("1234");
dao.add(user);
System.out.println(user.getId() + " 등록 성공");
User user2 = dao.get(user.getId());
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + " 조회 성공");
}
콘솔 결과:
> yylee 등록 성공
> 유영
> 1234
> yylee 조회 성공
private Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:h2:~/tobyspring", "sa", "");
}
✅ 템플릿 메소드 패턴
✅ 팩토리 메소드 패턴
슈퍼클래스에서 기본적인 로직의 흐름을 추상 메소드/protected 메소드로 템플릿처럼 제공하고, 서브클래스에서 이를 구체적으로 구현하는 방식
구체적으로 어떤 인스턴스를 만들지는 서브 클래스에서 결정하는 방식
👉 UserDao의 getConnection은 템플릿 메소드이자 팩토리 메소드라고 볼 수 있음
public class UserDao {
private SimpleConnectionMaker simpleConnectionMaker;
public UserDao(){
simpleConnectionMaker = new SimpleConnectionMaker();
}
public void add(User user) throws SQLException {
Connection c = simpleConnectionMaker.makeNewConnection();
//...
}
public User get(String id) throws SQLException {
Connection c = simpleConnectionMaker.makeNewConnection();
//...
}
}
public class SimpleConnectionMaker {
public Connection makeNewConnection() throws SQLException {
return DriverManager.getConnection("jdbc:h2:~/tobyspring", "sa", "");
}
}
public interface ConnectionMaker {
public Connection makeConnection() throws SQLException;
}
public class UserDao {
private ConnectionMaker connectionMaker;
public UserDao(){
connectionMaker = new NConnectionMaker(); //구체 클래스에 의존!
}
//...
public UserDao(ConnectionMaker connectionMaker){
this.connectionMaker = connectionMaker;
}
👉 UserDao -> 클라이언트로 관심사항, 책임을 떠넘김
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao dao = new UserDao(connectionMaker); //UserDao-ConnectionMaker 의존관계 설정