티스토리 뷰
저번 포스팅에 이어 연달아 설정을 좀더 해보려고 한다.
그리고 설정이 끝나면 그걸로 간단하게 데이터도 넘기거나 여러 가지 형태로 받아 볼 것이다.
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=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 |
이번에는 @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는 아까 처음에 설정할 때 같이 해줬으니 확인 하면 될 것 같다.
끝
'Back-end > Spring' 카테고리의 다른 글
Spring STS TypeHandler, String[] ->String으로 자동변환 (0) | 2019.02.17 |
---|---|
Spring STS의 root Context주소 바꾸기 (0) | 2019.02.16 |
Spring STS 설정 하기#1 (0) | 2019.02.14 |
Spring STS 설치하기!! (0) | 2019.02.14 |
MyBatis List와 Map으로 데이터 불러오기 (4) | 2019.02.11 |