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);
}
의존성 주입