이론/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를 이용하는 작업의 일반적인 순서
- DB연결을 위한 Connection을 가져옴
- SQL을 담은 Statement(또는 PreparedStatement)를 만듬
- 만들어진 Statement를 실행
- 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트(User)에 옮겨준다.
- 작업 중에서 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아준다.
- 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