공부해봅시당

[스프링] 오브젝트와 의존관계 1 본문

STUDY/Spring

[스프링] 오브젝트와 의존관계 1

tngus 2022. 10. 13. 16:01
< 스프링 관련 글은 [토비의 스프링 3.1] 책을 보고 정리한 글임을 밝힙니다 >

 

들어가며

스프링이 가장 관심을 많이 두는 대상은 오브젝트

 객체지향 설계의 기초와 원칙을 비롯해서 다양한 목적을 위해 재활용 가능한 설계 방법인 디자인 패턴, 좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업인 리펙토링, 오브젝트가 기대한 대로 동작하고 있는지를 효과적으로 검증하는 데 쓰이는 단위 테스트와 같은 오브젝트 설계와 구현에 관한 여러 가지 응용 기술과 지식이 요구됨

 

1.1. 초난감 DAO

1.1.1. User

먼저, 사용자 정보를 저장할 오브젝트를 만들어보자.

여기서는 User 클래스로 정의하였다.

 

User.java

package springbook.user.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() {
    	this.password = password;
    }
}

 

위에서 정의했던 User 오브젝트에 담긴 정보가 정의될 DB

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

 

자바빈(JavaBean)
아래 두 가지 관례를 따라 만들어진 오브젝트
- default constructor : 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하기 때문에 필요
- property
  1) property > 자바빈이 노출하는 이름을 가신 속성
  2) setter와 getter로 이루어짐

 

1.1.2. UserDao

 

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

DAO(Data Access Object)

DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

 

JDBC(Java Database Connectivity)를 이용하는 작업의 순서

  • DB 연결을 위한 Connection을 가져옴
  • SQL을 담은 Statement(또는 PreparedStatement)를 만듦
  • 만들어진 Statement를 실행
  • 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트(여기서는 위에서 작성했던 User 클래스의 오브젝트)에 옮겨줌
  • 작업 중에 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아줌
  • JDBC API가 만들어내는 예외를 잡아서 직접 처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 메소드 밖으로 던지게 처리
    • 일단 예외는 모두 메소느 밖으로 던져버리는 편이 간단함

 

UserDao.java

package Springbook.user.dao;

...

public class UserDao {
	public void add(User user) throws ClassNotFoundException, SQLException {
    	Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
        
        PreparedStatement ps = conn.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();
        conn.close();
    }
    
    public void get(String id) throws ClassNotFoundException, SQLException {
    	Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
        
        PreparedStatement ps = conn.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"));
        
        ps.executeUpdate();
        
        rs.close();
        ps.close();
        conn.close();
        
        return user;
    }
}

 

위의 JDBC DriverManager 인터페이스에 대한 자세한 설명은 아래 링크에서 확인할 수 있다.

 

SQLJ 연결 기술 2: JDBC DriverManager 인터페이스 - IBM Db2 11.1

SQLJ 연결 기술 2는 연결 작성을 위한 기본 도구로 DriverManager 인터페이스를 사용합니다. 프로시저 SQLJ 연결 기술 2를 사용하려면 다음 단계를 수행하십시오. SQLJ 연결 선언 절을 실행하십시오. 이

www.ibm.com

 

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

위에서 작성한 Dao의 동작 확인을 위해 main 메소드에서 테스트를 진행할 것이다.

 

public statis void main(String[] args) throws ClassNotFoundException, SQLException {
	UserDao dao = new 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.getName());
    System.out.println(user2.getPassword());
    
    System.out.println(user2.getId() + " 조회 성공");
}
<실행 결과>
whiteship 등록 성공
백기선
married
whiteship 조회 성공

 

위의 코드는 더이상 현업에서 사용하지 않는 방식으로 이루어져 있다.

 

왜 그럴까?

 

스스로 문제의식을 가지고 탐구하는 것이 중요하다.

 

먼저, 위 코드에 대해 질문을 던져드릴테니 스스로 해답을 생각해보길 바란다.

  • 왜 이 코드에 문제가 많다고 하는 것일까?
  • 잘 동작 하는 코드를 굳이 수정하고 개선해야 하는 이유는 무엇일까?
  • 그렇게 DAO 코드를 개선했을 때의 장점은 무엇일까?
  • 그런 장점들이 당장에, 또는 미래에 주는 유익은 무엇인가?
  • 객체지향 설계의 원칙과는 무슨 상관이 있을까?
  • 이 DAO를 개선하는 경우와 그대로 사용하는 경우, 스프링을 사용하는 개발에서 무슨 차이가 있을까?