개발/Spring

[Spring] DAO 개선하기 - 2

hojak99 2017. 7. 7. 09:18

이제 UserDao 클래스에 main() 메소드를 생성해 테스트 할 수 있는 코드가 되도록 해보겠다.



public static void main(String[] args) throws ClassNotFoundException, SQLException {
		UserDao dao = new UserDao();
		
		User user = new User();
		user.setId("whiteship");
		user.setName("백기선");
		user.setPassword("married");
		
		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() + ": 조회 성공");
	}


해당 main() 메소드를 실행하면 다음과 같은 테스트 성공 메시지를 얻을 수 있다. 만약 실패했다면 DB 설정 부분을 확인하고 디버깅을 돌려보자.


whiteship 등록 성공

백기선

married

whiteship 조회 성공



DAO 개선하기 - 1 과 2 를 통해서 간단한 사용자 정보 등록과 조회가 되는 무척 간단한 DAO 와 테스트용 메소드가 완성이 돼었다. 하지만 이렇게 만든 UserDao 에는 문제가 많다. 이 코드들을 좀 더 객체지향 적으로 변경을 해보도록 하자.


해당 코드들의 문제점으로는 만약 오라클 DB 를 사용하고 있는데 MySQL DB로 변경을 하려고 할 때 많은 코드들을 변경해야 한다. 즉, 변화가 있을 때 수정하기 무척 힘들다는 것이다.




그렇다면 중복된 코드를 메소드로 추출해보자.


public class UserDao {
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		UserDao dao = new UserDao();
		
		User user = new User();
		user.setId("whiteship");
		user.setName("백기선");
		user.setPassword("married");
		
		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() + ": 조회 성공");
	}
	
	public void add(User user) throws ClassNotFoundException, SQLException {
		Connection connection = getConnection();
		
		PreparedStatement ps = connection.prepareStatement(
				"INSERT INTO users(id, name, password) values(?, ?, ?)");
		ps.setString(1, user.getId());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());
		
		ps.executeQuery();
		ps.close();
		connection.close();
	}
	
	public User get(String id) throws ClassNotFoundException, SQLException {
		Connection connection = getConnection();
		
		PreparedStatement ps = connection.prepareStatement(
				"SELECT * FROM users WHERE id = ?"
		);
		ps.setString(1, id);
	
		ResultSet resultSet = ps.executeQuery();
		resultSet.next();
		
		User user = new User();
		user.setId(resultSet.getString("id"));
		user.setName(resultSet.getString("name"));
		user.setPassword(resultSet.getString("password"));
		
		resultSet.close();
		ps.close();
		connection.close();
		
		return user;
	}
	
	private Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "hojak99", "0430");
		
		return connection;
	}
}


다음과 같이 getConnection() 메소드를 만들어서 중복된 코드를 제거했다. 



다음 편에서는 상속을 통해 확장하는 내용을 작성하도록 하겠다.

반응형