Tech/Web

[Spring] 끄적거리며 알아가는 Spring

소라소라잉 2019. 11. 7. 17:30

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&amp;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가 자동으로 해준다고 보면 됨. 

따라서 우리는 분기당할(?)컨트롤러들만 만들어 주면 된다.