[Spring] ๋น์ ์ค์ ํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ - XML, JAVA, Component Scan
์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
์์ ์ฝ๋์ ํ์ํ ์์กด์ฑ์ ๋ฐ๊ธฐ ์ํด spring boot ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ์์ ์ฝ๋์๋ ์ด ์์กด์ฑ์ด ํ์ํ๋ค.
Spring Initializr๋ฅผ ์ ํํ๊ณ Next๋ฅผ ํด๋ฆญํ๋ค.
Group, Artifact, Name์ ์ ๋ ฅํ๊ณ Next๋ฅผ ํด๋ฆญํ๋ค.
Group์ ํจํค์ง๋ช ์ ์ ์ด์ค๋ค. (๋ณดํต ๋๋ฉ์ธ๋ช ์ ๋ค์ง์ด์..)
Web - Spring Web์ ๋ฃ๊ณ Next๋ฅผ ํด๋ฆญํ๋ค.
Finish๋ฅผ ํด๋ฆญํด์ ์ ๊ท ํ๋ก์ ํธ ์์ฑ์ ์๋ฃํ๋ค.
Spring boot ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์๋ค.
pom.xml์ ์ด์ด๋ณด๋ฉด spring boot 2.2.5 ๋ฒ์ ์ผ๋ก ๋ง๋ค์ด์ก์์ ํ์ธํ ์ ์๋ค.
์ฐ์ธก์ Maven์ ํด๋ฆญํ์ฌ maven ๋ทฐ๋ฅผ ์ด์ด๋ณด๋ฉด spring 5.2.4 ์์กด์ฑ์ด ๋ค์ด์จ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Spring boot 2.2์์๋ spring 5.2 ์์กด์ฑ์ด ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ด๋ค.
BookRepository, BookService ํด๋์ค๋ฅผ ์์ฑํ๋ค.
BookService.java
1
2
3
4
5
6
7
8
|
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
|
cs |
BookService๊ฐ BookRepository๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ค.
์ด์ ApplicationContext๋ก ๋ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํด๋ณด์.
1. ๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ - Spring Bean XML ์ค์ ํ์ผ
resources ํด๋์ 'application.xml' ์ด๋ฆ์ผ๋ก Spring Config XMl ํ์ผ์ ์๋ก ๋ง๋ ๋ค.
application.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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="bookService"
class="com.atoz_develop.springapplicationcontext.BookService"/>
<bean id="bookRepository"
class="com.atoz_develop.springapplicationcontext.BookRepository"/>
</beans>
|
cs |
<bean>์ ๋น์ ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค.
id, class ์์ฑ์ ํ์ ์์ฑ์ด๋ค.
id์ ๋น์ id๋ฅผ, class์ ๋น์ผ๋ก ๋ฑ๋กํ ํด๋์ค์ QName(ํจํค์ง๋ช ์ ํฌํจํ ์ ์ฒด ์ด๋ฆ)์ ์ ๋ ฅํ๋ค.
์ฌ๊ธฐ๊น์ง ์ค์ ํ ๋ด์ฉ์ BookService์ BookRepository๋ฅผ ๋น์ผ๋ก ๋ง๋ค๋ผ๋ ๊ฒ์ด๋ค.
BookService๊ฐ BookRepository ๋น์ ์ฃผ์ ๋ฐ์ ์ ์๋๋ก ์ค์ ์ ์ถ๊ฐํ๋ค.
application.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?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="bookService"
class="com.atoz_develop.springapplicationcontext.BookService">
<property name="bookRepository" ref="bookRepository"/>
</bean>
<bean id="bookRepository"
class="com.atoz_develop.springapplicationcontext.BookRepository"/>
</beans>
|
cs |
๋น ์ฃผ์ ์ ์ฃผ์ ๋ฐ์ ๋น์ <bean> ํ๊ทธ ํ์์ <property> ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์ค์ ํ๋ฉด ๋๋ค.
<property>์ name ์์ฑ์ ํ๋กํผํฐ(setter) ์ด๋ฆ์, ref ์์ฑ์๋ ์ฃผ์ ํ ๋น์ id๋ฅผ ์ง์ ํ๋ค.
๋ฑ๋กํ ๋น์ ApplicationContext๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค.
DemoApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
}
}
|
cs |
ClassPathXmlApplicationContext()์ classpath์ xmlํ์ผ์ ๋๊ฒจ ApplicationContext๋ฅผ ์์ฑํ๋ค.
ApplicationContext์ getBeanDefinitionNames()๋ IoC ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น์ id ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
์คํ ๊ฒฐ๊ณผ
ApplicationContext์ getBean()์ผ๋ก ๋น์ ๊บผ๋ผ ์ ์๋ค.
String ํ์ ํ๋ผ๋ฏธํฐ์ ๋น์ id๋ฅผ ๋๊ธด๋ค. (bookService, bookRepository)
DemoApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
|
cs |
ApplicationContext์์ bookService ๋น์ ๊บผ๋ด bookRepository๊ฐ null์ด ์๋์ง ํ์ธํด๋ด์ผ๋ก์จ ์์กด์ฑ ์ฃผ์ ์ด ์ ๋๋ก ๋๋์ง ์ ์ ์๋ค.
์คํ ๊ฒฐ๊ณผ
์๊น ์์ฑํ xml ์ค์ ํ์ผ์ ์ํด BookService๊ฐ BookRepository ๋น์ ์ฃผ์ ๋ฐ์ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋น์ <bean>์ผ๋ก ์ผ์ผ์ด ๋ฑ๋กํด์ค์ผํด์ ๊ต์ฅํ ๋ฒ๊ฑฐ๋กญ๋ค.
๊ทธ๋์ ๋ค์์ผ๋ก ๋ฑ์ฅํ ๊ฒ์ด component scan์ด๋ค.
application.xml์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค.
application.xml
1
2
3
4
5
6
7
8
9
|
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.atoz_develop.springapplicationcontext"/>
</beans>
|
cs |
์ ์ค์ ์ base-package์ ์ง์ ํ ํจํค์ง์์๋ถํฐ ๋ชจ๋ ํ์ ํจํค์ง๋ฅผ scanningํด์ ๋น์ ๋ฑ๋กํ๋๋ก ํ๋ค.
๋น์ฐํ ๋ชจ๋ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ ๊ฑด ์๋๊ณ @Component ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
@Component๋ฅผ ํ์ฅํ ๋ช๊ฐ์ง ์ ๋ ธํ ์ด์ ์ด ๋ ์๋๋ฐ ๊ทธ ์ค @Service, @Repository๊ฐ ์๋ค.
๊ทธ๋ฌํ @Component๋ฅผ ํ์ฅํ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
BookService.java
1
2
3
4
5
6
7
8
9
10
11
|
import org.springframework.stereotype.Service;
@Service
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
|
cs |
BookRepository.java
1
2
3
4
5
|
import org.springframework.stereotype.Repository;
@Repository
public class BookRepository {
}
|
cs |
์ด๋ ๊ฒ BookService์ BookRepository ํด๋์ค์ ๊ฐ๊ฐ @Service, @BookRepository ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
๊ทธ๋ฌ๋ฉด ๋ ํด๋์ค๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
์์กด์ฑ ์ฃผ์ ์ @Autowired ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
BookService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
|
cs |
BookService.java์ BookRepository ๋ณ์์ @Autowired๋ฅผ ๋ถ์ฌ์ฃผ์.
์ด์ ๋น ๋ฑ๋ก๊ณผ ์์กด์ฑ ์ฃผ์ ์ ์ํ ์ค์ ์ด ๋ชจ๋ ์๋ฃ๋์๋ค.
main()์ ์คํํด๋ณด๋ฉด ์ด์ ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
application.xml์ ์ผ์ผ์ด ์ค์ ํ๋ ๋์ ์ ๋ ธํ ์ด์ ์ scanningํด์ ๋น์ ๋ฑ๋กํ๊ณ ์์กด์ฑ ์ฃผ์ ํ๋๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
๐ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ๋น ๋ฑ๋ก ๋ฐ ์ค์ ์ spring 2.5๋ถํฐ ์ถ๊ฐ๋์๋ค.
2. JAVA ์ค์ ํ์ผ์ ์ฌ์ฉ
์์์ ์์ฑํ application.xml๊ณผ ๊ฐ์ XML ํ์ผ์ด ์๋ java๋ก๋ ์ค์ ํ์ผ์ ๋ง๋ค ์ ์๋ค.
ApplicationConfig ํด๋์ค๋ฅผ ์๋ก ๋ง๋ ๋ค.
ApplicationConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}
}
|
cs |
Java ์ค์ ํ์ผ์ ๋ง๋ค๋ ค๋ฉด @Configuration์ ๋ถ์ฌ์ฃผ๊ณ ๋น์ผ๋ก ๋ฑ๋กํ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
๋ฉ์๋๋ช ์ด ๋น id, ๋ฆฌํด ํ์ ์ด ๋น ํ์ , ๋ฆฌํดํ ๊ฐ์ฒด๊ฐ ๋น ๋ ํผ๋ฐ์ค๊ฐ ๋๋ค.
์์กด์ฑ์ ์ง์ setter๋ฅผ ํธ์ถํด์ ์ฃผ์ ํด์ค๋ค.
DemoApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
// ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
|
cs |
Java๋ก ๋ง๋ ์ค์ ํ์ผ์ AnnotationConfigApplicationContext()์ class๋ฅผ ๋๊ฒจ์ ์ฌ์ฉํ ์ ์๋ค.
๐ AnnotationConfigApplicationContext๋?
์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ๋น config๋ฅผ ์ฌ์ฉํ๋ ApplicationContext ๊ตฌํ์ฒด์ด๋ค.
๊ธฐ์กด์ ๋ถ์ด์๋ @Service, @Repository, @Autowired๋ฅผ ์ญ์ ํ๊ณ ์คํํด๋ณด์.
์ญ์ ์คํ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
Java ์ค์ ํ์ผ์์ ์ง์ setter๋ฅผ ํธ์ถํ์ง ์๊ณ @Autowired๋ฅผ ๋ถ์ฌ์ ์์กด์ฑ์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
ApplicationConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
return new BookService();
}
}
|
cs |
BookService.java
1
2
3
4
5
6
7
8
9
10
11
|
import org.springframework.beans.factory.annotation.Autowired;
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
|
cs |
Java ์ค์ ํ์ผ์์ ์ง์ setter๋ฅผ ํธ์ถํด์ ์์กด ๊ด๊ณ๋ฅผ ์ฎ์ด์ฃผ์ง ์์๋ @Autowired ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ์์กด์ฑ ์ฃผ์ ์ด ๋๋ค.
3. JAVA ์ค์ ํ์ผ + Component Scan
์ ๋ฐฉ๋ฒ์ XML ์ค์ ํ์ผ์์ component scan์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ฒ๊ฑฐ๋กญ๋ค.
๊ทธ๋์ Java ์ค์ ํ์ผ์์๋ component scan์ ์ฌ์ฉํ ์ ์๋ค.
ApplicationConfig.java
1
2
3
4
5
6
7
8
|
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
//@ComponentScan(basePackages = "com.atoz_develop.springapplicationcontext")
@ComponentScan(basePackageClasses = ApplicationConfig.class) // ๋ type safeํ ๋ฐฉ๋ฒ
public class ApplicationConfig {
}
|
cs |
Java ์ค์ ํ์ผ ํด๋์ค์ @ComponentScan ์ ๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค.
Scan์ ์์ํ๋ ํจํค์ง๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก basePackages์ basePackagesClasses์ ๋ ๊ฐ์ง ์์ฑ์ ์ฌ์ฉํ ์ ์๋๋ฐ basePackages์๋ ํจํค์ง ์ด๋ฆ์ ๋ฌธ์์ด๋ก, basePackagesClasses์๋ scan์ ์์ํ ์์น์ ํด๋์ค๋ฅผ ์ง์ ํ๋ค.
basePackagesClasses๊ฐ ๋ type safeํ ๋ฐฉ๋ฒ์ด๋ค.
๋ค์ BookService์ BookRepository์ @Service, @Repository ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
์ด๋ ๊ฒ ์ค์ ํด์ฃผ๋ฉด XML ์ค์ ํ์ผ์์ <context:component-scan...>์ ์ค์ ํ ๊ฒ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋ค.
์ด๋ ๊ฒ java ์ค์ ํ์ผ์ @ComponentScan ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ ์ค์ ํ๋ ๊ฒ์ด spring boot ๊ธฐ๋ฐ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฐฉ๋ฒ์ด๋ค.
์ญ์ ์คํ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
๐ ์ง๊ธ๊น์ง ApplicationContext๋ฅผ ์ง์ ๋ง๋ค์๋๋ฐ spring์ ApplicationContext๋ฅผ ์์์ ๋ง๋ค์ด์ค๋ค.
๋ํ java ์ค์ ํ์ผ๋ก ๋ง๋ค์๋ ApplicationConfig.java ๊ฐ์ ํ์ผ๋ spring boot๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ์์ฑํ ํ์๊ฐ ์๋ค.
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ์
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @Autowired ๋์ ์๋ฆฌ - BeanPostProcessor (0) | 2020.03.01 |
---|---|
[Spring] @Autowired์ ๋ค์ํ ์ฌ์ฉ ๋ฐฉ๋ฒ - required, Primary, Qualifier (0) | 2020.03.01 |
[Spring] ์ ์๋ฐ ๊ฐ์ฒด๋ฅผ IoC ์ปจํ ์ด๋์ ๋น์ผ๋ก ๋ง๋ค๊น? (0) | 2020.03.01 |
[Spring] ์คํ๋ง PSA (0) | 2020.03.01 |
[Spring] ์คํ๋ง AOP ๊ฐ๋ ์ดํด ๋ฐ ์ ์ฉ ๋ฐฉ๋ฒ (4) | 2020.02.29 |
๋๊ธ