Spring 컨트롤러, 서비스 , DAO, Mapper

최주영·2023년 7월 11일
0

spring

목록 보기
5/12

✅ Controller 과정

  • @Controller
    컨트롤러에서 리턴되는 값은 servlet-context.xml 에서 ViewResolver 에서 설정한
    prefix와 suffix의 value 값을 합쳐져서 해당 주소로 리턴됨 (밑에 코드로 예시)

  • RequestMapping

	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
// jsp에서 해당 주소로 이동!
<a class="nav-link" href="${path }/demo/demo.do">ControllerTest</a>
@Controller
public class DemoController {
	@RequestMapping("/demo/demo.do") // 해당 주소로 매핑받음
	public String demo() {
		return "demo/demo"; //  /WEB-INF/views/demo/demo.do.jsp 로 이동함
	}

서블릿 방식으로 파라미터값 받기

  • 매개변수로 HttpServletRequestHttpServletResponse 를 사용
  • 서블릿에서는 데이터를 저장해서 전송할 때 -> HttpServletRequestsetAttribute 메소드 사용
  • 클라이언트가 요청한 값을 getParmeter 메소드로 받음
<button type="button" class="col-sm-12 btn btn-outline-primary" 
        onclick="requestSend('demo/demo1.do')">
spring 메소드 서블릿처럼 이용하기
</button>

<script>
	const requestSend=(url)=>{  // 버튼클릭했을때, 해당 주소로 폼태그 action값 넘기고 전송
		$("#devFrm").attr("action","${path}/"+url); 
		$("#devFrm").submit();
	}
</script>
@Controller
public class DemoController {
	@RequestMapping("demo/demo1.do")
	public void demo1(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{

		String devName = req.getParameter("devName");
		int devAge = Integer.parseInt(req.getParameter("devAge"));
		String devGender = req.getParameter("devGender");
		String devEmail = req.getParameter("devEmail");
		String[] devLage = req.getParameterValues("devLang");
		
		Demo d = Demo.builder()
					.devName(devName)
					.devAge(devAge).devEmail(devEmail)
					.devGender(devGender).devLang(devLage).build();
		req.setAttribute("demo", d); // 서블릿의 데이터 저장
		req.getRequestDispatcher("/WEB-INF/views/demo/demoResult.jsp").forward(req, res);
	}

1:1로 매칭하여 파라미터 값 받기

  • 매핑메소드의 매개변수에 파라미터로 전송되는 name동일한 이름의 변수를 선언
  • Spring에서 데이터 저장해서 전송하는 객체를 제공 -> Model
  • 매개변수의 타입은 사용할 타입으로 설정
	@RequestMapping("/demo/demo2.do")
	public String demo2(String devName,int devAge,String devGender,String devEmail,
			String[] devLang, Model model){ 
		// 매개변수중에서 사용하지 않는 String 값은 null값이 들어가서 괜찮지만, 
        // int나 double 값 처럼 값이 정해져있는것은 꼭 매개변수가 사용되어야한다!! (사용안하면 오류발생)
				
		Demo d = Demo.builder().devName(devName).devAge(devAge).devGender(devGender)
				.devEmail(devEmail).devLang(devLang).build();
		
        // Model에 데이터 저장하기 -> model.addAttribute("key",value);  [String,Object]
		model.addAttribute("demo", d); // 다른 페이지에서 사용할 데이터를 저장
		
		return "demo/demoResult";
	}

@RequestParam 어노테이션을 이용해서 파라미터 값 받기

  • value 안의 값을 클라이언트가 요청한 name 값을 넣어준다
	@RequestMapping("/demo/demo3.do")
	public String requestParamuse(
		@RequestParam(value="devName", defaultValue = "아무개") String name,  // name 값이 없어도, devName인걸로 인식 
		@RequestParam(value="devAge", defaultValue="10") int age, // defaultValue = 기본값 (값이없으면 10으로 들어감) 
		@RequestParam(value="devGender") String gender,
		@RequestParam(value="devEmail", required = false) String devEmail, // 필수값인지 아닌지 선택할때 -> required
		String[] devLang, Model model) {
		
		Demo d = Demo.builder()
				.devName(name)
				.devAge(age).devEmail(devEmail)
				.devGender(gender).devLang(devLang).build();
		
		model.addAttribute("demo", d);
	
		return "demo/demoResult";
	}

DTO/VO 객체로 직접 parameter 값 받기

  • 매개변수로 전달되는 parameter 이름과 동일한 필드를 갖는 객체를 선언함
  • 주의 할점 : 클래스타입 Date를 전달받을 때는 java.sql.Date 로 지정!
	@RequestMapping("/demo/demo4.do")
	public String commandMapping(Demo demo, Model m) { // vo로 보낼때 알아서 값이 setter로 들어감
		m.addAttribute("demo", demo);
		return "demo/demoResult";
	}

Map으로 parameter 값 받기

  • @RequestParam 어노테이션 설정해서 Map 지정
  • Map으로 할경우 배열값은 처리하지 못함
	@RequestMapping("/demo/demo5.do")
	public String mapPapping(@RequestParam Map param, String[] devLang ,Model m) {
		// Map으로 했을 때,배열값은 처리못함
		param.put("devLang", devLang); // 직접 put메소드로 값을 넣어줘야함
		m.addAttribute("demo", param);
		return "demo/demoResult";
	}

✅ 추가 데이터 받아오기

	@RequestMapping("/demo/demo6.do")
	public String extraData(
		@CookieValue(value="testData",required = false, defaultValue = "rest-time") String data, // value="key값"
		@RequestHeader(value="User-agent") String userAgent, // value="해더이름"
		@SessionAttribute(value="sessionId") String sessionId, // value="세션key값"
		@RequestHeader(value="Referer") String referer
		){
		System.out.println("쿠키 : "+data);
		System.out.println("헤더 : "+userAgent);
		System.out.println("세션 : "+sessionId); 
		System.out.println("이전페이지 : "+referer);
		return "index";
	}

ModelAndView 객체를 이용해서 반환

  • ModelAndView -> view 설정과, Model(데이터저장) 설정을 같이 할 수 있는 객체
  • view : setViewName() 메소드를 이용해서 저장
  • data : addObject("key",value) 메소드 이용해서 저장
	@RequestMapping("/demo/demo7.do")
	public ModelAndView modelAndViewReturn(Demo d, ModelAndView mv) {
		mv.addObject("demo",d); // 데이터 저장
		mv.setViewName("demo/demoResult"); // 뷰 저장
		return mv; // 알아서 뷰에저장된 위치에 viewResolver 적용되서 이동
	}

✅ Request 요청 메소드(GET, POST)를 필터링

  • @GetMapping @PostMapping @DeleteMapping PutMapping 등이 있음
  • mapping 주소를 설정할 때 {}를 사용해서 parameter 값 받을 수 있음
  • 405 오류 -> 프런트에서 요청보낸곳의 보낸방식과 매핑에서 설정한 방식이 다르면 발생하는 오류
    ex) form태그에서 보낸 방식은 GET, 매핑된 방식은 POST이면 오류발생!
@GetMapping("/demo/{no}") // @RequestMapping(value="/demo",method=RequestMethod.GET) 동일
	public String searchDemo(@PathVariable(value ="no") int no) {
	// /board/boardView?no=1
	// /board/1 method=GET   
		return "demo/demoResult";
	}

✅ Spring에서의 redirectdispatcher

  • 주로 화면으로 이동된 후, 새로고침해도 다시 동작하지 않아야하는 것을 구현할 때 redirect 사용
  • ex) 회원가입, 회원추가, 로그인, 로그아웃
  • 그렇지 않을 경우 dispatcher 사용
// redirect로 가는 방법
return "redirect:/demo/demo.do";

// dispatcher로 가는 방법
return "demo/demo"; 

✅ Service

  • @Service 어노테이션을 이용해서 서비스 클래스 위에 스프링 빈으로 등록한다
  • Dao와 session을 사용함
package com.bs.spring.demo.service;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bs.spring.demo.dao.DemoDao;
import com.bs.spring.demo.model.dto.Demo;

@Service  // 서비스 스프링 빈으로 등록
public class DemoServiceImpl implements DemoService {

	@Autowired
	private DemoDao dao; // 인터페이스는 구현체를 찾음
	
	@Autowired
	private SqlSessionTemplate session; 
	
	@Override
	public int insertDemo(Demo demo) {
		return dao.insertDemo(session,demo);
	}

	@Override
	public List<Demo> selectDemoAll() {
		return dao.selectDemoAll(session);
	}
}

✅ Dao

  • @Repository 어노테이션을 이용해서 Dao 클래스 위에 스프링 빈으로 등록한다
package com.bs.spring.demo.dao;

import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import com.bs.spring.demo.model.dto.Demo;

@Repository
public class DemoDaoImpl implements DemoDao {

	@Override
	public int insertDemo(SqlSessionTemplate session,Demo m) {
		return session.insert("dev.insertDemo",m); // 매퍼의 namespace값.id
	}

	@Override
	public List<Demo> selectDemoAll(SqlSessionTemplate session) {
		return session.selectList("dev.selectDemoAll");
	}
}

✅ Mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="dev">
		<insert id="insertDemo" parameterType="demo">
			INSERT INTO DEV VALUES(SEQ_DEV_NO.NEXTVAL,#{devName},
			#{devAge},#{devEmail},#{devGender},
			#{devLang, typeHandler=strArr})
		</insert>
		
		<select id="selectDemoAll" resultMap="demoMap">
			SELECT * FROM DEV
		</select>
		
		<resultMap id="demoMap" type="demo">  <!-- 디비에서는 베열이 varchar2로 저장되어있어서 resultMap으로 해야함 -->
			<result property="devLang" column="devLang" typeHandler="strArr"/> 
          <!-- 필요한것만 넣으면되고, has a 관계일때는 컬럼 다 넣어야함 -->
		</resultMap>	
</mapper>
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글