public class Tweeter {
	public void tweet(String tweet) {
		TwitterApi api = new TwitterApi();
	}
}

public class TwitterApi {
	public void postTweet(String user, String tweet){
		OkHttpClient client = new OkHttpClient();
		Request request = // TODO build Post request...
		client.newCall(request).execute();
	}
}

Tweeter tweeter = new Tweeter();
tweeter.tweet("Hello, #Devoxx");

Tweeter 함수를 호출 할때마다 TwitterApi, okhttpclient등 객체들을 매번 만들어야 하는 문제점

Tweeter의 클래스는 Jakewharton 이란 이름 외에는 다른 이름으로 전송 할수가 어렵다 (재 사용하기 어렵다)

그래서 TwitterApi 란 클래스에서 OkHttpClient를 밖으로 빼내었다

// TwitterApi에 postTweet을 사용할때마다 OkHttpClient를 계속 생성 할 필요 없게 한다
public class TwitterApi{
	private final OkHttpClient client;

	public TwitterApi(OkHttpClient client) {
		this.client = client;
	}
	
	public void postTweet(String user, String tweet) {
		Request request = // TODO build POST request...
		client.newCall(request).execute();
	}
}

이렇게 외부에서 생성 하면 다양한 구현의 OkHttpClient를 만들수 있게 된다

의존성을 외부에서 주입한다 (DI)

public class Tweeter {
	private final TwitterApi api = new TwitterApi(new OkHttpClient());
	private final String user;
	
	public Tweeter(String user) {
	this.user = user;
	}

	public void tweet(String tweet) {
		api.postTweet("JakeWharton", tweet);
	}
}

twitterApi 에서 tweet이라는 함수를 호출할때 마다 매번 만들어 줄 필요가 없으니까 클래스의 property로 선언

user도 다른 사람 이름이 변경 할수 있게 생성자를 통해서 받고 property로 선언

Tweeter tweeter = new Tweeter("JakeWharton");
tweeter.tweet(Hello, #Devoxx 2014");
tweeter.tweet("#hungover #Dagger")
Timeline timeline = new Timeline("JakeWharton");
timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {  
  System.out.println(tweet);
}
public class Timeline {
    private final List<Tweet> cache = new ArrayList<>();
    private final TwitterApi api; //twitterApi 도 외부에서 주입 받게끔 만듬
    private final String user;

    public Timeline(TwitterApi api, String user){
        this.api = api;
        this.user = user;
    }
    public List<Tweet> get() {   }
    public void loadMore(int amount) {
  //blah blah 
	}
}
OkHttpClient client = new OkHttpClient(); // okhttpclient 만들어서
TwitterApi api = new TwitterApi(client); // twitterapi를 만들고
String user = "Jake Wharton";

Twetter tweeter = new Tweeter(api, user); // twitterApi와 user 를 각각 넣어준다
tweeter.tweet(Hello, #Devoxx 2014!");

Timeline timeline = new Timeline(api, user); // twitterApi와 user 를 각각 넣어준다
timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
    System.out.println(tweet);
}

의존성 주입