stage 0
/**
* UserServiceํด๋์ค์join๋ฉ์๋๋ ์ ์ ๋ฉ์๋๋ค.
*๊ฐ์ฒด์งํฅ์ ์ด์ง ์์ ์ฝ๋๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ๋ค.
* UserService๋UserDao์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์๋๋ฐ ์ด๋ ํ
์คํธํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
*ํ
์คํธDB๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฝ๋์ ๋ง์ ๋ถ๋ถ์ด ์์ ๋์ด์ผ ํ๋ค.
*/
Plain Text
๋ณต์ฌ
final var user = new User(1L, "gugu");
final var actual = UserService.join(user);
assertThat(actual.getAccount()).isEqualTo("gugu");
Java
๋ณต์ฌ
stage 1
/**
* 0๋จ๊ณ์ ์ฃผ์ ๋ฌธ์ ๋ ์ ์ ๋ฉ์๋๋ง ์์ด์ ํด๋์ค ๊ฐ์ ๋งค์ฐ ๊ธด๋ฐํ ๊ฒฐํฉ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ด๋ค.
*์ฐ๋ฆฌ๋ ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ํ์์ ๋ฐ๋ผ ๊ต์ฒดํ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ๋ค.
*๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ๊ต์ฒดํ ์ ์๋๋ก ๋ง๋ค์ด๋ณด์.
*/
Plain Text
๋ณต์ฌ
/**
*ํด๋์ค ๋ด๋ถ์์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ๋ง๊ณ ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ก ์์ ํ๋ค.
*์์ฑ์๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ก ์์ ํ๋ค.
*ํ์ง๋ง ์์ง๋ ํ
์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ค.
* UserDao๋ผ๋ ๊ตฌํ ํด๋์ค์ ์์กดํ๊ณ ์๋ค.
*์ ์ฐํ ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐํฉ์ ๊ฐ์์ํฌ ์ ์๋ค.
*/
Plain Text
๋ณต์ฌ
final var user = new User(1L, "gugu");
final var userDao = new UserDao();
final var userService = new UserService(userDao);
final var actual = userService.join(user);
assertThat(actual.getAccount()).isEqualTo("gugu");
Java
๋ณต์ฌ
stage 2
/**
*์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ท๋ค.
*์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉดtestAnonymousClassํ
์คํธ ์ผ์ด์ค์ฒ๋ผ ๊ฐ๋ฐ์๊ฐ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ค.
*ํ์ง๋ง ์์ง๋ ๋ฌธ์ ๊ฐ ์๋ค.
*์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋๊ตฐ๊ฐ๊ฐ ๊ฒฐ์ ํด์ค์ผ ํ๋ค.
*๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ด ํ์ํ๋ค.
*/
Plain Text
๋ณต์ฌ
void stage2() {
final var user = new User(1L, "gugu");
final UserDao userDao = new InMemoryUserDao();
final var userService = new UserService(userDao);
final var actual = userService.join(user);
assertThat(actual.getAccount()).isEqualTo("gugu");
}
Java
๋ณต์ฌ
void testAnonymousClass() {
// given
final var userDao = new UserDao() {
private User user;
@Override
public void insert(User user) {
this.user = user;
}
@Override
public User findById(long id) {
return user;
}
};
final var userService = new UserService(userDao);
final var user = new User(1L, "gugu");
// when
final var actual = userService.join(user);
// then
assertThat(actual.getAccount()).isEqualTo("gugu");
}
Java
๋ณต์ฌ
stage 3
DIContainer
โข
์คํ๋ง์ BeanFactory, ApplicationContext์ ํด๋น๋๋ ํด๋์ค
class DIContainer {
private final Set<Object> beans;
public DIContainer(final Set<Class<?>> classes) {
this.beans = Set.of();
}
@SuppressWarnings("unchecked")
public <T> T getBean(final Class<T> aClass) {
return null;
}
}
Java
๋ณต์ฌ
@SuppressWarnings ์ ๊ธฐ๋ฅ์?
/**
*๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์DIContainer๋ผ๋ ํด๋์ค์๊ฒ ๋งก๊ธฐ์.
* DIContainer๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ ์ค๊ณ๋ ์ญํ ์ ํ๋ค.
*์ด๋ค ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋์ง ์ ์ํ๋ ์ญํ ์ ํ๋ค.
*/
Plain Text
๋ณต์ฌ
/**
*์ ์ด์ ์ญ์ (IoC)
* stage2์์ ๊ฐ์ฒด๋ ๋ฅ๋์ ์ผ๋ก ์์ ์ด ์ฌ์ฉํ ํด๋์ค๋ฅผ ๊ฒฐ์ ํ๊ณ ,์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
* ํ์ง๋ง ์ ์ด์ ์ญ์ ์ด๋ผ๋ ๊ฐ๋
์ด ์ ์ฉ๋๋ฉด ๊ฐ์ฒด๋ ์์ ์ด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ณ ์์ฑํ์ง ์๋๋ค.
* ๋ชจ๋ ์ ์ด ๊ถํ์ ์์ ์ด ์๋ ๋ค๋ฅธ ๋์์๊ฒ ์์ํ๋ค.
* UserService๋DIContainer์๊ฒ ๋ชจ๋ ์ ์ด ๊ถํ์ ์์ํ ์ํ๋ค.
* DIContainer๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๊ณ๋ฅผ ์ค์ ํ๋๋ก ๊ตฌํํด๋ณด์.
*/
DIContainer๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ ๋น(bean) ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Plain Text
๋ณต์ฌ
ApplicationContext ๊ตฌํ์ฒด๋ก ๋ฑ๋ก๋๋ ํด๋์ค๋ AnnotationConfigServletWebServerApplicationContext
BeanFactory ๊ตฌํ์ฒด๋ก ๋ฑ๋ก๋๋ ํด๋์ค๋
DefaultListableBeanFactory