Today I Learned_230221

1 분 소요

토비의 스프링 3.1

DB에 접근하는 DAO

JDBC를 이용해 작업하는 순서

  1. DB Connection 가져옴
  2. SQL 담은 statement 생성 후 실행
  3. 실행 결과를 ResultSet으로 받아 정보를 저장
  4. 작업중에 생성된 자원 반환
  5. 예외 처리
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()을 추상 메소드로 만들어 놓고, 상속을 통해 서브클래스로 분리하여 사용
  • 상속을 통해 성격이 다른 관심사항을 분리한 코드를 만들어내고, 서로 영향을 덜 주도록 해야 한다.
  • 확장의 문제점
    • 자바는 다중상속을 허용하지 않음
    • 상속을 통한 클래스의 관계는 밀접 - 변경에 유연하지 못하다.

카테고리:

업데이트: