이론/Toby

[Toby] 초난감 DAO

혀끄니 2023. 8. 4. 09:00
728x90

DAO

DAO(Data Access Object)는 DB를 사용해 데이터를 조회하거나
조작하는 기능을 전담하도록 만든 오브젝트를 말한다.

  • User

- 사용자 정보를 저장할 때는 자바빈 규약을 따르는 오브젝트를 이용하면 편리

- id, name, password 세 개의 프로퍼티를 가진 User 클래스

User.java

package com.toby.domain;

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의 테이블을 하나 만든다.

create table users(
   id varchar(10) primary key,
   name varchar(20) not null,
   password varchar(10) not null
)
  • 자바빈

- 자바빈(JavaBean)은 원래 비주얼 툴에서 조작 가능한 컴포넌트를 말함

- 자바빈의 몇가지 코딩 관례는 JPS, 빈, EJB와 같은 표준 기술과 자바빈 스타일의 오브젝트를 사용하는 오픈소스 기술을 통해 계속 이어지는 중

- 자바빈은 다음 두가지 관례를 따라 만들어진 오브젝트를 가르킨다.

1. 디폴트 생성자

- 자바빈은 파라미터가 없는 디폴트 생성자를 갖고 있어야 한다.

- 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하기 때문에 필요

2. 프로퍼티

- 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다.

- 프로퍼티는 set으로 시작하는 수정자 메소드(setter)와 get으로 시작하는 접근자 메소드(getter)를 이용해 수정 또는 조회할 수있다.

  • UserDao

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

JDBC를 이용하는 작업의 일반적인 순서

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

UserDao.java

public class UserDao {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        UserDao dao = new DaoFactory().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.getId() );
        System.out.println(user2.getName() );
        System.out.println(user2.getPassword() );
        System.out.println(user2.getId() + " 조회 성공");
    }

    // 사용자 추가
    public void add(User user) throws ClassNotFoundException, SQLException {
        // Driver
        Class.forName("com.mysql.cj.jdbc.Driver");
        // Connection (host, DB계정)
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost/tobi",
                "ID", "PW");

        // (Prepare)Statement
        PreparedStatement ps = c.prepareStatement(
                "insert into tobi.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 {
        // Driver
        Class.forName("com.mysql.cj.jdbc.Driver");
        // Connection (host, DB계정)
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost/tobi",
                "ID", "PW");

        // (Prepare)Statement
        PreparedStatement ps = c.prepareStatement(
                "select * from tobi.users where id = ?");
        ps.setString(1, id);

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

결과 화면

 

728x90