현재 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>
'WEB > SPRING' 카테고리의 다른 글
토비의 스프링 7.5 DI를 이용해 다양한 구현 방법 적용하기 (0) | 2024.02.16 |
---|---|
토비 스프링 7.2 인터페이스의 분리와 자기참조 빈 (0) | 2024.02.15 |
6.5 스프링 AOP (1) | 2024.02.10 |
토비의 스프링 6.1 트랜잭션 코드의 분리 (0) | 2024.02.06 |
토비의 스프링 5.2 트랜잭션 서비스 추상화 (0) | 2024.01.30 |