maven이란, Apache사에서 만든 빌드툴로 pom.xml을 통해서 정형화된 빌드 시스템으로 프로젝트를 관리를 해준다. 즉, 전반적인 라이프 사이클을 관리한다.
사용하는 이유
즉, 이러한 기능으로 의존성 라이브러리를 더욱더 편리하게 관리하게 해주고, 빌드 과정을 더 쉽게 해주어서 개발자가 더 편리하게 개발하도록 도와주는 빌드툴이다.
pom.xml을 통하여 메이븐 프로젝트에 대한 설정을 관리한다.
<modelVersion>4.0.0</modelVersion>
<groupId>kr.or.ddit</groupId>
<artifactId>Airport80</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<properties>
<java-version>1.8</java-version>
<com.fasterxml.jackson-version>2.15.2</com.fasterxml.jackson-version>
<org.apache.logging.log4j-version>2.20.0</org.apache.logging.log4j-version>
<org.slf4j-version>1.7.36</org.slf4j-version>
<org.springframework.security-version>5.8.4</org.springframework.security-version>
<org.springframework-version>5.3.28</org.springframework-version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>
</plugins>
</build>
MyBatis란, 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 쉽게 도와주는
프레임워크로서JDBC를 통해서 데이터베이스에 엑세스하는 작업을 캡슐화하고 쿼리실행, 매핑등을 지원하여 중복작업을 최소화 해줍니다. 또한, SQL쿼리들을 자바 코드와 분리하여 관리할 수 있는 장점이 있다.
데이터베이스의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체로
DataSource를 참조하여SqlSession을 만들고, 쿼리를 실행해주는 역할을 수행한다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:kr/or/ddit/db/mybatis/Configuration.xml"
p:typeAliasesPackage="kr.or.ddit.**.vo"
p:mapperLocations="classpath:kr/or/ddit/db/mybatis/mapper/**/*.xml"
/>
이전에는 SqlSessionTemplate을 통하여 DAO클래스를 직접 구현하고, 쿼리문을 수행하였지만,
MapperInterface는 MyBatis 3.0버전으로, DAO클래스를 생략하고 Mapper.xml파일과 DAO인터페이스를 직접 연결해주는 방식이다. 이를 위해서 인터페이스의 패키지경로를 등록해야 한다.
<mybatis-spring:scan base-package="kr.or.ddit.**.dao"
annotation="org.apache.ibatis.annotations.Mapper"
factory-ref="sqlSessionFactory"
/>
위의 코드를, 통해서 경로안에서 인터페이스에 @Mapper어노테이션을 붙이게 되면 이를 스캔하여 컨테이너에 빈으로 등록해준다.
/**
* 운항일지 관리 퍼시스턴스 레이어
*/
@Mapper
public interface FlightLogDAO {
/**
* 전체 레코드 수 조회
*
* @param paging
* @return 전체 레코드 수
*/
public long selectTotalRecord();
해당 설정파일에서 상위컨테이너에 대해서 contoller를 제외한 어노테이션에 대해서 빈으로 등록할 수 있도록 설정해준다. 또한, 상위컨테이너를 다루는 곳에서 필요한 빈 등록은 이곳에서 할 수 있도록 한다.
<context:component-scan
base-package="kr.or.ddit">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
<bean id="passwordEncoder" class="org.springframework.security.crypto.factory.PasswordEncoderFactories"
factory-method="createDelegatingPasswordEncoder"
/>
이를 구분하는 이유는 각자의 역할에 따라서 빈 설정을 다른곳에서 하여서 애플리케이션의 유연성을 높이고 유지보수를 용이하게 하기 위해서이다.
상위컨테이너(root)에서는 애플리케이션 전반에 관련된 빈들을 설정한다. 예를 들어, 데이터베이스 연결, 보안설정, 서비스 계층 빈 등이 있다.
하위컨테이너는 웹계층에 필요한 빈들을 설정한다. 예를 들어, 컨트롤러, 인터셉터 등과 같이 웹계층에서 필요한 빈들을 설정한다.
이렇게 분리함으로써, 각각을 독립적으로 테스트 및 유지보수가 가능해지고, 다른 계층에 미치는 영향을 최소화 할 수 있다.
이렇게 만들어진 상위 컨테이너 설정파일을 web.xml에
Root WebApplicationContext로 등록을 해준다.
반대로 webapp 밑에 웹과 관련된 빈들을 설정하는 servlet-context.xml을 만들고 ServletDispatcher에 대한 설정을 등록해주기
<context:component-scan base-package="kr.or.ddit" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
자식컨테이너는 Root WebApplicationContext에 접근이 가능하고, 여러개를 만들 수 있다. 상위 컨테이너에 대해서 여러 자식 컨테이너를 만들고 사용할 수 있다는 것이다.
ServletWebApplicationContext : 자식컨테이너로 웹과 관련된 빈들을 관리하고 필요한 빈에 대해서 RootWebApplicationContext에 접근하여 빈 주입 받을 수 있음

Maven 이란?
[MyBatis] MyBatis란? 개념 및 데이터구조
[Spring] 6.MyBatis설정-SqlSessionFactory
SqlSessionTemplate
dispatcher servlet 이미지 주소