메소드를 클래스로 추출

하나의 메소드 내에서 의미있는 단위의 로직을 추출해서 클래스로 캡슐화하는 방식

캡슐화한 클래스의 메소드를 직접 호출하는 방식으로 리팩터링

class Main {
	void method() {
		//do something
	}
}
class Delegator {
	 void doSomething() {
		//do something
	}
}

class Main {
	Delegator delegator = new Delegator();
	void method() {
		delegator.doSomething();
	}
}

책에서는 첫 번째로 UserDao 의 insert 로직을 InsertJdbcTemplate 클래스로 추출했음

템플릿 메소드 패턴

공통 기능을 상위 클래스에서 구현하고, 변화가 생기는 부분만 추상 메소드로 선언

// 계좌의 잔액을 확인하는 로직 및 단위는 구현 은행/국가 별로 다를 수 있다
abstract class Account {
	public Long printMoney() {
		return getMoney() + getUnit();
	}

// 잔액 반환
	abstract Integer getMoney();
// 화폐 단위 반환
	abstract String getUnit():
}

책에서는 쿼리를 PreparedStatement 로 변경하고, 쿼리를 실행하는 부분은 공통적인 로직으로 두고

createQuery(), setValues() 메소드는 추상메소드로 선언

  1. 생성하고자 하는 쿼리를 클라이언트에게 맡길 수 있다.
  2. 쿼리(PreparedStatement) 에 클라이언트가 선택한 값을 넣을 수 있다.

함수 내 익명 클래스의 지역 변수 사용

익명 클래스는 같은 스코프에 있는 변수값을 사용(참조)할 수 있다.

abstract class Person {
    abstract String getName();
} 

class Main {
    public void method(String name) {
        Person person = new Person() {
            @Override
            String getName() {
                return name;
            }
        };
    }
}