Woopii Vyeolog

[Spring, 오브젝트와 의존관계]1. DAO 본문

책 정리

[Spring, 오브젝트와 의존관계]1. DAO

WooPii 2022. 3. 17. 01:48

자바에서 가장 중요하게 가치를 두는 것은 바로 객체지향 프로그래밍이 가능한 언어라는 점이다.

스프링의 핵심 철학은 자바 엔터프라이즈 객체지향 기술의 진정한 가치 회복에 있다.

그렇기 때문에 스프링이 관심을 많이 두는 대상은 오브젝트이다. 

 

스프링은 객체지향 설계와 구현에 관해 특정한 모델과 기법을 억지로 강요하지는 않는다. 하지만 오브젝트를 어떻게 효과적으로 설계하고 구현하고, 사용하고, 이를 개선해나갈 것인가에 대한 며쾌한 기준을 마련해준다.

 

▶ DAO

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

 

※ 예제 1-1. User 

package com.example.tobi.spring.tobi_spring_example.sample.user.domain;

/**
 * tobi_springbook_54P
 */
public class User {
    String id;
    String name;
    String password;

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 

▶ 자바빈

자바빈(JavaBean)은 흔히 다음 두가지 관례를 따라 만들어진 오브젝트를 가리킨다. (간단히 빈이라고 부르기도 한다.)

  • 디폴트 생성자 : 자바빈은 파라미터가 없는 디폴트 생성자를 갖고 있어야 한다. 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하기 때문에 필요하다.
  • 프로퍼티 : 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다. 프로퍼티는 set으로 시작하는 수정자 메소드(setter)와 get으로 시작하는 접근자 메소드(getter)를 이용해 수정 또는 조회할 수 있다.

 

▶UserDao

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

일단 새로운 사용자를 생성하고, 아이디를 가지고 사용자 정보를 읽어오는 두 개의 메소드를 먼저 만들어 본다.

 

### 참고 ###

JDBC를 이용하는 작업의 일반적인 순서는 다음과 같다.

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

※ 예제 1-2 UserDao

package com.example.tobi.spring.tobi_spring_example.sample.user.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.example.tobi.spring.tobi_spring_example.sample.user.domain.User;

/**
 * tobi_springbook_57P
 */
public class UserDao {

    public void add(User user) throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        Connection c = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");
        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 ClassNotFoundException, SQLException {

        Class.forName("org.h2.Driver");
        Connection c = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");
        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()을 활용할 수 있다.

(그런데 스프링 실행 시 H2DB를 초기화 해 주는 형태라서 main은 사용하지 않도록 함)

 

※ 예제 1-3 테스트용 메소드

	@GetMapping("/daoTest")
	public void daoTest() throws Exception{
		// #####
		UserDao userDao = new UserDao();

		User user = new User();
		
		user.setId("1");
		user.setName("wplee");
		user.setPassword("qwer1234!!");

		userDao.add(user);

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

		User user2 = userDao.get(user.getId());
		System.out.println(user2.getName());
		System.out.println(user2.getPassword());

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

 

위 DAO 예제코드는 문제가 있는 코드이다.

 

문제가 있다고는 하지만 실제로 잘 동작하는 코드이긴 하다.

 

그럼 왜 이 코드에 문제가 있다고 하는 것인지, 

잘 동작하는 코드를 굳이 수정하고 개선해야 하는 이유가 무엇인지, 

그렇게 DAO 코드를 개선했을 떄 장점은 무엇인지, 

미래에 주는 유익은 무엇인지,

객체지향 설계와는 무슨 상관이 있는지,

또, 이 DAO를 개선하는 경우와 그래도 사용하는 경우, 스프링을 사용하는 개발에서 무슨 차이가 있는지 등

스프링을 공부한다는 건 바로 이런 문제 제기와 의문에 대한 답을 찾아나가는 과정이라고 이 책은 설명한다.

'책 정리' 카테고리의 다른 글

[Spring, 들어가며] 스프링이란 무엇인가?  (0) 2022.03.16
Comments