http://www.mvnrepository.com/

에서

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-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>WEB-INF/hello-dispatcher.xml</param-value>
        </init-param>
         -->
        <load-on-startup>1</load-on-startup>
</servlet>

 

<servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
</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-name>hello-dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

에 따라

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</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")
public ModelAndView read(){
        System.out.println("read 시작");
        service.read();
        System.out.println("read 종료");
       
        ModelAndView mv = new ModelAndView();
        mv.setViewName("read");
        return mv;
}

이후 Autowired된 BoardService service;에 따라

service.read();를 통해 5번으로 진행된다.


5. BoardService 인터페이스를 거쳐 BoardServiceImpl의 read메소드가 실행됨.

@Autowired
BoardDao dao;

@Override
public void read() {
        System.out.println("BoardServiceImp.list() 호출시작");
        dao.read();
        System.out.println("BoardServiceImp.list() 호출완료");
}

에 따라 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">
        <property name="customerDao" ref="customerDao" />
</bean>

@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) {
        this.dao = dao;

}

bean을 @을 이용하여

Spring에 등록 후 사용

생성

사용

@Controller
public class CustomerController {
}

@Autowired를 이용하여 사용

@Autowired
BoardDao dao;

@Service
public class BoardServiceImpl implements BoardService {
}

통상의 방법 사용 불가능

단. 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"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

 

</beans>

이하의 내용은 상기 공통부분의 <beans>해당 부분</beans>에 입력된다.

 

Spring-Module

<import resource="database/Spring-Datasource.xml"/>
<import resource="beans/Spring-Beans.xml"/>

 

Spring-Datasource

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3307/sakila" />
        <property name="username" value="sakila" />
        <property name="password" value="sakila" />
</bean>

Spring-Beans

<bean id="customerDao" class="com.shoon.common.dao.impl.CustomerDaoImpl">
        <property name="dataSource" ref="dataSource" />
</bean>

<bean id="customerService" class="com.shoon.common.service.impl.CustomerServiceImpl">
        <property name="customerDao" ref="customerDao" />
</bean>

 

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
{
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Board board = new Board();
                board.setNo(rs.getInt("no"));
                board.setName(rs.getString("NAME"));
                board.setPassword(rs.getString("password"));
                board.setTitle(rs.getString("title"));
                board.setContent(rs.getString("content"));
                board.setReadCnt(rs.getInt("read_cnt"));
                board.setCreateDate(rs.getTimestamp("create_date"));
                board.setUpdateDate(rs.getDate("update_date"));
                return board;
        }
}

 

 

new BeanPropertyRowMapper(Board.class));

상기 빈프로퍼티 로우매퍼는 DTO클래스를 받아서(상기 예시는 Board라는 DTO클래스를 사용함)

변수명을 받아 컬럼값을 찾음.

no일경우 no컬럼을 찾으며

readAll일 경우 read_all의 컬럼을 찾음.

public Board findByBoardId2(int no){
        String sql = "SELECT * FROM board WHERE no =  ?";
        Board board = (Board)getJdbcTemplate().queryForObject(
                        sql, new Object[] { no },
                        new BeanPropertyRowMapper(Board.class));
        return board;
}

 

 

 

 

Spring설정이 너무 길어지기에

servlet xml의 설정보다 많아져 가독성이나 주/부가 바뀌는 현상으로 인하여

Spring의 설정을 저장한 파일을 web.xml에서 불러올 수 있도록 묶어줌.

아래와 같은 방식으로 해당 설정파일을 불러올 수 있음.

web.xml의 display-name의 밑에 아래와 같이 사용한다.

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/**/Spring*.xml
        </param-value>
</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

+ Recent posts