1. 오브젝트와 의존관계 - 초난감 DAO

이유석·2022년 3월 23일
0

Book - Toby's Spring

목록 보기
1/20
post-thumbnail

스프링의 핵심 철학
자바 엔터프라이즈 기술의 혼란 속에서 잃어버렸던 객체지향 기술의 진정한 가치를 회복시키고, 그로부터 객체지향 프로그래밍이 제공하는 혜택을 누릴 수 있도록 기본으로 돌아가는 것

즉, 자연스럽게 스프링이 가장 관심을 많이 두는 대상은 오브젝트이다.

오브젝트의 기술적인 특징과 사용방법을 넘어서, 오브젝트의 설계에 대하여 관심을 가져야 한다.

  • 객체지향 설계의 기초와 원칙
  • 재활용 가능한 설계를 위한 디자인 패턴
  • 리팩토링
  • 단위 테스트

스프링은 객체지향 기술과 설계, 구현에 관한 실용적인 전략과 사례를 평범한 개발자도 쉽게 적용할 수 있도록 프레임 워크 형태로 제공한다.


1.1 초난감 DAO

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

1.1.1 User

User Object

package springbook.user.domain;

public class User {
    String id;
    String name;
    String password;
}

Users Table

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

1.1.2 UserDao

  • 사용자 정보를 DB에 넣고 관리할 수 있는 클래스 이다.
  • 사용자 정보의 등록, 수정, 삭제와 각종 조회 기능이 있어야 한다.

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

  1. DB연결을 위한 Connection을 가져온다.
  2. SQL을 담은 Statement를 만든다.
  3. 만들어진 Statement를 실행한다.
  4. 조희의 경우 SQL 쿼리의 실행 결과 ResultSet으로 받아서 정보를 저장할 오브젝트에 옮겨준다.
  5. 작업 중에 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아준다.
  6. JDBC API가 만들어내는 예외는 처리할 필요가 있다.
public class UserDao {

    /**
     * User 데이터 추가
     */
    public void add(User user) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");

        // Connection 을 가져온다.
        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/toby?useSSL=false", "root", "password"
        );

        // Statement 작성
        PreparedStatement ps = c.prepareStatement(
                "insert into users(id, name, password) values(?,?,?)"
        );
        // parameter 설정
        ps.setString(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getPassword());

        // Statement 실행 후 DB 업데이트?
        ps.executeUpdate();

        // 작업 중에 생성된 Connection, Statement 같은 리소스는 역순으로 닫아준다.
        ps.close();
        c.close();

    }

    /**
     * User 데이터 조회
     */
    public User get(String id) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");

        // Connection 을 가져온다.
        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/toby?useSSL=false", "root", "password"
        );

        PreparedStatement ps = c.prepareStatement(
                "select * from users where id = ?"
        );
        // parameter 설정
        ps.setString(1, id);

        // 쿼리 실행 후 결과값 받음
        ResultSet rs = ps.executeQuery();
        rs.next(); // pointer 이동?

        // 결과값을 정보를 저장할 오브젝트에 옮겨준다.
        User user = new User();
        user.setId(rs.getString("id"));
        user.setName(rs.getString("name"));
        user.setPassword(rs.getString("password"));

        // 작업 중에 생성된 Connection, Statement 같은 리소스는 역순으로 닫아준다.
        rs.close();
        ps.close();
        c.close();

        return user;
    }
}

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

public class main {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        UserDao userDao = new UserDao();

        // insert test
        User user = new User();
        user.setId("Id");
        user.setName("test_name");
        user.setPassword("Password");

        userDao.add(user);

        System.out.println(user.getId() + "등록 성공");

        // select test
        User searchedUser = userDao.get(user.getId());

        System.out.println(searchedUser.getName());
        System.out.println(searchedUser.getPassword());

        System.out.println(searchedUser.getId() + "조회 성공");
    }
}

만약, 실패했다면 DB 설정과 Connection 정보, Users 테이블 등록 여부 등을 확인해봐야 한다.
또는 해당 프로젝트의 클래스패스에 DB의 드라이버가 있는지 확인해야 한다.

MySQL 을 사용 시, MySQL 버전에 맞는 mysql-connector-java 가 있어야 한다.

UserDao 클래스의 문제점

  • 책에서는 스스로 생각해보아야 한다고 하였다.
  • 아직까지는 정확히 무엇이 문제인지 모르겠다.
    • 사용자 정보 DB를 다루는 메서드가 100개 있을때, 공통 기능을 하는 DB Connection 부분이 중복으로 100번 작성되어야 한다.
    • 서로 다른 DB를 사용하는 클라이언트가 10명 있을때, 각 클라이언트에 맞는 DB Connection 코드를 갖는 클래스와 메서드들을 따로 작성해주어야 한다.
  • 객체지향 설계의 원칙과는 무슨 상관이 있을까?
  • DAO 코드를 개선해서 생기는 장점은 무엇인가?
  • 스프링을 사용하는 개발에서는 무슨 차이점이 있을까?

소스코드 : github

profile
https://github.com/yuseogi0218

0개의 댓글