UserDAO 의 작성 예시를 보여주겠다.
userDAO를 작성할떄 , 관심사가 같은것끼리 객체 안으로 모이게하고,
관심사가 다른것은 따로 떨어져서 서로 영향을 주지 않도록 분리한다.
[1-1] UserDAO 의 관심사항은
- 유저를 추가하는것, 유저를 검색하는것 ( 데이터 access 로직 구현 )
이외에도
- DB연결 ( DB, DB드라이버 등 ) 이 있다.
이때 , 연결및 DB에 대한 정보는 다를수 있으므로 protected 또는 abstract 매소드 로 지정해놓게 된다.
예시를 들겠다.
public abstract class UserDao {
public void add(User user) throws Exception {
Connection c = getConnection();
...
}
public void get(String id) throws Exception {
Connection c = getConnection();
...
}
protected SpecialGetPasswordById() throws Exception{
Exception;
} //protected함수는 override를 선택적으로 할 수 있다.( 템플릿메소드패턴)
public abstract Connection getConnection() throws Exception {
SQLException;
} //abstract를 사용했으므로 , 필히 override해주어야한다. ( 팩토리메소드패턴)
}
[1-2[ 상속을 사용한 확장의 한계
자바는 다중 상속이 불가능하므로, (상속을 사용한 클래스는 다른 클래스의 상속을 허용치않음) 이를 더 확장하는 방법은 없을까 ? 알아보도록 하겟다.
interface를 이용하여 DB connection 을 회사별로 관리해줄것이다.
public interface Connection{
Connecction newConnection();
}
public class EConnection implement Connection{
public Connection newConnection();
}
public abstract class UserDao{
Connection conn;
//DB접근 관련 관심 ( interface사용 with 매개변수를 통한 회사주입을 클라이언트가 할수 있도록 완벽한 관심 분리)
public UserDao(Connection connection){//생성자 에 connection을 매개변수로 넣어줘서 클라이언트가 원하는 회사를 입력할수 있게함.
this.conn = connection.newConnection();
}
//이아래부터는 유저관련 관심
public void add(User user){
Connection c =conn.newConnection();
}
public void delete(User user){
Connection c =conn.newConnection();
}
}
- 개방 폐쇄 원칙(OCP): 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다. 즉, UserDao는 DB 연결 방법에는 얼마든지 열려있지만 핵심 기능을 구현한 코드는 그런 변화에 영향을 받지 않는다.
- 낮은 결합도: 책임과 관심사가 다른 오브젝트 또는 모듈과는 낮은 결합도. 즉, 느슨하게 연결된 형태를 유지하는 것이 중요하다.
- ConnectionMaker 인터페이스의 도입으로 DB 연결 기능이 바뀌더라도 DAO의 코드는 변경될 필요가 없어졌다. 결합도가 낮아진 것.
'Spring' 카테고리의 다른 글
응답을 JSON<->XML 원하는것으로 자유자재로 보내주는 방법 (0) | 2020.05.12 |
---|---|
JSON 키,값 FOR문으로 쉽게 빼내기 (0) | 2020.05.10 |
jsp에서 한글이 깨지거나 @RequestParam등에서 깨질때 (0) | 2020.03.10 |
applicationContext.xml 이 없는경우 (0) | 2020.03.09 |
Controller 에서 Controller 로 보내는 방법 (0) | 2020.03.09 |