maven > ojdbc8 추가를 한다.
private NoticeService noticeService;
public void setNoticeService(NoticeService noticeService) {
this.noticeService = noticeService;
}
<bean id="noticeService" class="com.newlecture.web.service.NoticeService" />
<bean name="/notice/list" class="com.newlecture.web.controller.notice.ListController" >
<property name="noticeService" ref="noticeService" />
</bean>
위와 같이 Controller 객체가 Service 객체를 set할 수 있게 한다.
xml 태그를 살펴보면 bean의 name태그는 요청이 오는 uri 이고
id 태그는 내부에서 참조하는 이름임을 알 수 있다.
ref태그는 대상이 참조형일때 사용한다
property name은 해당 대상을 set한다.
따라서 객체를 DI 받고자 하는 곳에 해당 대상을 담을 수 있는 setter가 있어야 한다.
위는 결합력이 강한 경우이다
결합력을 interface의 다형성을 이용해서 낮추도록 하자
위와 같이 package 구성후
public interface NoticeService {
public List<Notice> getList(int page, String field, String query);
int getCount() throws ClassNotFoundException, SQLException;
int insert(Notice notice) throws ClassNotFoundException, SQLException;
int update(Notice notice) throws ClassNotFoundException, SQLException;
int delete(int id) throws ClassNotFoundException, SQLException;
}
인터페이스 선언
<bean id="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService" />
이 코드에서 service 객체를 넣었다 꼽았다 하면 된다 !
뉴렉썜과는 다르게 접근하곘다
https://mvnrepository.com/artifact/org.springframework/spring-jdbc/5.2.12.RELEASE
위에서 REALEASE 로 표기되었으면서, 사용을 많이한 버전을 가져오자
pom에 의존성 추가 후
java 파일 하나를 열어서 DirverManagerDataSource
를 검색하자.
그러면 import 풀패키지명+클래스명이 나오는데.. 이것을 긁어서 xml에 추가
결과는 아래와 같다.
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" ></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521/xepdb1" ></property>
<property name="username" value="philz" ></property>
<property name="password" value="1234" ></property>
</bean>
<bean id="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService" >
<property name="dataSource" ref="dataSource"></property>
</bean>
dispatcher-servlet.xml
을 여러 xml 파일로 나눌 수 있다.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/service-context.xml
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/servlet-context.xml</param-value>
</init-param>
</servlet>
contextConficLocation에는 하나의 xml밖에 오지 못한다.
이를 위해서 위에 설정 정보를 따로 두어 읽게 한다.
ContextLoaderListener
는 톰캣/세션이 시작/종료때 이벤트를 읽어가는 클래스이다
문제는 첫 요청시에 위 정보들이 load되므로 다소 느리단 것에 있다
<servlet>
<servlet-name>dispatcher</servlet-name>
...
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
이렇게 수정하면 이제 첫요청이 아니라 톰캣 구동시에 비동기 적으로 로딩된다
숫자 1은 서블릿이 여러개일때 우선순위 이다