에서
org.springframework
산하 코드를 이용할 것이다.
spring-jdbc
spring-core
spring-webmvc
spring-web
spring-context
를 이용할 것이며
4.1.6.RELEASE
버전을 사용한다.
javax.servlet의
javax.servlet-api 3.1.0또한 이용할 것이다.
web.xml은 서블릿 관련 설정을 담당하며, dispatcher-servlet.xml을 불러와 Spring의 설정을 담당할 수 있다.
web.xml과 서블릿명-dispatcher-servlet.xml은 같은 위치에 있어야 자동으로 불러올 수 있다.
<servlet>
<servlet-name>board-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
형식으로 작성하면
web.xml과 같은 위치에서
board-dispatcher-servlet.xml
을 자동으로 찾아서 가져오는 기능이 있다.
<servlet-name>값에 -servlet.xml을 추가하여 자동으로 가져온다.
이하 <!-- --> 를 통해 각주처리된 부분은, 예전에는 저렇게 사용하여야만 servlet.xml을 가져올 수 있었다.
<servlet> |
<servlet-mapping> |
.do로 끝나면 Springdispatcher servlet으로 감. |
dispatcher-servlet은
<context:component-scan base-package="com.shoon">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
을 통하여 각 클래스나 메소드의 @(annotation)을 검색하고, 이 검색된 부분에 각 기능별 beans를 부여해주는 기능을 가지고 있다.
이로써 클래스는 @Controller 등을 선언하는 것으로 bean을 불러오는것과 같은 기능을 사용할 수 있다.
@RequestMapping은
메소드 위에 들어가게 된다. 그 전문은 아래와 같다.
@RequestMapping(value = "/hello.do")
기본적으로
method = RequestMethod.GET
를 적었을 경우에는 GET방식만 받게 되므로 삭제하는 것을 추천함.
상기 기능을 포함한 리퀘스트매핑은 아래와 같다.
@RequestMapping(value = "/hello.do", method = RequestMethod.GET)
이하 스프링 프레임워크상의 기본적인 요청방식은 아래와 같다.
편의성을 위해 read.do를 이용한다.
1. 클라이언트가 원하는 기능을 선택함(read.do 주소값이 입력됨)
2. 해당 주소값을 받고 web.xml에서는
.do로 끝나는 url패턴이므로
<servlet-mapping> |
에 따라
<servlet> |
를 실행하여 servlet-class의 내용을 실행한다.
서블릿 클래스 springframework에 따라서
web.xml과 같은 위치에 있는 서블릿네임-servlet.xml을 실행하게 된다
3. hello-dispatcher-servlet.xml에서는
<context:component-scan base-package="com.mkyong" />
에 따라서
com.mkyoung에 있는 모든 @(annotation)을 검색한 후, 어노테이션에 해당하는 기능을 부여한다.
@Controller는 컨트롤러에 필요한 기능을
@Service에는 서비스에 필요한 기능을
@Repository에는 레포지토리에 필요한 기능을 부여해준다.
이 기능은 dispatcher-servlet의 beans에 기재되어 있다.
4. @Controller가 포함된 메서드 중
@RequestMapping(value = "/read.do")
가 선언된 메소드를 찾아 실행한다.
@Autowired BoardService service; @RequestMapping(value = "/read.do") |
이후 Autowired된 BoardService service;에 따라
service.read();를 통해 5번으로 진행된다.
5. BoardService 인터페이스를 거쳐 BoardServiceImpl의 read메소드가 실행됨.
@Autowired |
@Override |
에 따라 dao.list();가 실행됨.
6. BoardDao 인터페이스를 거쳐 BoardDaoImpl의 list메소드가 실행됨.
@Repository public class BoardDaoImpl implements BoardDao { @Override public void read() { // TODO Auto-generated method stub System.out.println("BoardDaoImp.read() 호출됨"); } } |
까지 실행됨.
이로써
Autowired는 Controller -Autowired- Service -Autowired- Repository(DAO)
가 성립함을 알 수 있다.
스프링 프레임워크상의 작업 순서도는
@Controller - @Service - @Repository순서로 진행된다.
@Controller는 service에 사용자로부터 받아들인 요청을 전달한다.
@Service로 정의된 클래스는, 스프링이 구동할 때 찾아서 해당 클래스의 interface를 읽어들인다.
해당 클래스와 interface는 메소드명과 반환형 등이 전부 같기에 가능하다.
@Repository는 DAO클래스에서 사용하며, service에서 넘어온 작업을 DB와 연동한다.
스프링의 가장 중요한 기능은
DI(의존관계주입)로써,
스프링에 자동으로 등록된 클래스(Controller, Service, Repository)는 실행시 자동으로 생성되고, 해당 기능을 당겨오는 것을 DI라고 한다.
@Autowired
BoardService service;
를 통하여 DI를 일으킬 수 있다.
BoardService는 인터페이스 클래스이다.
이하 Controller, Service, Repository에서 생성한 기능을 Autowired로 사용하는 방법이다.
Spring-파일명.xml 을 이용하여 등록 후 사용 | 생성 | 사용 |
<bean id="customerService" class="com.shoon.common.service.impl.CustomerServiceImpl"> | @Autowired를 이용하여 사용 | |
@Autowired CustomerService service; | ||
<bean id="customerDao" class="com.shoon.common.dao.impl.CustomerDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean> | 통상의 방법으로 사용 | |
CustomerDao dao; public void setCustomerDao(CustomerDao dao) { } | ||
bean을 @을 이용하여 Spring에 등록 후 사용 | 생성 | 사용 |
@Controller | @Autowired를 이용하여 사용 | |
@Autowired | ||
@Service | 통상의 방법 사용 불가능 |
단. bean id가 customerDao일때
통상의 방법으로 사용시 serCustomerDao의 식으로
앞에 set을 붙이고 카멜표기법으로 표기하여야 한다.
이하 내용은 스프링 2.x버전에서는 필히 사용하여야 하며,
4.x이상에서는 @controller / @service등을 이용하여 생략할 수 있다.
이하 방법을 '통상의 방법'으로 칭한다.
Datasource는 jdbc를 사용하기 위해서는 필히 등록해야 한다.
───────────────────────────────────────────────
resource폴더에
Spring_Module을 배치한다.
이후 resource폴더 내에 database와 beans폴더를 배치하고
database 에 Spring-Datasource.xml
beans 에 Spring-Beans.xml을 배치한다.
공통 |
<beans xmlns="http://www.springframework.org/schema/beans"
</beans> |
이하의 내용은 상기 공통부분의 <beans>해당 부분</beans>에 입력된다.
Spring-Module |
<import resource="database/Spring-Datasource.xml"/> |
Spring-Datasource |
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> |
Spring-Beans |
<bean id="customerDao" class="com.shoon.common.dao.impl.CustomerDaoImpl"> <bean id="customerService" class="com.shoon.common.service.impl.CustomerServiceImpl"> |
Spring-Module의 내용은
데이터베이스와 Beans의 파일을 연결시켜주는 값이기에, 폴더명/파일명의 식으로 데이터소스와 빈즈를 연동한다.
Spring-Datasource의 내용은
mysql과 연동시켜주는 값이기에
port값과 Schema명
계정명과 비밀번호를 변경하여야 한다.
상기 port값은 3307
상기 스키마명은 sakila
상기 계정명과 비밀번호는 sakila/sakila이다.
Spring-Beans의 내용은
Repository(첫번째 내용)는
dataSource라는 프로퍼티값을 부여하고, 해당 내용을 사용하게끔 하여
CustomerDaoImpl클래스가 DB와 연결되도록 한다.
이는 @Repository의 기능이다.
Service(두번째 내용)는
customerDao라는 프로퍼티값을 부여하고 해당 내용을 Autowired로 받아
customerServiceImpl클래스가 프로퍼티값인 customerDao와 연결되도록 한다.
이는 @Service의 기능이다.
덧붙여서 @Controller는 dispatcher-servlet에서 상기 연결기능을 담당한다.
그리고 Controller는 사용하지 않을 경우 해당 클래스 자체가 존재하지 않는다.
───────────────────────────────────────────────
RowMapper
는 스프링에서 지원하는 인터페이스이며,
rs(ResultSet)을 받아서 처리하여 주는 메소드이다.
public class BoardRowMapper implements RowMapper |
new BeanPropertyRowMapper(Board.class));
상기 빈프로퍼티 로우매퍼는 DTO클래스를 받아서(상기 예시는 Board라는 DTO클래스를 사용함)
변수명을 받아 컬럼값을 찾음.
no일경우 no컬럼을 찾으며
readAll일 경우 read_all의 컬럼을 찾음.
public Board findByBoardId2(int no){ |
Spring설정이 너무 길어지기에
servlet xml의 설정보다 많아져 가독성이나 주/부가 바뀌는 현상으로 인하여
Spring의 설정을 저장한 파일을 web.xml에서 불러올 수 있도록 묶어줌.
아래와 같은 방식으로 해당 설정파일을 불러올 수 있음.
web.xml의 display-name의 밑에 아래와 같이 사용한다.
<listener> <context-param> |
Spring-파일명.xml등록법 사용시 사용법
<bean id="아이디값c" class="패키지.클래스">
<property name="프로퍼티명a" ref="레퍼런스값b" />
</bean>
일때
a라는 프로퍼티명을 가진 레퍼런스값b의 value를 아이디값c로 불러서 쓸 수 있다.
JdbcDaoSupport를 extends 하여 사용할 경우 datasource를 final로 선언하여 두었기에 사용자가 추가로 선언할 수 없으며, 선언할 필요도 없다.
'JAVA > JAVA 기본' 카테고리의 다른 글
portfolio 스프링 프레임워크 사용 (0) | 2017.10.18 |
---|---|
Portfolio Maven (0) | 2017.10.13 |
Portfolio 서블릿 (0) | 2017.10.12 |
Portfolio 기반 구성 및 사용 (0) | 2017.10.12 |
JAVA 서블릿 (0) | 2017.10.12 |