Spring Legacy 프로젝트 기초

🥔김감자🥔·2022년 9월 4일
0

Spring

목록 보기
3/3

기본적인 Spring legacy프로젝트는 2개의 context가 존재하며, 가장 보편적이다.
1. root-context.xml : DB, 보안 관련 등 공용으로 사용하는 빈 등
2. servlet-context.xml : servlet 관련 빈 등

root-context 하나에 servlet-context가 여러개 붙는 형식도 가능하다. 이유는 root-context의 빈들을 servlet-context의 빈에서 참조할 수 있기 때문이다. root-context가 먼저 생성되기 때문에 반대의 경우는 허용되지 않는다.

*root-context 설정파일의 위치는 web.xml에서 확인할 수 있다.

<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
  • web.xml에서 볼 수 있는 servlet-context관련 코드
    '/' 로 들어오는 모든 접근을 DispatcherServlet에서 처리한다.

Servlet-context.xml

<annotation-driven />

porm.xml

  1. lombok 의존 : boilerplate 대신 작성
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>
  1. spring-jdbc, mybatis, dbcp, ojdc8 의존
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- Database Connection Pool -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>21.1.0.0</version>
        </dependency>

DB연결하기

  1. porm.xml에 spring-jdbc, mybatis, dbcp, ojdc8 의존 확인
  2. root-context.xml에서 datasource빈 등록
	<context:property-placeholder location="classpath:datasource.properties"/> // properties 위치 명시
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${datasource.driverClassName}"/>
		<property name="url" value="${datasource.url}"/>
		<property name="username" value="${datasource.username}"/>
		<property name="password" value="${datasource.password}"/>
	</bean>

3.datasource.properties 작성

    datasource.driverClassName = oracle.jdbc.OracleDriver
    datasource.url = jdbc:oracle:thin:@localhost:1521:xe
    datasource.username = 
    datasource.password = 
  • 충돌 방지 차원에서 namespace의 key값은 2단계 이상으로 설정해야한다.
  1. root-context.xml에서 mybatis SqlSessionFactoryBean, SqlSessionTemplate 빈 등록
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath*:mapper/**/*-mapper.xml"/>
		<property name="configLocation" value="classpath:mybatis-config.xml"/>
	</bean>
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactoryBean" index="0"/>
	</bean>
  • SqlSessionTemplate는 SqlSession인터페이스 구현체이다. Dao구현클래스에 DI되어 실행됨.
  1. mybatis-config.xml설정
	<settings>
    <setting name="jdbcTypeForNull" value="NULL"/> <!-- null데이터 전달시 그대로 null로 대입 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 카멜케이스 형식으로 변환해줌 -->
  </settings>
  
  <typeAliases>  		
    <!-- <typeAlias type="com.kh.app.student.model.dto.Student" alias="student" 또는/> -->
    <package name="com.kh.spring"/> <!-- 하위 클래스를 모두 소문자로 등록해줌 -->
  </typeAliases>
  1. Dao 구현클래스와 mapper 연결
    5-1. Dao 구현 클래스 사용
  • @repository작성, SqlSessionTemplate sqlSession 을 @Autowired로 연결
  • return sqlSession.insert("namespace.메소드 이름", 전달할 값)
  • mapper의 namespace는 "단어"작성

5-2. Mapper 인터페이스 방식(Dao 구현 클래스 사용X)

  • 인터페이스에 @Mapper 작성
  • mapper의 namespace를 Dao 인터페이스의 풀네임으로 작성
  • root-context.xml에 Dao 구현 객체를 동적으로 생성하기 위한 코드 작성
<mybatis-spring:scan base-package="com.kh.**.dao"/>

5-3. Mapper를 사용하지 않는 방식

  • 메소드 위에 @insert, @select 등의 어노테이션 후 ("쿼리")를 작성
  1. String[]와 varchar2를 위한 typeHandler작성
  • common 패키지에 TypeHandler클래스 생성(BaseTypeHandler<변환하려는 타입> 상속)
  • @MappedTypes(자바타입.class), @MappedJdbcTypes(JdbcType.바꿀 타입) 작성

6-1. 오버라이드 메소드 작성

  • String[] -> varchar2 : parameter가 null인 경우는 호출되지 않는다.
// setter
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType)
			throws SQLException {
		String value = String.join(",", parameter); // C, Java, 
		ps.setString(i, value);
	}
  • varcahr2 -> String[]
// resultSet 관련 getter
	@Override
	public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
		String value = rs.getString(columnName);
		return value != null ? value.split(",") : null;
	}
	
	@Override
	public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		String value = rs.getString(columnIndex);
		return value != null ? value.split(",") : null;
	}
	
	// 프로시저 관련 getter
	@Override
	public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		String value = cs.getString(columnIndex);
		return value != null ? value.split(",") : null;
	}

6-2. mybatis-config.xml에 TypeHandler 등록하기

  <typeHandlers>
<!-- 	<typeHandler handler="com.kh.spring.typehandler.StringArrayTypeHandler"/> 또는   -->
	<package name="com.kh.spring.common.typehandler"/>
  </typeHandlers>
profile
감자를 캐자 감자를 캐자

0개의 댓글

관련 채용 정보