티스토리 뷰





반응형

저번 포스팅에 이어 연달아 설정을 좀더 해보려고 한다.

 그리고 설정이 끝나면 그걸로 간단하게 데이터도 넘기거나 여러 가지 형태로 받아 볼 것이다.


1. root-context 설정하기

예전 mybatis에서 driver, url등등 설정 하던걸 여기다가 설정해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
        <property name="username" value="spring"/>
        <property name="password" value="spring"/>
    </bean>
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
    </bean>
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactoryBean"/>
    </bean>
        
</beans>
cs

mybatis때 처럼 jdbc설정해주고 아래에는 mapper까지 한다. 15번째 줄은 src/main/resource 밑에 mapper아래 모든 폴더와 모든 xml파일을 읽어 들인다는 뜻이다. 또한 sqlSessionTemplate까지 한번에 처리해준다. 이렇게 설정해 놓으면 spring container가 알아서 commit과 close등을 해주기 때문에 매우 편리하게 사용이 가능하다.


2.src/main/resources에 xml 파일 생성하기

아래와 같이 config파일과 mapper파일을 mybatis에서 만든 것 처럼 만들어 주자.


전에 설정했던 drive 등 내용은 아까 root-context에서 해줬기 때문에 여기서는 별칭 지정만 했다.


이따 사용할 insert문을 미리 추가했다.


이제 src/main/java를 할 것이다. 

여기서는 우리가 늘 사용했던 controller, service, dao, vo 객체들을 넣어서 사용할 것이다.


Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.kh.spring.demo.controller;
import javax.servlet.http.HttpServletRequest;
 
@Controller
public class DemoController {
 
    @Autowired
    DemoService service;
    
    @RequestMapping("/demo/demo.do")
    public String demo() {
        /*service.test();*/
        System.out.println("/demo/demo.do/controller실행!");
        //prefix+return값+suffix
        return "demo/demo";
    }
cs

먼저 엄청나게 간소화된 Controller다. 전에는 서블릿이란 객체를 생성해야 했는데 지금 만든 객체는 일반 클래스로 생성한 것이다. 여기서 어노테이션으로 4번째 줄처럼 @Controller 후 임포트만 해주면 이제 이 객체는 컨트롤러라고 지정해준 것이다. 그 아래 @Autowired는 자동연결 해주는 어노테이션인데 그런 방식으로 service를 구현해준 것이다.


그리고 서블릿을 사용할 때 꼭 매핑해줘야했던 url값은 @RequestMapping으로 맞추면 된다. 즉 jsp파일에서 /demo/demo.do로 요청을 하게 되면 위의 서블릿이 동작하는 것이다. 그리고 return "demo/demo";만 해줄 경우 앞에 ${pageContext.request.contextPath()}/views 까지가 자동으로 붙여주고 맨 뒤에는 .jsp를 붙여주기 때문에 ${pageContext.request.contextPath()}/views/demo/demo.jsp와 같은 거다. 



위 서블릿으로 페이지가 이렇게 넘어온다. 그리고 스프링부터는 1개의 매핑당 1개의 메소드가 생성되는 형식이다.

이번에는 만들어진 폼으로 데이터를 날리고 여러 방식으로 받아 볼 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RequestMapping("/demo/demo1.do")
    public String demo1(HttpServletRequest request)
    {
        String devName=request.getParameter("devName");
        int devAge=Integer.parseInt(request.getParameter("devAge"));
        String devEmail=request.getParameter("devEmail");
        String devGender=request.getParameter("devGender");
        String[] devLang=request.getParameterValues("devLang");
        
        Dev dev=new Dev(devName, devAge, devEmail,devGender,devLang);
        request.setAttribute("dev", dev);
        
        System.out.println(devName+devAge+devEmail+devGender+devLang);
        
        return "demo/result";
    }
cs

위 사진에서 첫번째 버튼 HttpServletRequest를 클릭해서 넘겨서 받는 메소드다. 이전과 똑같이 하고싶은 경우에는 매개변수로 HttpServletRequest로 받아서 정말 예전과 똑같이 받아서 사용 가능하다. request.setAttribute해서 넘기는 거 까지.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping("/demo/demo2.do")
    public String demo2(HttpServletRequest req,
                    @RequestParam(value="devName" ) String devName,
                    @RequestParam(value="devAge", required=false, defaultValue="19"int devAge,
                    @RequestParam(value="devEmail", required=falseString devEmail,
                    @RequestParam(value="devGender", required=falseString devGender,
                    @RequestParam(value="devLang", required=falseString[] devLang
                    ) 
/*    public String demo2(HttpServletRequest req,
            String devName, int devAge, String devEmail,
            String devGender, String[] devLang) */
    {
        req.setAttribute("dev"new Dev(devName,devAge,devEmail,devGender,devLang));
        
        System.out.println(devName+devAge+devEmail+devGender+devLang);
        return "demo/result";
    }
cs

이번에는 @RequestParam으로 넘기는 것이다. form의 name값인 value="devName"을 String devName으로 넣어준다는 의미다. name변수명과 다르게 받을 경우 사용하며 required=false는 매개변수로 사용하면 무조건 받아야 에러가 안나는데, 이 처리를 해줌으로써 필수 항목이 아니기에 빈 데이터가 와도 된다는 의미다. String형은 null형으로 매꾸기에 defaultValue가 필요없지만 int같은 경우에는 null이 못들어 가므로 꼭 설정이 필요하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping("/demo/demo2.do")
    /*public String demo2(HttpServletRequest req,
                    @RequestParam(value="devName" ) String devName,
                    @RequestParam(value="devAge", required=false, defaultValue="19") int devAge,
                    @RequestParam(value="devEmail", required=false) String devEmail,
                    @RequestParam(value="devGender", required=false) String devGender,
                    @RequestParam(value="devLang", required=false) String[] devLang
                    ) */
    public String demo2(HttpServletRequest req,
            String devName, int devAge, String devEmail,
            String devGender, String[] devLang) 
    {
        req.setAttribute("dev"new Dev(devName,devAge,devEmail,devGender,devLang));
        
        System.out.println(devName+devAge+devEmail+devGender+devLang);
        return "demo/result";
    }
cs

위와 비슷한 코드지만 다른 방식이다. 딱 보기에도 사용이 매우 편리하다. 매개변수의 이름만 form에서 보내는 name과 변수명을 맞춰주기만 하면되는 것 이다. 대신 이렇게 사용할 때 유의할점은 매개변수에 값이 없을 경우 무조건 에러가 뜨기에 사용에 유의하여야 한다.


1
2
3
4
5
6
7
8
9
@RequestMapping("/demo/demo3.do")
    public String demo3(Dev dev, Model model)
    {
        System.out.println(dev);
        model.addAttribute("dev",dev);
        //System.out.println(model);
        return "demo/result";
    }
    
cs

dev의 멤버변수와 form의 name이 이름이 같아 자동으로 넣어줬으며 model을 사용해 addAttribute를 한 이유는 request는 파라미터말고도 여러가지 데이터(세션,쿠키,Header등등)를 담고 있기에 vo 객체만 담아서 필요한 데이터만 넘기기 위해 사용함. (경량화)


1
2
3
4
5
6
7
8
9
10
private int devNo;
    private String devName;
    private int devAge;
    private String devEmail;
    private String devGender;
    private String[] devLang;
    
    public Dev() {
        // TODO Auto-generated constructor stub
    }
cs

dev 객체 멤버변수들


이제 데이터를 insert까지 해보자

1
2
3
4
5
6
7
@RequestMapping("/demo/insertDev.do")
    public String insertDev(Dev dev)
    {
        int result=service.insertDev(dev);
        
        return "redirect:/";
    }
cs


Interface를 만들어서 임플리먼트로 상속받아 사용하는건 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.kh.spring.demo.model.service;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.kh.spring.demo.model.dao.DemoDao;
import com.kh.spring.demo.model.vo.Dev;
 
@Service
public class DemoServiceImpl implements DemoService{
 
    @Autowired
    DemoDao dao;
 
    @Override
    public int insertDev(Dev dev) {
        int result=dao.insertDev(dev);
        return result;
    }    
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.kh.spring.demo.model.dao;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import com.kh.spring.demo.model.vo.Dev;
 
@Repository
public class DemoDaoImpl implements DemoDao {
    @Autowired
    SqlSessionTemplate sqlSession;
 
    @Override
    public int insertDev(Dev dev) {
        // TODO Auto-generated method stub
        return sqlSession.insert("demo.insertDev",dev);
    }
}
cs

이런식으로 데이터를 날리면 된다. mapper는 아까 처음에 설정할 때 같이 해줬으니 확인 하면 될 것 같다.


반응형
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31