토비의 스프링 1.1장 초난감 DAO

     

    먼저 사용자 정보를 JDBC API를 통해 DB에 저장하고 조회할 수 있는 간단한 DAO를 만들자

     

    1.1.1  User

    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;
        }
    }

     

    이제 User 오브젝트에 담긴 정보가 실제로 보관될 DB의 테이블을 하나 만들어보자.

     

     

    MySQL을 사용한다면 DB 생성 후 CREATE TABLE 명령어를 실행하여 테이블을 만들 수 있다

     

    create table users {
        id varchar(10) primary key,
        name varchar(20) not null,
        password varchar(20) not null
    }

     

    1.1.2 UserDao

     

    사용자 정보를 DB에 넣고 관리할 수 있는 DAO  클래스를 만들어보자

     

    public class UserDao {
    
        public void add(User user) throws ClassNotFoundException, SQLException {
            // 1. DB 연결을 위한 Connection을 가져옴
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
            
            // 2. SQL을 담은 Statement를 만듦
            PreparedStatement ps = c.prepareStatement("insert into users(id, name, password) value(?,?,?)");
            ps.setString(1, user.getId());
            ps.setString(2, user.getName());
            ps.setString(3, user.getPassword());
     		
            // 3. 만들어진 Statement를 실행
            ps.executeUpdate();
    
            ps.close();
            c.close();
        }
    
        public User get(String id) throws ClassNotFoundException, SQLException {
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
    
            PreparedStatement ps = c.prepareStatement("select * from users where id = ?");
            ps.setString(1, id);
            
            // 4. 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 ㅓ장할 오브젝트에 옮겨줌
            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"));
    		
            // 5. 작업 중 생성된 connection, statement, resultset같은 리소스는 작업이 끝나면 반드시 닫아줌
            rs.close();
            ps.close();
            c.close();
    
            return user;
        }
    }

     

    JDBC를 이용하는 작업의 일반적인 순서는 다음과 같다.

    • DB 연결을 위한 Connection을 가져온다.
    • SQL을 담은 Statement를 만든다.
    • 만들어진 Statement를 실행한다.
    • 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트에 옮겨준다.
    • 작업 중에 생성된 Connection, Statement, ResultSet같은 리소스는 작업이 끝나면 반드시 닫아준다.
    • JDBC API가 만들어내는 예외를 잡아서 직접 처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 메소드를 밖으로 던지게 한다.

     

    1.1.3 main()을 이용한 DAO 테스트 코드

     

    만들어진 코드의 기능을 검증해보자. 이 떄 가장 간단한 방법은 오브젝트 스스로 자신을 검증하도록 만드는 것이다. 모든 클래스에는 자신을 엔트리 포인트로 설정해 직접 실행이 가능하게 해주는 스테틱 메소드인 main()이 존재한다.

     

    public class UserDaoTest {
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
            UserDao userDao = new UserDao();
    
            User user = new User();
            user.setPassword("study");
            user.setId("loop");
            user.setName("반복");
    
            userDao.add(user);
    
            System.out.println(user.getId() + " 등록 성공");
    
            User user2 = userDao.get(user.getId());
            System.out.println(user2.getName());
            System.out.println(user2.getPassword());
            System.out.println(user2.getId() + " 조회 성공");
        }
    }

     

    이렇게 해서 사용자의 정보 등록과 조회가 되는 DAO와 테스트용 메소드까지 완성하였다.

    하지만 UserDao에는 문제점이 많다. 잘 동작하는데에도 불구하고 코드를 굳이 수정하고 개선해야하는 이유는 무엇일까? 

    댓글