상속관계도 아닌 완전히 독립적인 클래스로 만든다.
SimpleConnectionMaker 라는 새로운 클래스를 만들고 DB생성 기능을 그 안에 넣음. 한번만 SImpleConnectionMaker 오브젝트를
만들어서 저장해두고 이를 계속 사용.
문제점1. 메소드 이름이 바꼈을 경우
문제점2. DB커넥션을 제공하는 클래스가 어떤 것인지를 UserDao가 구체적으로 알고 있어야한다. UserDao가 SImpleConnectinMaker라는 특정 클래스와 그 코드에 종속적이기 때문에 DB커넥션을 가져오는 방법을 자유롭게 확장하기가 힘들어짐.
SImpleConnectionMaker.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.DriverManager; import java.sql.SQLException; public class SimpleConnectionMaker { public Connection makeNewConnection() throws ClassNotFoundException, SQLException{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testDB" , "otep", "otep"); return c; } } |
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 62 63 64 65 66 67 | 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 class UserDao { private SimpleConnectionMaker simpleConnectionMaker; public UserDao(){ //한번만 인스턴스 변수에 저장해두고 메소드에서 사용하게 한다. simpleConnectionMaker = new SimpleConnectionMaker(); } public void add(User user) throws ClassNotFoundException, SQLException{ Connection c = simpleConnectionMaker.makeNewConnection(); 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 = simpleConnectionMaker.makeNewConnection(); 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 ; } |
'Programming > 토비의 스프링 예제' 카테고리의 다른 글
예제6. 관심사의 분리 (0) | 2014.08.20 |
---|---|
예제5. 인터페이스의 도입 (0) | 2014.08.20 |
예제3. 상속을 통한 확장 (0) | 2014.08.20 |
예제2 중복 코드의 메소드 추출 (0) | 2014.08.18 |
예제1 (0) | 2014.08.18 |