[Spring] 끄적거리며 알아가는 Spring
1. 톰캣에의해 가장먼저 web.xml이 로딩됨.
* web.xml : 설정을 위한 파일 서버(톰캣)가 최초로 구동될때 이를 제일 먼저 읽고 설정을 구성함. 즉, 설정파일이라 할 수 있음.
2. web.xml에 있는 ContextLoaderListener는 ApplicationContext를 생성함.
=> LoadingTests에서의 테스트는 로딩이 정상적으로 되는지를 확인하기 위함. => 로딩이 되면 ApplicationContext를 생성하니 ApplicationContext객체가 Null이 아니라면 정상적으로 로딩된 것임(assertNotNull 이용하여 확인)
- in LoadingTests.java
1
2
3
4
5
6
7
8
|
@Autowired
private ApplicationContext ctx;
@Test
public void testCtx() {
log.info(ctx);
assertNotNull(ctx);
}
|
cs |
3. ContextLoaderListener는 root-context.xml을 로딩함.
4. root-context.xml에 등록되어있는 Spring Container가 구동됨. 이때 개발자가 작성한 비즈니스 로직과 DAO,VO객체들이 생성됨.
=> bean들을 생성하는 단계
=> web.xml -> root-context.xml을 호출하고 이때 위와같은 객체들을 생성하는데, (모두 빈들이라고 보면 될까?)
<bean 머시깽이로 시작하는 애들 말고
- mybatis-spring:scan > mybatis가 사용하는 mapper객체를 자바 빈으로 설정.(지정된 경로-mapper)
- context:component-scan > spring에서 의존성주입(@autowired)을 하기 위해선 applicationcontext.xml에 해당 클래스를 bean으로 등록해야 하는데, 그렇게 되면 클래스를 만들때마다 root-context.xml을 수정해야 하는 번거로움이 있음.
이때 스프링의 component-scan을 이용하여 autowired할 패키지의 경로를 설정해주면 자동으로 빈을 생성해준다.
autowired할 클래스에 어노테이션(@component)을 붙여주면 되는데, @Controller와 @service @repository같은 어노테이션들은 @component를 상속(?)하고 있기 때문에 저거 그냥 쓰면 된다.
in root-context.xml
class => return값같은거라고 보면 됨.
따라서 hikariConfig bean(id)은 HikariConfig를 생성
이거를 dataSource bean(id)이 가져다가 HikariDataSource를 생성
이거를 sqlSessionFactory bean(id)이 가져다가 SqlSessionFactoryBean을 생성
요게 다 의존성 주입임!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName"
value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/bitdb?serverTimezone=Asia/Seoul&useSSL=false">
</property>
<property name="username" value="bit04"></property>
<property name="password" value="1234"></property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
|
cs |
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
web.xml의 위의 부분은 Spring에 내장된 FrontController라고 볼 수 있음.
기존에 BasicController가 reflection을 통해 분기해주던 일을 저 FrontController가 자동으로 해준다고 보면 됨.
따라서 우리는 분기당할(?)컨트롤러들만 만들어 주면 된다.