maven project 생성

maven이란, Apache사에서 만든 빌드툴로 pom.xml을 통해서 정형화된 빌드 시스템으로 프로젝트를 관리를 해준다. 즉, 전반적인 라이프 사이클을 관리한다.

사용하는 이유

  • 편리한 의존성 관리 : 프로젝트에 필요한 라이브러리 a를 받을 때, a가 의존하는 b, c 라이브러리도 받아야 하는 불편함을 빌드툴을 통해서 그에 필요한 모든 라이브러리를 자동으로 받아주는 기능 제공
  • 의존성 버전 관리 : 특정 라이브러리 버전을 변경시에 연관된 라이브러리의 버전충돌을 방지하여 함께 변경해주는 역할 수행

즉, 이러한 기능으로 의존성 라이브러리를 더욱더 편리하게 관리하게 해주고, 빌드 과정을 더 쉽게 해주어서 개발자가 더 편리하게 개발하도록 도와주는 빌드툴이다.

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>

DataBase

MyBatis

MyBatis란, 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 쉽게 도와주는 프레임워크로서 JDBC를 통해서 데이터베이스에 엑세스하는 작업을 캡슐화하고 쿼리실행, 매핑등을 지원하여 중복작업을 최소화 해줍니다. 또한, SQL쿼리들을 자바 코드와 분리하여 관리할 수 있는 장점이 있다.

SqlSessionFactory

데이터베이스의 연결과 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"
	/>

MapperInterface

이전에는 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();

root-context.xml

해당 설정파일에서 상위컨테이너에 대해서 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에 접근하여 빈 주입 받을 수 있음

이전에 작성해두었던 프로젝트 생성 순서 URL

참고

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

0개의 댓글