Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Spring/토비의스프링3/오브젝트와의존관계

From ZeroWiki
Revision as of 11:14, 25 February 2011 by imported>rabierre

초난감 DAO

  • 사용자 정보를 JDBC API를 이용해 DB에 저장하고 조회할 수 있는 간단한 DAO 만들기.
  • DAO(Data Access Object)
    • DB를 사용하여 데이터를 조회, 조작하는 기능을 전담하도록 만든 오브젝트.

User

  • 사용자 정보를 저장할 때 자바빈 규약을 따르는 오브젝트를 이용하면 편리하다.
    • 자바빈(JavaBean)
    • 간단히 빈이라고도 한다.
    • 원래 의미는 비주얼 툴에서 조작 가능한 컴포넌트.
    • 요즘은
      • 파라미터가 없는 디폴트 생성자를 가지고 있고
      • getter와 setter를 통해 조회, 수정할 수 있는 프로퍼티를 가진 오브젝트를 의미한다.
  • User : 사용자 정보 저장용 자바빈 클래스
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(String password) {
        this.password = password;
    }
}
  • USER 테이블
필드명 타입 설정
UserId VARCHAR(10) Primary Key
Name VARCHAR(20) Not Null
Password VARCHAR(20) Not Null

UserDao

  • UserDao : JDBC를 이용한 등록, 조회 기능이 있는 DAO 클래스
package springbook.user.dao;

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

import springbook.user.domain.User;

public class UserDao {
    public void add(User user) throws SQLException, ClassNotFoundException{
        Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");

        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("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");

        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의 기능을 사용하는 웹 어플리케이션을 만들어 서버에 배치한 뒤 웹 브라우저를 통해 사용해보거나
    • UserDao 코드가 동작하는지 확인하기 위해 너무 복잡한 작업이 필요하다.
    • 오브젝트가 스스로 자신을 검증하도록 테스트 코드를 만들어주면 된다.

DAO의 분리

DAO의 확장

  • 관심사에 따라 오브젝트 나누기
    • 관심사가 다르다
    • 변화의 성격이 다르다
    • 변화의 성격이 다르다는 것은 변화의 이유와 시기, 주기가 다르다는 것을 의미함
    • 추상클래스를 만들어놓고 상속을 통해 변화를 구현하는 방법 -> 불편하다
  • 1.3.1 클래스의 분리
    • 서로 다른 관심사를 독립적인 클래스로 분리해보자
    • 기존의 코드를 수정할 때는 기능의 변화가 아닌 내부 설계를 변경해 더 나은 코드를 만드는 것 이다(리팩토링)
    • 리팩토링 후 기능의 변화가 없는지 검증해야 한다. 테스트 코드가 이를 검증해 준다.
    • 분리된 두 클래스는 의존관계를 가진다.
  • 1.3.2 인터페이스의 도입
    • 클래스 분리에서 가장 중요한 점은 두 클래스가 낮은 결합도를 가져야 한다는 것이다.
    • 추상화
    • 어떤 것들의 공통적인 성격을 뽑아내어 이를 따로 분리해내는 작업
    • interface 이용
    • 상속보다 유연한 관계 설정 가능
  • 1.3.3 관계설정 책임의 분리
    • 코드의 크기가 작고 간단해도 클래스와는 다른 독립적인 관심사를 가지고 있다면 분리해야한다.
    • 클래스의 확장성을 해칠 수 있다.
    • 클래스간의 관계설정
    • 오브젝트와 오브젝트간의 관계설정을 의미한다.
    • 런타임 사용관계 : 오브젝트 사이의 관계란 런타임시에 한 오브젝트가 다른 오브젝트의 레퍼런스를 가지고있는 것.
    • 방법
      • 사용할 오브젝트를 내부에서 생성
      • 인터페이스로 구현된 파라메터를 이용해 외부에서 전달받는다. (다형성)
  • 1.3.4 윈칙과 패턴
    • 개방 폐쇄 원칙(OCP) 객체지향 설계원칙(SOLID)
    • 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다
    • 높은 응집도와 낮은 결합도
    • 전략 패턴

제어의 역전(IoC)

스프링의 IoC

5.1 오브젝트 팩토리를 이용한 스프링 IoC

   5.1.1 
   빈(bean) : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트. 자바빈에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트. 
   빈 팩토리(bean factory) : 빈의 생성과 관계설정 등의 제어를 담당하는 IoC오브젝트.
   애플리케이션 컨텍스트(application context) : IoC방식을 따라 만들어진 일종의 빈팩토리. 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다. 설정 정보를 따로 받아와서 이를 활용하는 IoC엔진이라고 볼 수 있다.

싱글톤 레지스트리와 오브젝트 스코프

의존관계 주입(DI)

  • 의존관계 : 두 클래스 또는 모듈이 있을 때 한 쪽의 변화가 다른 쪽에 영향을 미치는 상황.
  • 의존관계 주입(DI)? : 의존관계 주입(Dependency Injection)이란 스프링에 사용된 제어의 역전(IoC) 방식을 조금 더 명확하게 나타내기 위해서 사용한 용어이다.
    • 의존관계 주입의 세 가지 조건
    1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
    2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
    3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.
  • DI의 장점 : DI를 받았을 경우 주입된 오브젝트를 인터페이스로 받는데 이렇게 하면 코드에 런타임 클래스와의 관계가 직접 드러나지 않기 때문에 주입시 주입하는 오브젝트를 바꿔주는 것으로 코드의 변경, 확장에 쉽게 대응할 수 있다.
  • 스프링에서의 DI
    • Bean : 스프링에서는 DI를 쉽게 하기 위해서 Bean을 이용하여 오브젝트를 관리한다.
    • Bean Factory : 런타임 시점에서 의존관계를 결정하기 위해 Bean Factory에서 Bean을 관리하고 오브젝트간의 관계를 맺어준다.
    • 의존관계 검색(Dependency Lookup) : 스프링의 DI방식을 이용하기 위해서는 DI를 받는 오브젝트가 반드시 Bean이어야 한다. 하지만 DL을 이용하면 Bean이 아닌 오브젝트에서도 의존관계를 설정할 수 있다.

XML을 이용한 설정

  • 스프링에서는 DI의존관계를 만들 때 직접적으로 코드를 수정하는 것 외에도 다양한 방식을 제공하고 있다. XML은 단순한 텍스트 파일이기 때문에 다루기 쉽고 추가적인 빌드작업이 필요하지 않다.
  • <bean> : @Bean이 붙은 자바 메소드에 대응한다.
    • <id>
    • <property>
    • <ref>

Spring/토비의스프링3