책&강의 정리

[Java / Spring] 토비의 스프링 - 1. 오브젝트와 의존관계 - 초난감 DAO

마볼링 2023. 5. 13. 10:31
토비의 스프링 공부 후 정리한 글입니다.

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 코드이기 때문에
객체지향 기술의 원리에 충실한 스프링 스타일의 코드로 개선해보는 작업이 필요하다.