글 제목이 다소 길긴 하지만, 좋은 주제라고 본다.
[직접 관련 글]
1. [Spring-Framework] 38. Beans와 Context-XML 방식으로 DB 설정 - (Junit5), 2020-10-10
- https://yyman.tistory.com/1463
스프링 프레임워크의 Autowired 기능을 알게 된다면, 상당히 편하다는 것을 체감할 수 있을 것이다.
어노테이션 정의로 @Autowired 하나 적었을 뿐인데 자동으로 복잡하게 생성자 만들고, 불러오는 작업을 안 해도 되는 신기한 일들이 생긴다.
실질적인 코딩 작업할 때의 단점은 물론 오류가 잘 표기되지 않아서 적용이 되었는지 안 되었는지 모른다.
적용이 되면, 관련된 코드를 찍어보면 보이는데, 편리한 이면에는 이런 문제도 있을 수 있다.
어떤 사람은 좋다고 하고, 어떤 사람은 애매하다고 하고 관점이 워낙 다양하니깐 중략한다.
[참고]
* POM 설정, Project 설정의 (Java Compiler, Build Path, Project Factes), Oracle JDBC.jar 셋팅 작업 등 완료되어야 함.
38번 글로 가서 작업하고 오면, 작업을 따라할 수 있다.
1. 프로젝트 구성도
이전 38번 글(38. Beans와 Context-XML 방식으로 DB 설정 - (Junit5), 2020-10-10)의 내용에서 살짝 몇 가지만 해주면 끝난다.
암기가 안 되서 문제이지 셋팅 배경 원리는 똑같다.
그림 1. 프로젝트 구성도
2. root-context.xml(src/main/webapp/WEB-INF/spring/root-context.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<context:component-scan base-package="com.website.example" />
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- DataSource 설정 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- DataSource 셋팅 -->
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="${ORACLE_DB_URL}" />
<property name="user" value="${ORACLE_DB_USERNAME}"/>
<property name="password" value="${ORACLE_DB_PASSWORD}"/>
<property name="connectionCachingEnabled" value="true"/>
</bean>
<!-- Spring JDBC 설정 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.website.example.service.DBService..*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
</beans>
파일명: root-context.xml
[첨부(Attachments)]
root-context_orginal.zip (작업 따라하면서 실수 예방용 원본 파일)
3. HomeController.java(com/website/example)
package com.website.example;
import java.sql.Connection;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired
private DataSource dataSource; // 이게 끝임. (root-context.xml에서 클래스 셋팅을 불러와 버림.)
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
if ( dataSource != null ) {
System.out.println("야2");
}
try(Connection con = dataSource.getConnection()){
System.out.println("참");
}catch(Exception e)
{
//fail(e.getMessage());
System.out.println("거짓");
}
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
파일명: HomeController.java
[첨부(Attachments)]
4. 결과(Result)
Autowired를 경험할 수 있도록 구현한 것을 시연하였다.
영상 1. Spring Framework의 @Autowired 시연
* 맺음글(Conclusion)
Beans와 Context-xml 방식으로 DB설정하는 방법에 대해서 소개하였다.