티스토리 뷰

이전 1.1에서 초난감한 Dao를 작성해 보았다.

이 Dao의 문제점은 코드의 중복이 발생되어 추가되는 메소드나 Dao 클래스 마다 동일한 내용의 코드를 반복시켜주어야 했다.

또한 커넥션 연결 정보에 대해 너무 긴밀히 연결되어 있어 변화에 대해 자유도가 부족해 보였다.

이런 문제점을 해결하기 위해 중복된 코드를 추상 메소드로 만들어 분리하고 이에 대한 구현을 자유롭게 상속받아 구현하도록 변경해 보자.

 

UserDao.java

 
public abstract class UserDao {
	
	public abstract Connection getConnection() throws ClassNotFoundException, SQLException;


	public void add(User user) throws ClassNotFoundException, SQLException {
		
		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 {
		
		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;
	}
}

 

NUserDao.java

 
public  class NUserDao extends UserDao{

	public Connection getConnection() throws ClassNotFoundException, SQLException {
		
		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection(
				"jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8", "testuser", "1234");
		return c ;
	}

}

 

동일한 결과가 출력되는지 main() 메소드를 이용하여 테스트 해보자.

 

UserDaoTest.java

 
public class UserDaoTest {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		//NUserDao 직접 사용
		UserDao dao = new NUserDao();
		
		User user = new User();
		user.setId("spring");
		user.setName("books");
		user.setPassword("1111");

		dao.add(user);
			
		System.out.println(user.getId() + " 등록 성공");
		
		User user2 = dao.get(user.getId());
			
		System.out.println(user2.getId() + " 조회 성공");
		
	}
}

 

UserDao의 커넥션 생성 방법을 NUserDao라는 서브클래스에서 getConnection() 추상메소드에서 구현하였다.

이렇게 하면 혹시 모를 변경 / 추가되는 내용에 대해 getConnection() 메소드에 원하는 방식대로 확장하여 UserDao의 기능과 함께 사용할 수 있다. 

이 결과 UserDao는 어떻게 데이터를 등록하고 가져올 것인지에 대한 관심만 담당하고, DB 연결에 대한 관심은 NUserDao가 담당하여 관심사를 분리 시킬수 있다.

이런 패턴을 템플릿메소드패턴이라고 부른다.

'토비의 스프링 정리' 카테고리의 다른 글

1.1 초난감 DAO  (0) 2018.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함