Today I Learned_230221
토비의 스프링 3.1
DB에 접근하는 DAO
JDBC를 이용해 작업하는 순서
- DB Connection 가져옴
- SQL 담은 statement 생성 후 실행
- 실행 결과를 ResultSet으로 받아 정보를 저장
- 작업중에 생성된 자원 반환
- 예외 처리
public class UserDao {
public void add(User user) throws ClassNotFoundException, SQLException { //예외는 메소드 밖으로 던지기
Class.forName("drive name");
Connection c = DriverManager.getConnection("DB Connection info");
PreparedStatement ps = c.prepareStatement("insert하는 sql문");
ps.executeUpdate(); //sql 실행
//자원 반환
ps.close();
c.close();
}
public User get(String id) throws ClassNotFoundException, SQLException {
Class.forName("drive name");
Connection c = DriverManager.getConnection("DB Connection info");
PreparedStatement ps = c.prepareStatement("select하는 sql문");
// sql 실행
ResultSet rs = ps.executeQuery();
rs.next();
User user = new User();
user.setId("rs에서 가져온 결과값");
//자원 반환
rs.close();
ps.close();
c.close();
return user;
}
}
코드를 검증하는 방법 → main 등을 통해 오브젝트 스스로 자신을 검증하도록 만들면 된다.
위 코드는 잘 돌아가는 것 처럼 보이지만, 사실은 그렇지 않다.
관심사의 분리
- 관심이 같은 것 끼리는 하나의 객체로 모으고, 관심이 다른 것 끼리는 서로 영향을 주지 않도록 분리
- 변화는 대체로 집중된 한 가지 관심에 대해 일어나지만 그에 따른 작업이 집중되지 않는 것을 막아야 함
-
CCP(공통 폐쇄 원칙) : 동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라.
- 위 코드의 경우 DB 커넥션 설정, statement 바인딩, 자원 반환이 중복된다.
- 관심사가 중복되어있고 흩어져 있으면 변경하기 어렵다.
중복 코드의 메소드 추출
- 위의 코드에서 커넥션을 맺는 부분을 getConnection()이라는 별도의 메소드로 만든다.
- DB와 관련된 부분에 변경이 일어났을 경우, 한 메소드만 수정하면 된다.
- 리팩토링 : 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업
- 메소드 추출 : 리팩토링의 한 방법. 겉으로 드러나는 기능은 그대로이지만 코드 구조와 구현 방법을 바꾸는 것.
상속을 통한 확장
- 위와 같은 DB 솔루션을 판매한다고 하면…
- MySQL에 종속되어있는데 다른 회사에서는 Oracle을 쓰고 싶다.
- getConnection()을 추상 메소드로 만들어 놓고, 상속을 통해 서브클래스로 분리하여 사용
- 상속을 통해 성격이 다른 관심사항을 분리한 코드를 만들어내고, 서로 영향을 덜 주도록 해야 한다.
- 확장의 문제점
- 자바는 다중상속을 허용하지 않음
- 상속을 통한 클래스의 관계는 밀접 - 변경에 유연하지 못하다.