템플릿 메소드 패턴 : 슈퍼클래스에 기본적인 로직의 흐름(커넥션, SQL생성, 실행, 반환) 을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법
팩토리 메소드 패턴 : 서브클래서에 구체적인 오브젝트 생성 방법을 결정하게 하는 것
NUserDao, DUserDao 에서는 어떤식으로 Connection 기능을 제공하는지, 어떤 방법으로 Connection 오브젝트를 만들어내는지에 대한 관심을 가지고 있음.
상속을 통한 확장방법이 제공
UserDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | package springbook.user.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import springbook.user.domain.User; public abstract class UserDao { public void add(User user) throws ClassNotFoundException, SQLException{ //DB 연결 기능이 필요하면 getConnection() 메소드를 이용하게 된다. 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{ //DB 연결 기능이 필요하면 getConnection() 메소드를 이용하게 된다. 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(); user.setId(rs.getString("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); rs.close(); ps.close(); c.close(); return user; } /* * 구현 코드는 제거 되고 추상메소드로 바뀌었음. 메소드의 구현은 서브 클래스가 담당 */ public abstract Connection getConnection() throws ClassNotFoundException, SQLException ; } |
DUserDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package springbook.user.dao; import java.sql.Connection; import java.sql.SQLException; public class DUserDao extends UserDao{ @Override public Connection getConnection() throws ClassNotFoundException, SQLException { // D사 DB Connection 생성코드 return null; } } |
NUserDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package springbook.user.dao; import java.sql.Connection; import java.sql.SQLException; public class NUserDao extends UserDao{ @Override public Connection getConnection() throws ClassNotFoundException, SQLException { // N사 DB Connection 생성코드 return null; } } |
'Programming > 토비의 스프링 예제' 카테고리의 다른 글
예제6. 관심사의 분리 (0) | 2014.08.20 |
---|---|
예제5. 인터페이스의 도입 (0) | 2014.08.20 |
예제4. 클래스의 분리 (0) | 2014.08.20 |
예제2 중복 코드의 메소드 추출 (0) | 2014.08.18 |
예제1 (0) | 2014.08.18 |