본문 바로가기

WEB/SPRING

토비의 스프링 7.1 SQL과 DAO의 분리

현재 UserDaoJdbc에 db에 관련된 sql이 문자열로 남겨져있다. 이 부분을 인터페이스와 xml을 이용해서 분리하려고 한다.

SqlService라는 인터페이스를 만들고 SimpleSqlService에서 getSql을 오버라이드하고 map필드를 만들어둔다.

xml로 map을 주입받으면 sql과 dao의 코드가 분리된다.

package spring.sql;

public interface SqlService {

    String getSql(String key);
}

 

 

package spring.sql;

import java.util.Map;

public class SimpleSqlService implements SqlService{

    private Map<String, String> sqlMap;

    public void setSqlMap(Map<String, String> sqlMap){
        this.sqlMap = sqlMap;
    }

    @Override
    public String getSql(String key) {
        String sql = sqlMap.get(key);
        if(sql == null)
            throw new SqlRetrievalFailureException(key + "에 대한 SQL을 찾을 수 없습니다.");
        else
            return sql;
    }
}

 

 

package spring.sql;

public class SqlRetrievalFailureException extends RuntimeException{

    public SqlRetrievalFailureException(String message){
        super(message);
    }

    public SqlRetrievalFailureException(String message, Throwable cause){
        super(message, cause);
    }
}

 

 

<bean id="userDao" class="spring.dao.UserDaoJdbc">
    <property name="dataSource" ref="dataSource"/>
    <property name="sqlService" ref="sqlService"/>

</bean>

<bean id="sqlService" class="spring.sql.SimpleSqlService">
    <property name="sqlMap">
        <map>
            <entry key="add" value="insert into users(id, name, password, level, login, recommend)
            values(?,?,?,?,?,?)" />
            <entry key="get" value="select * from users where id = ?" />
            <entry key="getAll" value=" select * from users order by id"/>
            <entry key="deleteAll" value="delete from users"/>
            <entry key="getCount" value="select count(*) from users" />
            <entry key="update" value="update users set name = ?, password = ?, level = ?, login = ?,
            recommend = ? where id = ? "/>
        </map>
    </property>
</bean>