๋ฐฐ๊ฒฝ ์ง์ ๊ฐ์
์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง๋น
์ปจํ ์ด๋
์คํ๋ง ์ปจํ ์ด๋์ ๋น์ ๋ฑ๋กํ๊ธฐ ์ํด์๋ Configuration์ด ํ์ํ๋ค.
- XML
- Annotation ๊ธฐ๋ฐ์ configuration
- java bean configuration
XML๋ก Configuration ์ค์ ํ๋ ์์
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userRepository" class="nextstep.helloworld.core.xmlConfig.UserRepository"/>
<bean id="userService" class="nextstep.helloworld.core.xmlConfig.UserService">
<property name="userRepository" ref="userRepository"/>
</bean>
</beans>
- userRepository์ userService๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํจ
ApplicationContext context = new ClassPathXmlApplicationContext("application-config.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
ClassPathXmlApplicationContext
๋ก ํด๋น XMLํ์ผ์ ๋ก๋ํด์จ๋ค.getBeanDefinitionNames()
: ๋ฑ๋ก๋ ๋น์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค.
java bean configuration
ํ์ต ํ ์คํธ ์ฝ๋
class JavaConfigTest {
@Test
void javaConfig() {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloApplication.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
AuthService authService = context.getBean(AuthService.class);
assertThat(authService).isNotNull();
}
}
- HelloApplication ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฑ๋ก์ ํ ๊ฒ์ด๋ค.
AuthenticationPrincipalConfig
// Java-based Configuration์ ํ๊ธฐ ์ํ ํด๋์ค๋ก ์ง์ ํ๊ธฐ
@Configuration
public class AuthenticationPrincipalConfig {
// AuthService ๋น์ ๋ฑ๋กํ๊ธฐ
@Bean
public AuthService authService() {
return new AuthService();
}
// AuthenticationPrincipalArgumentResolver๋ฅผ ๋น ๋ฑ๋กํ๊ณ authService์ ๋ํ ์์กด์ฑ์ ์ฃผ์
ํ๊ธฐ
@Bean
public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() {
return new AuthenticationPrincipalArgumentResolver(authService());
}
}
@Configuration
: ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์๋ ํด๋์ค๊ฐ ๋๋ค.@Bean
๊ณผ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ ์ ์๋ค.- ๋น๋ค์ ์์กด์ฑ ๋ํ ์ง์ ๋งบ์ด์ค ์ ์๋ค.
@Configuration ํด๋์ค๋ ๋น ๋ฑ๋ก์ด ๋๋์?
๐โโ๏ธ
@Configuration ํด๋์ค์ ๋ฉ์๋ ์์์ ๋น ๋ฑ๋ก ์์๋ ์๊ด์ด ์๋์?
๐โโ๏ธ
@Test
void useSpringBean() {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloApplication.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
AuthService authService = context.getBean(AuthService.class); // ์ฑ๊ธํค // new AuthService()์ด๋๊น
AuthenticationPrincipalArgumentResolver resolver = context.getBean(AuthenticationPrincipalArgumentResolver.class);
assertThat(resolver.getAuthService()).isEqualTo(authService);
}
resolver์ ์๋ AuthService ๊ฐ์ฒด์ ๋น์ผ๋ก ๋ฑ๋ก๋ AuthService๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ๊ฐ?
๐โโ๏ธ
์ธ๋ถ ํ์ผ์ ๊ฐ์ ์ด์ฉํ๊ธฐ
properties ํ์ผ ์ ๊ทผ
// Java-based Configuration์ ํ๊ธฐ ์ํ ํด๋์ค๋ก ์ง์ ํ๊ธฐ
// application.properties ํ์ผ์ ํ์ฉํ๊ธฐ ์ํ ์ค์ ์ถ๊ฐํ๊ธฐ
@Configuration
@PropertySource("classpath:application.properties")
public class PropertySourceConfig {
private final Environment env;
public PropertySourceConfig(Environment env) {
this.env = env;
}
// application.properties์ security-jwt-token-secret-key ๊ฐ์ ํ์ฉํ์ฌ JwtTokenKeyProvider๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ
@Bean
public JwtTokenKeyProvider jwtTokenKeyProvider() {
return new JwtTokenKeyProvider("security-jwt-token-secret-key");
}
}
- Environment ๋ผ๋ ํ๋๊ฐ ์๋ค.
@Test
void key() {
ApplicationContext context = new AnnotationConfigApplicationContext(PropertySourceConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
JwtTokenKeyProvider jwtTokenKeyProvider = context.getBean(JwtTokenKeyProvider.class);
assertThat(jwtTokenKeyProvider.getSecretKey()).isEqualTo("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1MTYyMzkwMjJ9.ih1aovtQShabQ7l0cINw4k1fagApg3qLWiB8Kt59Lno");
}
PropertySourceConfig
ํด๋์ค๋ก ์ปจํ ์คํธ๋ฅผ ๋ง๋ ๋ค.- ์ฌ์ค ์ด properties๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ ๊ทผํ ์๋ ์๋ค.
@Value ์ฃผ์
// ์ปดํฌ๋ํธ ์ค์บ์ ํตํ ๋น ๋ฑ๋ก
@Component
public class JwtTokenExpireProvider {
// application.properties์ security-jwt-token-expire-length ๊ฐ์ ํ์ฉํ์ฌ validityInMilliseconds๊ฐ ์ด๊ธฐํ ํ๊ธฐ
private long validityInMilliseconds;
public JwtTokenExpireProvider(@Value("${security-jwt-token-expire-length}") long validityInMilliseconds) {
this.validityInMilliseconds = validityInMilliseconds;
}
public long getValidityInMilliseconds() {
return validityInMilliseconds;
}
}
// Java-based Configuration์ ํ๊ธฐ ์ํ ํด๋์ค๋ก ์ง์ ํ๊ธฐ
// application.properties ํ์ผ์ ํ์ฉํ๊ธฐ ์ํ ์ค์ ์ถ๊ฐํ๊ธฐ
// nextstep.helloworld.core.environment ๋ด์ ์๋ ์คํ๋ง ๋น์ ์ค์บํ๊ธฐ
@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan("nextstep.helloworld.core.environment")
public class ValueConfig {
}
ํ๊ฒฝ์ ๋ฐ๋ผ properties ์ค์ ์ด ๊ฐ๋ฅํ๊ฐ์?
๐โโ๏ธ ํ๊ฒฝ์ ๋ง๊ฒ deployํ๊ธฐ - profile
์คํ๋ง ์ปจํ ์ด๋ ์ค์ ๋ฐฉ๋ฒ ํ์คํ ๋ฆฌ
์ปจํ ์ด๋ ์ค์ ์ ํ ๋๋ ๋ฉํ์ ๋ณด๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค.
๋งจ ์ฒ์์๋ XML๊ธฐ๋ฐ์ผ๋ก ์งํ๋์๋ค.
์ด๋ฌ๋ฉด ํ๋ก๋์
์ฝ๋์ ์์กด ๊ด๊ณ, ๋น ๋ฑ๋ก ์ ๋ณด๋ฅผ ๋ถ๋ฆฌํ ์ ์์๋ค.
์ดํ ์ด๋
ธํ
์ด์
๊ธฐ๋ฐ์ด ๋ฑ์ฅํ๋ฉด์ XML๊ณผ ํผ์ฉํ์ฌ ์ฌ์ฉํ์๋ค.
๋ฑ๋กํ ๋น๋ค์ ์ด๋
ธํ
์ด์
์ผ๋ก ๊ด๋ฆฌํ์๋ค.
Spring 3.0๋ถํฐ๋ Java Bean ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฃจ์ด์ก๋ค.
XML๋ก ๊ด๋ฆฌํ๋ ๋ด์ฉ๋ค์ Bean ๋ฑ๋ก์ ํตํด ๊ด๋ฆฌํ์๋ค.
Auto Configuration?
- jar dependency ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ์ค์ ํด์ค๋ค.
๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์์๋๋ฐ๋, DB ๋ฑ์ ๊ด๋ จํ ๊ฒ๋ค์ ๋ง์ ๊ป ์ธ ์ ์์๋ค.
๊ทธ ์ด์ ๋ @SpringBootApplication
์ ์๋ @EnableAutoConfiguration
๋๋ถ์ด๋ค.
์ปจํ ์คํธ๋ฅผ ๋ก๋ํ๋ฉด ์ด์ ๋์ AutoConfiguration๋ค์ด ๋ฑ๋ก๋๋ค.
ex) jdbcTemplate์ ์์ฑํด์ฃผ์ง ์์๋๋ฐ๋ ์๋์ผ๋ก ์ฃผ์ ๋๋ค.
๋น์ผ๋ก ๋ฑ๋ก๋์ง ์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ ์ผํ๋๋ฐ ๋์ง ์๋ ์ด์ ๋?
@ConditionalOnClass
๋๋ถ์ด๋ค.
- DataSource, JdbcTemplate์ด ๋ก๋๊ฐ ๋๋ฉด ๋์ํ๋ค.
H2ConsoleAutoConfiguration
h2 DB์ค์ ์ ํด์ฃผ์ง ์์๋๋ฐ๋ h2์ ๊ด๋ จ๋ ์ค์ ์ด ์๋์ผ๋ก ๋๋ค.
์ด๊ฒ๋ ์ด๋ฏธ ๋ฑ๋ก๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.