토비의 스프링 공부 후 정리한 글입니다.
1.1 초난감 DAO
스프링이 가장 관심을 많이 두는 대상은 오브젝트다.
오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트 설계로 발전하게 된다.
📍 User DAO
DAO(Data Access Object)는 DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.
📍 User 오브젝트 - 자바빈
아래의 User 클래스는 자바빈 규약을 따르는 오브젝트이다.
자바빈(JavaBean)이란 디폴트 생성자를 갖추고, 프로퍼티를 가진 오브젝트를 말한다.
package chapter1;
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의 테이블이다.
📍 UserDao 클래스
사용자의 정보를 DB에 넣고 관리할 수 있는 DAO 클래스
- 사용자의 정보 저장 (add)
- 사용자의 정보 읽기 (get)
JDBC를 이용하는 일반적인 순서는 다음과 같다.
- DB 연결을 위한 Connection을 가져온다.
- SQL을 담은 Statement(또는 PreparedStatement)를 만든다.
- 만들어진 Statement를 실행한다.
- 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트(User)에 옮겨준다.
- 작업 중에 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아준다.
- JDBC API가 만들어내는 예외(Exception)를 잡아서 직접 처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 메소드 밖으로 던지게 한다.
package chapter1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
public void add(User user) throws SQLException, ClassNotFoundException {
Class.forName("org.mariadb.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/tobySpring"
, "root"
, "1234"
);
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 SQLException, ClassNotFoundException {
Class.forName("org.mariadb.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/tobySpring"
, "root"
, "1234"
);
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;
}
}
📍 main()을 이용한 DAO 테스트
main 메소드를 만들고 그 안에서 UserDao의 오브젝트를 생성해서 add()와 get()메소드 검증
- User오브젝트 생성 후 프로퍼티에 값 추가
- add() 메소드를 이용해 DB 등록
- 조회용으로 만든 get() 메소드를 사용해 DB에 저장된 결과 리턴
import chapter1.User;
import chapter1.UserDao;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
UserDao dao = new UserDao();
User user = new User();
user.setId("1");
user.setName("이민혁");
user.setPassword("DevMH");
dao.add(user);
System.out.println(user.getId() + " register succeeded");
User user2 = dao.get(user.getId());
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + " query succeeded");
}
}
위 방식은 문제가 많은 초난감 DAO 코드이기 때문에
객체지향 기술의 원리에 충실한 스프링 스타일의 코드로 개선해보는 작업이 필요하다.