마지막으로 TEST 배우고 있습니다.  늘 느끼지만 선생님께서 가르쳐 주실때는 엄청 간단한 것 같더니

내가하면 세상 그렇게 까다로울 수가 없습니다.

오늘은 TEST로 시험을 봤습니다......점수는 묻지 마세요..ㅠㅠ

암튼 시험예제를 구동시켜 보았습니다.

package com.sunit.verify.member.controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sunit.verify.member.service.MemberService;

@Controller
public class MemberController {

	@Autowired

	private MemberService service;

	@RequestMapping(value = "/beginSpring/memberRegister.action", method = { RequestMethod.POST })

	public ModelAndView memberRegisterEnd(HttpServletRequest request, ModelAndView mv) {

		try {

			String userid = request.getParameter("userid");

			String passwd = request.getParameter("passwd");

			String name = request.getParameter("name");

			String email = request.getParameter("email");

			String tel = request.getParameter("tel");

			HashMap<String, String> paraMap = new HashMap<String, String>();

			paraMap.put("userid", userid);

			paraMap.put("passwd", passwd);

			paraMap.put("name", name);

			paraMap.put("email", email);

			paraMap.put("tel", tel);

			int n = service.memberRegister(paraMap);

			String result = "";

			if (n == 1)

				result = "회원가입 성공!!";

			else

				result = "회원가입 실패!!";

			mv.addObject("result", result);

			mv.setViewName("memberRegisterResult");

		} catch (Exception e) {

			mv.addObject("error", "회원가입도중 오류가 발생하였습니다");

			mv.setViewName("error");

		}

		return mv;

	}

}

여기는 controller // 시험구문엔 반환형이 String이였는데 내가 돌리니깐 안되서 일단 이것도 ModelAanView로 변경

package com.sunit.verify.member.service;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MemberService {
	@Autowired
	private SqlSession session;
	public int memberRegister(HashMap<String, String> paraMap) {
		int result = session.insert("", paraMap);
		return 1;
	}

}

내가만든 service//// 시험구문엔 없었는데 controller에 보내는 구문이 있으니깐 그냥 만들어 봤고....mapper까지 만들라니 귀츈......도메인도 만들었는데...이건 다들 아실꺼라 pass

package com.sunit.verify.member;

import static org.junit.Assert.fail;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.queryParam;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.sunit.verify.member.service.MemberService;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
		,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class MemberControllerTest {
	private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class);
	@Autowired
	private WebApplicationContext wac;	
	private MockMvc mockMvc;

	
	@Before
	public void setup() {
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup()완료~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
	}
	@Test
	public void testMemberRegister() throws Exception {
		//fail("Not yet implemented");
		logger.info("===== testMemberRegister() 메소드 시작 =====");
		try{
			((ResultActions) ((MockHttpServletRequestBuilder) mockMvc.perform(post("/beginSpring/memberRegister.action")))
			.param("userid", "leess")
			.param("passwd","qwer1234$")
			.param("name","이순신")
			.param("email","leess@gmail.com")
			.param("tel","01023456789"))
			.andDo(print())
			.andExpect(status().isOk());
			logger.info(">>> 테스트 수행 성공!!<<< ");
		}catch(Exception e) {
			logger.info("테스트 수행 실패 : ",e.getMessage());
		}
	}

}

TEST클래스.... 연습하다가 뜬금없이 깨달았는데

private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class); 구문이

homeController에 있더라구요.......가까이 있었으나 몰랐던.. 눈뜬 장님이였어요.

암튼 MockMvc 생성하고 하라는 거 했고......

환경설정은 원래 해야하는거 그대로 했습니다.

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>   
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
	    <version>5.2.18.RELEASE</version>
		    <scope>test</scope>
		</dependency>

pom.xml 에 test 환경설정 해주고.....이건 이미 배웠는데  1가지 추가로

servlet 버전 안 맞는다고 변경하는거예요....이거 사실 전날 집에서 연습했을때 에러났던 부분인데

servlet버전이 안맞아서 변경하면 AspertJ 버전에서 빨간줄이 쳐져요.....이것도 같이 변경하라고는 하는데

어떻게 변경하라고는 안나오는건에요....찾기도 힘들고....그래서 어제는 그냥 에러상태로 뒀던건데..

오늘도 시험 문제서는 변경하라고 해서 그냥 변경했는데 역시나 빨간줄  x 표시 되죠...

근데 이번에는 어떻게 처리하는지 검색 성!공! 했습니다.

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

바로바로바로

servlet 버전을 변경하면서 servlet-api  -->  javax.servlet-apl으로 변경

즉 javax. 를 추가하면 됩니다.

빨간 줄 삭제.....!!!!!!

그외에서 에러난게 많았으나......조금씩 정리해보는거죠...ㅋㅋ.....

servlet-context.xml 파일명 오타도 있고......

이런거 다 정리해서 돌려보는거지요.... test는 되었는데 결과값은 예외 오류 입니다..

여기서 부터는 잘모르겠어서 다음날 샘찬스 쓸겁니다........쓸수 있는 날짜도 얼마 안남았어요..ㅠㅠ

///////////////////////////////////////////////////////////////

controller수정.......여긴 크게 한게 없는데 이쁘게 정리^^

package com.sunit.verify.member.controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sunit.verify.member.service.MemberService;

@Controller
public class MemberController {

	@Autowired
	private MemberService service;

	@RequestMapping(value = "/beginSpring/memberRegister.action", method = { RequestMethod.POST })
	public ModelAndView memberRegisterEnd(HttpServletRequest request, ModelAndView mv) {
		try {
			String userid = request.getParameter("userid");
			String passwd = request.getParameter("passwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			String tel = request.getParameter("tel");

			HashMap<String, String> paraMap = new HashMap<String, String>();
			paraMap.put("userid", userid);
			paraMap.put("passwd", passwd);
			paraMap.put("name", name);
			paraMap.put("email", email);
			paraMap.put("tel", tel);
			int n = new MemberService().memberRegister(paraMap);
			String result = "";
			if (n == 1)
				result = "회원가입 성공!!";
			else
				result = "회원가입 실패!!";

			mv.addObject("result", result);
			mv.setViewName("memberRegisterResult");
		} catch (Exception e) {

			mv.addObject("error", "회원가입도중 오류가 발생하였습니다");

			mv.setViewName("error");

		}

		return mv;

	}

}

테스트 클래스 수정했어요....포함여부가 달랐더라구요.

package com.sunit.verify.member;

import static org.junit.Assert.fail;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.queryParam;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.sunit.verify.member.service.MemberService;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
		,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class MemberControllerTest {
	private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class);
	@Autowired
	private WebApplicationContext wac;	
	private MockMvc mockMvc;

	
	@Before
	public void setup() {
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup()완료~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
	}
	@Test
	public void testMemberRegister() throws Exception {
		//fail("Not yet implemented");
		logger.info("===== testMemberRegister() 메소드 시작 =====");
		try{
			mockMvc.perform(
					post("/beginSpring/memberRegister.action")
					.param("userid", "leess")
					.param("passwd","qwer1234$")
					.param("name","이순신")
					.param("email","leess@gmail.com")
					.param("tel","01023456789"))
			.andDo(print())
			.andExpect(status().isOk());
			logger.info(">>> 테스트 수행 성공!!<<< ");
		}catch(Exception e) {
			logger.info("테스트 수행 실패 : ",e.getMessage());
		}
	}

}

service의 메소드 본문 삭제......할 수도 없는데 구문이 있어서 에러였습니다...

package com.sunit.verify.member.service;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MemberService {
	@Autowired
	private SqlSession session;
	
	public int memberRegister(HashMap<String, String> paraMap) {
		//int result = session.insert("", paraMap);
		return 1;
	}

}

여기저기서 조금씩 오점이 있었습니다.

이렇게 결과가 잘 나왔습니다.....

실제 개발시 jsp파일 없이도 할수 있는 부분은 이렇게 할것 같네요^^

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
JUNIT TEST 하기  (0) 2022.11.09

채팅창 진행중입니다...

소소한 사용자 편의 기능을 개선하고 있습니다.

그중 입력할 때 엔터키....

채팅할때 매번 버튼을 마우스로 안하잖아요...

저도 엔터키 이벤트를 했습니다.....

////버튼키를 클릭했을때
	$('#getResult').on('click',function(){
		var text=$('#usertext').val();
		if(text.length != 0){
		 sendChatMesage();
		}
	});
// 엔터키를 쳤을 때	
	$('#usertext').on('keyup',function(e){
		var text=$('#usertext').text();
		if(e.keyCode==13){
			if(text.length != 0 ){
				 sendChatMesage();
			};
		};
	});

버튼키를 눌렀을 때는 null값을 잡아서 넘어가지 않도록 한건데 문제는 이건 금방 되었습니다.

문제는 엔터키 였어요..0값이 확인이 되었는데 그냥 빈칸 값이 전달되는거예요

너무 보기 싫으잖아요......이거 css잡기도 어렵고.....인터넷 복붙한거라 만지기 어려워요...ㅠㅠ

보니깐 textArea의 0값이 콘솔에서 확인되고 if문도 확인되도 실제 구동은  "/n" 값이 확인되라구요...

반나절 조회하다가 저녁약속있어서 술한잔 하고....집에 와서 잠깐들여다 보는데

그제서야 textarer 빈값체크해보기로 검색하자.........생각이 나더라구요.

그랬더니 여러가지 조회되었는데 그중 이게 먹혀서 글 올려봅니다.

	$('#magText').on('keyup',function(e){		
		if(e.keyCode===13){
			var text=$('#magText').val();
			if(text.replace(/(^\s*)|(\s*$)/gi, "") ){   //정규식 뭐규식 인거...
				 sendChatMesage();
			}
		    $('#magText').val('');			//엔터값도 없에주는 부분
		};
	});

이렇게 하니 간단히 먹히네요...

0값이 안먹혀서 textarea 값을  text()로 도 했는데 콘솔에서는 되지만 값으로는 잘 안되었어요...

이것도 검색하니 val()이 맞았습니다.

빈값을로 하는 것도 if문 밖에서 하니깐 빈값이 아니라 실제 대화 내용을 입력하려고 해도 다 지워집니다.

엔터키일때만 지워지도록 if문 안으로 넣었더니 원하는데로 깔끔하게 떨어집니다^^

수업진행 하면서 앞서 log4배웠으나 안쓸때......

system.out.println을 대체할수 있는것을 한개더 알려주셨다.

public class MemberControllerTest {
	
	//org.slf4j.Logger 이걸로 해야한다.
	private static final Logger logger=LoggerFactory.getLogger(MemberControllerTest.class);
	@Autowired
	private WebApplicationContext wac;   //context ==객체에 대한 정보가 들어가 있다. 테스트를 위한 준비 객체

	private MockMvc mockMvc;
	
	@Before //JUINT껄로 임포트
	public void setup() {
		//mockMvc 사용하기 위해 builder와 wac객체를 이용하여 setup!
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup() 완료!!!");
	}
	@Test
	public void testMemberRegister() throws Exception{
		try {
			//mockMuc.perform(post(url)) ...perform 어떤 메소드,,, 어떤 url인가를 지정하는 것
			mockMvc.perform(post("/memberRegister.do")
					.param("userId","khadmin")
					.param("passwd","qwer1234")
					.param("name","김경호")
					.param("email","khadmin.com")
					.param("tel","01099998888"))
			.andDo(print())  //andDo 결과 확인을 위해...print 콘솔에 출력
			.andExpect(status().isOk());  //성공 할꺼를 예상하고 결과값중에 출력란것..		
			logger.info(">>>테스트 성공<<<");		
		} catch (Exception e) {
			logger.info(">>>테스트 실패<<<"+e.getMessage());	
		}
	}
	

}
MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /memberRegister.do
       Parameters = {userId=[khadmin], passwd=[qwer1234], name=[김경호], email=[khadmin.com], tel=[01099998888]}
          Headers = []
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = com.kh.junspring.member.controller.MemberController
           Method = public org.springframework.web.servlet.ModelAndView com.kh.junspring.member.controller.MemberController.memberRegister(org.springframework.web.servlet.ModelAndView,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = common/errorPage
             View = null
        Attribute = modelAndView
            value = ModelAndView [view="common/errorPage"; model={msg=회원가입 성공!}]
           errors = []
        Attribute = msg
            value = 회원가입 성공!

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Language:"en"]
     Content type = null
             Body = 
    Forwarded URL = /WEB-INF/views/common/errorPage.jsp
   Redirected URL = null
          Cookies = []
INFO : com.kh.junspring.member.MemberControllerTest - >>>테스트 성공<<<

이렇게 결과나 나온다.....INFO>>>>>

앞서서 배운건 자동으로 다 나오니깐 그냥 그걸 쓸것이다.^^ 

확인해야할 메소드마다 한줄씩 넣어줬다가 지워줘야 하는데 귀찮다.^^

'SPRING' 카테고리의 다른 글

구글 translation api 사용해보기.  (1) 2023.05.20
이클립스 부트 mariaDB설치 ...에러백만돌이  (0) 2023.05.19
JUNIT TEST 2-controller//  (0) 2022.11.10
LOG4j 등록  (0) 2022.10.11
AOP를 이용한 트랜젝션  (0) 2022.10.11

이제 controller도 잘  작동되는지 테스트......

앞선 과정은 이미 했고.......test 폴더에 한개 더 만든다.

 

 

이땐 controllerTest 클래스는 그냥 클래스 파일이다. 어차피 다 그냥 타이밍 해서 설치할게 없었다고 하셨다.

 

 

 

 

 

 

package com.kh.junspring.member;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
//Controller 및 웹환경에서 사용되는 빈을 자동 생성 등록
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
		, "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class MemberControllerTest {
	
	@Autowired
	private WebApplicationContext wac;   //context ==객체에 대한 정보가 들어가 있다. 테스트를 위한 준비 객체

	private MockMvc mockMvc;
	
	@Before //JUINT껄로 임포트
	public void setup() {
		//mockMvc 사용하기 위해 builder와 wac객체를 이용하여 setup!
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
	}
	@Test
	public void testMemberRegister() throws Exception{
		try {
			//mockMuc.perform(post(url)) ...perform 어떤 메소드,,, 어떤 url인가를 지정하는 것
			mockMvc.perform(post("/memberRegister.do")
					.param("userId","khadmin")
					.param("passwd","qwer1234")
					.param("name","김경호")
					.param("email","khadmin.com")
					.param("tel","01099998888"))
			.andDo(print())  //andDo 결과 확인을 위해...print 콘솔에 출력
			.andExpect(status().isOk());  //성공 할꺼를 예상하고 결과값중에 출력란것..		
					
		} catch (Exception e) {
			
		}
	}
	

}

Mockmvc는 MVC패턴의 모조품같은것으로 TEST를 하기위한 객체라고 함...

 

이미 만들었던 memberController가 복잡해서 간단하게 한게 더 만들었다.

 

public class MemberController {
	@Autowired
	private MemberService mService;

	//text를 위한 메소드
	@RequestMapping(value="/memberRegister.do", method=RequestMethod.POST)
	public ModelAndView memberRegister(ModelAndView mv
			, @RequestParam("userId") String userId
			, @RequestParam("passwd") String passwd
			, @RequestParam("name") String name
			, @RequestParam("email") String email
			, @RequestParam("tel") String tel) {
		Map<String, String> paramMap =  new HashMap<String, String>();
		paramMap.put("userId", userId);
		paramMap.put("passwd", passwd);
		paramMap.put("name", name);
		paramMap.put("email", email);
		paramMap.put("tel", tel);
		
		int result = mService.registerMember(paramMap);
		String str="";
		if(result > 0) {
			str="회원가입 성공!";
		}else {
			str="회원가입 실패!";
		}
		mv.addObject("msg", str);
		mv.setViewName("common/errorPage");
		return mv;
	}

같은 메소드에 멤버변수를 변경해서 진행.......가능하게 만드는 건 오버로드....(복습)^^

db까지 가지는 않게 stoerLogic에서 그냥 리턴값 1로 만들어서 진행됨.

결과내용은 콘솔에 띄어줌.

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /memberRegister.do
       Parameters = {userId=[khadmin], passwd=[qwer1234], name=[김경호], email=[khadmin.com], tel=[01099998888]}
          Headers = []
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = com.kh.junspring.member.controller.MemberController
           Method = public org.springframework.web.servlet.ModelAndView com.kh.junspring.member.controller.MemberController.memberRegister(org.springframework.web.servlet.ModelAndView,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = common/errorPage
             View = null
        Attribute = modelAndView
            value = ModelAndView [view="common/errorPage"; model={msg=회원가입 성공!}]
           errors = []
        Attribute = msg
            value = 회원가입 성공!

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Language:"en"]
     Content type = null
             Body = 
    Forwarded URL = /WEB-INF/views/common/errorPage.jsp
   Redirected URL = null
          Cookies = []

일단 잘 출력된다.. 감사하다^^

'SPRING' 카테고리의 다른 글

이클립스 부트 mariaDB설치 ...에러백만돌이  (0) 2023.05.19
LOG를 대체하는 logger  (0) 2022.11.10
LOG4j 등록  (0) 2022.10.11
AOP를 이용한 트랜젝션  (0) 2022.10.11
예외처리 어노테이션  (0) 2022.10.07

Junit 의 환경 설정

	<!-- test -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>5.2.18.RELEASE</version>  <!--하단에 TEST Junit이 있는데 그냥 위에다 붙였다...자바 버전과 일치해야하기때문에 체크해야한다.  -->
		    <scope>test</scope>
		</dependency>
<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

pom.xml수정

 

@Repository
public class CustomerStoreLogic {
	@Autowired
	private SqlSession sqlSession;    //인터페이스 결합도를 약하게 하게 위해  //templi을 쓰면 결합도가 강해서 나중에 session으로 변경된다.
	
	public int registerCustomer(Customer customer) {
		int result = sqlSession.insert("",customer);
		return result;
	}

}

customer패키지// domain 패키지//store패키지와 클래스들 만들고 클래스만들면 get,set 기본생성자 매개변수 생성자 만들건 기본..

 

 

 

테스트의 클래스는 test파일에 한다.

이 폴더가 왜있나 했더니 이제서야 써본다..

coustomer 패키지 우클릭..클래스 만드는데.....좀 다름...

 

우클릭..new...other .. junit으로 검색해서 test Case 파일로 선택한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여기서 테스트할 클래스를 선택한것이다. 아까만들었던 logic을 클래스를 선택하고 next를 해서 메소드 선택한다.

그럼 테스트에 이렇게 파일이 만들어 진다.

 

인제 여기서 작업을 한다.

 

package com.kh.junspring.customer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.kh.junspring.customer.domain.Customer;
import com.kh.junspring.customer.store.CustomerStoreLogic;

@RunWith(SpringJUnit4ClassRunner.class)   //스프링에서 JUnit을 사용할수 있도록 하는 클래스  //부트에서는적을 필요는 없다.
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})  //중괄호는 여러개를 쓸수도 있다.
public class CustomerStoreLogicTest {
	
	@Autowired  //꼭 해줘야 한다.
	private CustomerStoreLogic store;
	@Test
	public void testRegisterCustomer() {
		//fail("Not yet implemented");
		Customer customer = new Customer();
		customer.setId("khuser01");
		customer.setName("일용자");
		customer.setAge(21);
		
		int result = store.registerCustomer(customer);
//		if(result==1) {
//			System.out.println("성공");
//		}else {
//			System.out.println("실패");
//		} 이것을 대신하여 작업할수 있게 해준다
		assertEquals(1,result);
		
	}

}

했는데 에러난다.....왜냐면 연결한 CustomerStoreLogic와 연결한 것을 찾을 수가 없었던것이다....이걸 직접 연결할수 있도록  @Repository 를 빼고 root-context.xml에 한줄 더 추가한다.

 

<bean id="customerStore" class="com.kh.junspring.customer.store.CustomerStoreLogic"></bean>

또는 

	"file:src/main/webapp/WEB-INF/spring/appServler/servlet-context.xml"})

넣으면 어노테이션으로 할 수도 있다.

그런데 어노테이션을 하려고 2번째방법을 썼더니...이해할수 없는 에러 발생.....

java.lang.IllegalStateException: WebApplicationObjectSupport instance [ResourceHttpRequestHandler ["/resources/"]] does not run in a ...

난 이게 먼지 잘 모르겠다.......servlet-context.xml 파일을 못읽는다는것라는데 잘모르겠음.....

역시 구글링..!!!! 

오류내용 그대로 했더니...

@WebAppConfiguration  붙이면 끝......

된다..^^

Member 로 연습

이건 에러가 난게 아닌다.....메소드가 5개 있는데 그중 한개만 작성해서 진행했고 그게 된거니깐^^ 결과물이 나온다.....앗싸!!!!!!

 

 

 

 

 

 

 

 

 

 

 

추가로 한개 더!! select값이 나오는데...에러는 아닌데 실패로 잡힌다.......한가지 빼머었다..

assertEquals("abcd4",mOne.getMemberId()); 결과값에 관련된 구문을 넣을때 예시다....

결과값중에..mOne.getMemberId() 의 결과값이 abcd4어야 정상이란 주문임..^^

 

 

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16

이번에 해볼것은 한달 이용권을 하고 구매하고 나서 한달을 다 이용하고 나면 자동으로 기간만료를 해주려고 시도한 것들이다.

사람이 체크하지 않고도 자동으로 오라클이 기간만료를 시켜주고 회원테이블에서도 구독자가 아니라고 변경하는 것이다.

 

일단 내가 정리한 내용이다.

 

 

스케줄러 진행시나리오.
구독권 만료권이 지나면 SEASONTICKET_TBL의 EXPIPY_YN 를 Y로 변경//기간만료로 변경//
만료일 지난 것 // select * from SEASONTICKET_TBL where last_date < SYSDATE;  id: timeEX5 자동으로 변경
-> UPDATE SEASONTICKET_TBL SET EXPIRY_YN = 'Y' WHERE MEMBER_ID='timeEX5';
MEMBER_TBL의 SUB_YN을 N으로 변경//구독권을 N으로
-> UPDATE MEMBER_TBL SET SUB_YN='N' WHERE MEMBER_ID='timeEX5';

1 : 오라클 스케줄러 등록을 위한 권한
      GRANT CREATE ANY JOB TO PEANUTBOOKS  / 스케줄러 등록  TO~뒤에 계정명임

 

2 : 명령어
    1. DBMS_SCHEDULER.CREATE_PROGRAM  // JOB이 스케줄러에 맞게 돌면서 실제로 동작하는 프로그램
    2. DBMS_SCHEDULER.CREATE_SCHEDULER // 주기적으로 돌아갈 스케줄을 등록
    3. DBMS_SCHEDULER.CREATE_JOB           // 수행할 작업을 등록

 

3: 사용방법 
   계정은 PEANUTBOOKS// 테이블은 SEASONTICKET_TBL의 EXPIPY_YN 를 Y로 변경//기간만료로 변경//
    MEMBER_TBL의 SUB_YN을 N으로 변경//구독권을 N으로
  2-1 동작 프로그램 등록
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(   
   PROGRAM_NAME => 'PR_SEASON_TK_PROGRAM'      // 프로그램 이름
   , PROGRAM_ACTION => 'PR_SEASON_TK'                     // 실제 액션이 일어난 SP(선등록해야함) 
         , PROGRAM_TYPE => 'STORED_PROCEDURE'        // SP라고 명시
   , COMMENTS => '구독권 만료작업' , ENABLED => TRUE); // 부가설명 // ENABLED - 사용가능 설정
END;


  2-2 스케줄 등록
DBMS_SCHEDULER.CREATE_SCHEDULER(
   SCHEDULE_NAME => 'PR_SEASON_TK_SCHEDULE'           //스케줄러 이름
   , START_DATE => SYSDATE+1/24                                             //1시간에 한번   
   , END_DATE => NULL,                           // 만료시간...영구반복이면 NULL 7일이면 TRUNC(SYSDATE+7)
   , REPEAT_INTERVAL => 'FREQ=DAILY;BYMIMUTE=10;'     

          //반복옵션  'FREQ=MINUTELY;INTERVAL=1' 1분에 1번씩  'FREQ=DAILY;INTERVAL=1' 하루에한번
   , COMMENTS => '구독권 만료작업');                                          //코멘트 부가설명
END;


  2-3 작업 등록
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
   JOB_NAME => 'PR_SEASON_TK_JOB' ,                                      // JOB 명
   PROGRAM_NAME => 'PR_SEASON_TK_PROGRAM' ,               //구동프로그램 명시
          SCHEDULE_NAME => 'PR_SEASON_TK_SCHEDULE_'  ,   //스케줄러이름/ 어떤 스케줄러가 돌것인가  
   COMMENTS => '구독권 만료작업' ,                                               // 코멘트
   ENABLED => TRUE);     
);
END;

4: 내역확인
SELECT * FROM ALL_SCHEDULER_JOBS WHERE JOB_NAME = 'PR_SEASON_TK_JOB';

5: 삭제
execute dbms_scheduler.drop_job('PR_SEASON_TK_JOB' , false); 
execute dbms_scheduler.drop_program('PR_SEASON_TK_PROGRAM' , false);
execute dbms_scheduler.drop_schedule('PR_SEASON_TK_SCHEDULE' , false);


*.job먼저 지우고 program 삭제 
*.program 먼저 지우려고 하면 종속된 객체라면서 안지워짐.


BEGIN
   DBMS_SCHEDULER.DROP_JOB(
        JOB_NAME   => 'PR_SEASON_TK_JOB',
        FORCE      => FALSE);
END;


BEGIN
   DBMS_SCHEDULER.DROP_PROGRAM(
        PROGRAM_NAME   => 'PR_SEASON_TK_PROGRAM',
        FORCE          => FALSE);
END;


6. JOB 하나로 하는 법
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'PR_SEASON_TK_JOB',
   job_type             => 'PLSQL_BLOCK',
   job_action           => 'BEGIN MEM_NPRO.TEST_PROC (TO_CHAR(SYSDATE , ''YYYYMMDD'')); END;', // 작업할 내용 같음
   start_date           => SYSDATE+1/24  
   repeat_interval      => 'FREQ=MINUTELY;INTERVAL=1',
   end_date             =>  NULL,
   enabled              =>  TRUE,
   comments            =>  '구독권 만료작업');
END;

 

이렇게 정리를 하고.......어떻게 해야할지 몰라서 샘찬스!!!!!!

일단 질문전 정리한것은 스케줄러는 시간단위로 쿼리문을 진행해주는 것인데

순서는 프로그램. 일정. job 순이다..

그리고 쉽게 하는 방법을 알려주셨다..

1. 계정 권한을 받고........또는 주고....스케줄러에서 프로그램을 오른쪽마우스 누르고 새프로그램....

2. 그다름 일정이다...스케줄러....원하는 반복 간격설정하면 된다.

3. 마지막 job이다......1차 프로그램으로 선택후에 진행하면 된다.

그럼 자동으로 된다......간단하죠!!

테스트는 알아서~!!!!!!!

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

그래서 한다!!!!ㅋㅋㅋ 구독권 만료 표시를 했으니깐 만료된 정보를 회원테이블에 반영한다.

1. 첫번째 프로그램 생성...

 

SQL문을 PL/SQL블록 하단에 기재 하고 적용하면 됨

 

 

2. 일정//스케줄러

그다음 스케줄러....일정을 만든다.....반복간격넣는데....위에 내용은 일주일기준으로 매일 시간마다 2분에 작동!!!

참고로 시작날짜(NULL)이라고 되어 있는 부분을 체크하면 언제할껀지 입력박스가 뜬다. 난 지금 테스트 할꺼라서

지금 시간으로 설정하고 간격의 분도 15분으로 변경했다.

종료날짜null을 변경하지 않으면 계속 반복한다는 내용임.

 

3. 마지막 JOB

마지막으로JOB 으로 프로그램과 일정을 등록후 적용하면된다.....

1번은 9시에 2번은 10시 3번과 4번은 11시, 5번은 12시에 확인해서 변경되어 있으면 된다.  ,,,,

제발 변경되어 있기를....ㅠㅠ

 

//////////////////// 다음날!!!!

잘 변경되어 있었고 한시간단위로도 잘 변경되었다...그래도 혹시 모르니깐 몇일은 작업해 봐야겠다^^

안되는 원인을 알아 부렸다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

데이타 함수를 쓸때 속성 명을 집어 넣을때는 대문자 안된다.......!!!! 소문자로 넣어야 하는것인데

대문자를 고집하니 안된것이였다.. ㅠㅠ

	function collList() {
		console.log("출력준비");
		var titleNo = ${param.titleNo};
		//$('#after').html('');

		$.ajax({
			url : "/client/listprint.kh",
			type : 'post',
			data : {titleNo : titleNo},
			success : function(result) {
				for ( var i in result) {
					var $chat = $('.chat[data-consult-no="' + result[i].consultNo + '"]'); //값이 undefined가되어 포기						
 			 		if ($chat.length < 1) {						
 						addChat(result[i].consultNo, result[i].cMemberId,
 								result[i].cContexts, result[i].cDate);	 					
					}
				}
			},
			error : function(e) {
				alert('error : ' + e);
			}
		});
	}
	
	function addChat(consultNo, cMemberId, cContext, cDate) {			
		countData++;
		if (cMemberId === 'admin') {
			$('#after').append(
					'<div class="chat right" data-consult-no="' + consultNo +'" >'
							+ '<div class="icon"><img src="../resources/img/live-chat.png"></div>'
							+ '<div class="middleBox"><span class="dateBox">'
							+ cDate + '</span>' + '<span class="contextBox">'
							+ cContext + '</span></div></div>');
		} else {
			$('#after').append(
					'<div class="chat left" data-consult-no="' + consultNo + '">'
							+ '<div class="icon"><img src="../resources/img/programmer.png"></div>'
							+ '<div class="middleBox"><span class="contextBox">'
							+ cContext + '</span><span class="dateBox">'
							+ cDate + '</span>' + '</div></div>');
		}
	}

 

'<div class="chat left" data-consult-no="' + consultNo + '">'  <<<<< 여기에 대문자를 넣었던 이다.

 

 

var $chat = $('.chat[data-consult-no="' + result[i].consultNo + '"]'); //값이 undefined가되어 포기
    if ($chat.length < 1) {  // data-consult-no 값이  있으면 1이고 없으면 0니깐 없을때만 값을 주는 1번째 올림글이 된것이 맞았다.!!!!!! ㅍㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

 

오늘의 결론!! 컴퓨터 언어는 예민하다......대문자도 함부로 넣으면 안된다..ㅠㅠ

 

좌는 기존의 count 이고 우는 수정된 data()로 표현된것이다.

사실 뭔가 차이인가 싶고 코드양도 큰 차이가 없다..깜밖임이 없다.....

전에는 컴퓨터가 난리가 났는데 둘다 없다...코드 한줄이라도 줄이면 좋은거니깐.....^^

일단...안된다......전에 다른 리스트로는 깜빡임이 없었다고 생각했는데....그아이는 해놓고 보니 데이터가 바뀌어야 하는 아이라서 갈아 엎어버렸기에 증거가 없다.ㅠㅠ 된것이 맞는가 의문이 들고 있다...왜냐면...당연히 다른게 아니되니깐..ㅠㅠ

function collList() {
    console.log("출력준비");
    $('#after').html('');

    $.ajax({
        url : "/client/listprint.kh",
        type : 'post',
        data : {
            titleNo : $("#titleNo").val()
        },
        success : function(result) {
            for ( var i in result) {
                var $chat = $('#after > div[data-consultNo="' + result[i].consultNo + '"]');
                if ($chat.length < 1) {						
                    addChat(result[i].cousultNo, result[i].cMemberId,
                            result[i].cContexts, result[i].cDate);	
                };
            };
        },
        error : function(e) {
            alert('error : ' + e);
        }
    });
}

function addChat(consultNo,cMemberId, cContext, cDate) {
    console.log("데이터 올림 확인 : " + cMemberId);
    if (cMemberId != 'admin') {
        $('#after').append(
                        '<div class="right" data-consultNo="' + consultNo + '">'
                                + '<h5 >' + cMemberId + '</h5>'
                                + '<div class="middleBox"><span class="contextBox">'
                                + cContext + '</span>'
                                + '<span class="dateBox">' + cDate
                                + '</span></div></div>');

    } else {
        $('#after').append(
                '<div class="left" data-consultNo="' + consultNo + '">'
                        + '<h5 >' + cMemberId + '</h5>'
                        + '<div class="middleBox"><span class="contextBox">'
                        + cContext + '</span>'
                        + '<span class="dateBox">' + cDate
                        + '</span></div></div>');
    }
}

 

일단 이런코드다....

채팅 내용을 입력하고 창에 띄우는 것인데 앞선것처럼 div에 append가 전체적으로 되니깐 정신사납게깜빡거린다.

보기가 너무너무 시르다....

1. 위의 상태에서 data-consultNo 에 계속 새로운 consultNo값이 덮어지는 것이다. 의미가 없다. 진실 숫자 표시를 해야한다.

2. data()함수는 키와 값이 모두 String이다...... 숫자를 넣어도 어쨌든 " " 화 되어 표기된다.

표기도 잘못되고 보는 법도 잘못되었다. //표기 방법을 정확하게 이해가 안되서 여기저기 검색으로 난리가 난결과로 알아낸 것이다.ㅠㅠ

 

 

$('#after').append(
'<div class="chat right" data-'+consultNo+'="' + consultNo +'" >'
        + '<div class="icon"><img src="../resources/img/live-chat.png"></div>'
        + '<div class="middleBox"><span class="dateBox">'
        + cDate + '</span>' + '<span class="contextBox">'
        + cContext + '</span></div></div>');

정말이지 "++" 와의 전쟁이다....... 지겨울정도로 넣어다 빼었다..........받아온 데이터를 메소드 () 안에 넣을때 너무 해깔린다. 문자임을 뜻하는 ' ' 를 넣을때는 다시 큰따옴표로 감싸서 넣어야 한다..." ' " + (넣을 내용) + " ' " ///난 이런게 안 외워진다..ㅠㅠ 슬프다. 결과나오고 나서는 너무 허탈하다..... ㅠㅠ

 

이렇게 어렵게 구문을 넣고 난리를 쳤는데 data 값이 확인이 안되는것이다.

//var $chat = $('.chat').data("'"+result[i].consultNo+"'"); 값이 undefined가되어 포기

 addChat()에 출력구문에 들어가기전에 값이 있냐없냐를 확인후 진행하고 싶었는데 계속 undefined였다..

일단 아무것도 없는것에 값을 확인하려고 해그런다로 결론... 필요가 없어진 data() ㅠㅠ.

그래서 방법은 .............지식인 샘 찬스로

count로 해결했다.....다른 학생이 알아낸 거였다고 한다..ㅋㅋㅋ

 

var countData=-1;
function collList() {
    console.log("출력준비");
    var titleNo = ${param.titleNo};
    //$('#after').html('');

    $.ajax({
        url : "/client/listprint.kh",
        type : 'post',
        data : {titleNo : titleNo},
        success : function(result) {
            for ( var i in result) {
            //var $chat = $('.chat').data("'"+result[i].consultNo+"'"); 값이 undefined가되어 포기						
            if (i>countData) {						
                    addChat(result[i].consultNo, result[i].cMemberId,
                            result[i].cContexts, result[i].cDate);	 					
                }
            }
        },
        error : function(e) {
            alert('error : ' + e);
        }
    });
}

function addChat(consultNo, cMemberId, cContext, cDate) {			
    countData++;
    if (cMemberId === 'admin') {
        $('#after').append(
                '<div class="chat right" data-'+consultNo+'="' + consultNo +'" >'
                        + '<div class="icon"><img src="../resources/img/live-chat.png"></div>'
                        + '<div class="middleBox"><span class="dateBox">'
                        + cDate + '</span>' + '<span class="contextBox">'
                        + cContext + '</span></div></div>');
        //var a=$('#after>.chat').data(consultNo);
        //console.log("데이터 값 확인: "+ a);

    } else {
        $('#after').append(
                '<div class="chat left" data-'+consultNo+'="' + consultNo + '">'
                        + '<div class="icon"><img src="../resources/img/programmer.png"></div>'
                        + '<div class="middleBox"><span class="contextBox">'
                        + cContext + '</span><span class="dateBox">'
                        + cDate + '</span>' + '</div></div>');
    }
}

일단 완성된 구문이다......append할 countData에 카운트를 하고 

for문에서 countData보다 클때만 값을 addChat()에다가 주는 것이다......

이러니깐 간단하게 끝났따.... 깜빡이지 않는다....진짜찐짜...........data() 아쉽다......

이부분은 다음 기회에 공부해서 다시올것이다.^^

 

 

/////////////////////////////10.31일 데이터...

지금 하는건 날짜로 검색할수 있는 부분을 코딩중!!! 날짜도 기본일테니깐 만들어봐야지...

input  type=date가 있어서 값구하기는 쉬울껏 같은데

문제는 처음에 date값이 들어오지 않을 때 즉 null 일때 mapping 어떻게 해야하는것인가????

controller에서 날짜를 어떻게 줘야하나....

요즘은 계속 date와 싸우고 있다..ㅠㅠ

//		if(csDate==null) { 
//			SimpleDateFormat sdf=new SimpleDateFormat("yy/MM/ss HH:mm:ss"); 
//			cs.setCsDate(sdf.parse("00/00/00")); 
//			System.out.println(cs.getCsDate());
//		}else {
			cs.setCsDate(csDate); 
//		}

처음에 사실 이렇게 date값을 지정하고 싶었는데 아니 먹힘다......안먹힐 줄은 알았는데 똥도 먹어봐야 하니깐ㅋㅋ

string으로 변환될때는 simpledateformat이 먹히는데 그걸 다시 date할때는 그냥 null

null을 어떻게 매핑에 연결하는냐가 나왔는데......

<if test="csMemberId.toString()!='notId' and csDate.toString()=='00-00-00'"> 했는데 아닌 것 같고
<if test="csMemberId.toString()!='notId' and csDate=='null'">

1은 어쨋든 아니고........2번도 안되고......

 

일딴 결과는 이렇게 결론이 났음당!

		cs.setCsDate(csDate);

컨트롤러에서는 어차피 null도 받고 날짜 값도 받을거라서 그냥 둔다.

/* 	$('input[type="date"]').val(); ==>	'2022-10-24' */

이렇게 받을꺼니깐~~

	  		<if test="csDate==null and csMemberId.toString()=='notId'">CS_RESULT !='N'</if>
	  		<if test="csDate!=null and csMemberId.toString()=='notId'">TO_CHAR((CS_DATE),'YYYY-MM-DD')=${csDate } AND CS_RESULT !='N'</if>
	  		<if test="csDate==null and csMemberId.toString()!='notId'">CS_MEMBERID=${csMemberId } AND CS_RESULT !='N'</if>

mapping에서 이렇게 조건을 달아줍니다....

나의 무식은 ==null에서 ' ' 자꾸 붙였다는것!    null에서는 붙일 필요가 없었다.....

간단히 해결되었음..........오라클 나빳어!!!!

 

///////////////////////////////10월31일 미완성...

 

다음날 다시보니 글 속에 이해될만 한걸 넣은게 없다.......다시 봐도 잘 모르겠다.....일단 전날에 null값을 확인하는건 매핑에서 'null'로 넣었던걸 그냥 null로 넣었더니 해결되었다가 결론이다.

근데 문제들이 생겼다...데이터가 계속 null이 아닌 것이다.

id값도 주고 받아야하고 date 값도 주고 받아야 하는데

controller에서 되면 jsp에서 안되고 jsp에서 되면 다시 controller에서 안된다....여기다 page도 하려니 돌아가시겄다.

막고 수정하고 교정하고 다시 수정하고 했더니....내가 뭐하던 중이였지~~~~~ 싶다.

일단 1차 정리 한다.....

 

1. jsp화면에서 검색은 전체/ 아이디/ 날짜 로 검색한다.

<div id="searchbtn">
			<label for="select"></label>
			<select name="chatEndList" id="select">
				<option value="all" checked>전체</option>
				<option value="id">아이디</option>
				<option value="date">날짜</option>
			</select> 
			<%-- <c:if test="${empty param.csMemberId } ">
				<input type="text" style="display:none" placeholder="ID를 입력하세요" 	>	
			</c:if> --%>
			
			<input type="text" style="display:none" >						
			<input type="date" style="display:none">				
			<button onclick="chatsearch();">검색</button>

		</div>

일단 저기서 넘어온 param값으로 뭔가 해보려고 c:if를 썼는데 결론은 아무 의미 없었다....다 삭제 !!

 

/* 검색창 display  */
	$('#select').on('change',function(){
		if($('#select option').eq(1).is(':checked')){
			$('input[type="text"]').show();
			$('input[type="date"]').hide();
		}else if($('#select option').eq(2).is(':checked')){
			$('input[type="date"]').show();
			$('input[type="text"]').hide();
		}else{
			$('input[type="text"]').hide();
			$('input[type="date"]').hide();
		}
	});
	

		var csDate=$('input[type=date]').val();
		var memberId=$('input[type=text]').val();
	
	/* 페이징  */
	function pageChatSearch(page){
	//var csDate=$('input[type=date]').prop('defaultValue'); 	
		var csDate=$('input[type=date]').val();		
		//var memberId=$('input[type=text]').val();
		var memberId="${csMemberId}";
		
		location.href="/consult/endList.kh?page="+page+"&csMemberId="+memberId+"&searchDate="+csDate;
	}
	/* 검색버튼  */
	function chatsearch(){
		var csDate=$('input[type=date]').val();
		var memberId=$('input[type=text]').val();
		if($('#select option').eq(1).is(':checked')){	
			location.href="/consult/endList.kh?csMemberId="+memberId;
		}else if($('#select option').eq(2).is(':checked')){
			location.href="/consult/endList.kh?searchDate="+csDate;
		}else{
			location.href="/consult/endList.kh";
		};
			
	}

검색창에서 뭘 선택했느냐에 따라 input이 보이게 하고 싶어서 해보고...

검색버튼이 누르면 그 데이터를 가지고 가는 것이다.

//var csDate=$('input[type=date]').prop('defaultValue'); 오론짓도 해봤다....

dafaultValue가 기본값을 가져오는건데 이러면 입력값을 못가져 와서 삭제 해부렸다.

<div class="page_wrap">
    <div class="pagination">

        <c:if test="${pm.startNavi !=1}">
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${1});
                    title=" firstpage"><svg
                    fill="currentColor">
    <path
                        d="M17.59 18L19 16.59 14.42 12 19 7.41 17.59 6l-6 6zM11 18l1.41-1.41L7.83 12l4.58-4.59L11 6l-6 6z" /></svg>
                First</a>
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${pm.startNavi -1});										
                    title="
                previouspage"><svg fill="currentColor">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" /></svg> </a>
        </c:if>
        <c:forEach begin="${pm.startNavi}" end="${pm.endNavi }" var="p">

            <a class="page-active" href="javascript:void(0);"
                onclick="pageChatSearch(${p});"> <%-- 	href="/consult/endList.kh?page=${p }&memberId=${memberId}&csDate=$('input[type=date]').prop('defaultValue') "> --%>
                ${p}
            </a>

        </c:forEach>


        <c:if test="${pm.maxPage > pm.currentPage }">
            <a title="next page" href="javascript:void(0);"
                onclick="pageChatSearch(${pm.endNavi+1});"><svg
                    fill="currentColor">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" /></svg></a>
        </c:if>
        <c:if test="${(pm.endNavi %5)==0 && pm.maxPage != pm.endNavi }">
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${pm.maxPage});" title="last page">Last<svg
                    fill="currentColor">
    <path
                        d="M6.41 6L5 7.41 9.58 12 5 16.59 6.41 18l6-6zM13 6l-1.41 1.41L16.17 12l-4.58 4.59L13 18l6-6z" /></svg></a>
        </c:if>
    </div>

페이징 구민이다....사실 여기서 중요한건 a링크에 처음에 그냥

href="/peanut/listStart.kh?page=${pm.endNavi+1}&memberId=${loginMember.memberId}"

넣었으나 이런형식으로 역시null처리가 어려워서 함수 넣는 걸로 바꾸기 위해 onclick으로 변환!

더불어서 저형태에서는 csDate가  null도 안되고 날짜 형식이 아니어도 안보내줬다

...사실 뒤돌아 보면 처음에 null처리가 안되서 그렇치 가능도 했을것 같다...중간에 방향성을 잃어서 못한듯.....하다보면 잡히것지.

 

<% String csDate= request.getParameter("csDate")==null?"":request.getParameter("csDate");%>

중간에 csDate땜시 이런것도 했는데....의미 없는듯.....

 

2번째 controller

null값을 어떻게 처리 하는지 열심히 검색하였다....짝꿍이 새로운걸 알려 줘서 혹시나 해서 기록을 일단 남겨둔다.

@RequestParam(value="csDate") Optional <Date> date,
@RequestParam(value = "searchDate", required = false) String csDate

if(date.ofNullable(csDate) != null) {
	//	if(csDate != null) {
//			cs.setCsDate(csDate); 
//		}else if(csDate.equals("9999-01-01")){
//			cs.setCsDate(null); 
//		} else {
//			cs.setCsDate(null); 
//		}

 

optional은 null값을 처리하는 새로운 객체인데.....검색결과 이걸로 뭔 데이터를 얻으려하면 안된다...그냥 비교만 해야한다.

중간에 9999부분에서 역시나 다시 막혀버렸다.......

나의 구세주 샘찬스 에서 요 부분은 날려버렸다.!! 혹시나 해서 일단 기록 만 남겨둔다.

 

	// 관리자가 종료건 검색 화면으로 이동
	@RequestMapping(value = "/consult/endList.kh", method = RequestMethod.GET)
	public ModelAndView endListSearch(ModelAndView mv,
			@RequestParam(value = "searchDate", required = false) String csDate,
	    	@RequestParam(value = "page", required = false) Integer page,
	    	@ModelAttribute ConsultServer cs) throws ParseException {
		Pagemarker pm = new Pagemarker();
		SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd");
		if(csDate != null && !csDate.equals("")) {
			cs.setCsDate(smf.parse(csDate));
		}

		int totalCount = cService.getTotalCount(cs);
		int currentPage = (page != null) ? page : 1;		
		
		pm.pageInfo(currentPage, totalCount);
		mv.addObject("pm", pm);
		
		List<ConsultServer> chatList = cService.printEndListChat(pm, cs);
		mv.addObject("chatList", chatList);
		mv.addObject("csMemberId", cs.getCsMemberId());
		mv.addObject("csDate", csDate);		
		mv.setViewName("/consult/chatEndList");
		return mv;
	}

요렇게 정리했다..

 

이제 마지막 매핑이 남았다....

여기서 문제가 남아 있다......마지막 검색창에서 입력된  ex) 2022-10-28 string값을 다시 넣어줘서 매핑으로 보내줘야 하지 않는가????

cs.setCsDate(smf.parse(csDate));

(이넘이 날 젤로 개롭힌다....뭔가 될것같은 희망만 넣어주고는 암것도 안되는 이상한넘....

정리하면서 string 으로 변환할때는 괜찮은데 이걸 다시 date화 할때는 아무짝도 쓸모없다.!!!)

.문제는 야가 다시 데이터화가 되면 줫던 형태가  아닌 .'Fri Oct 28 00:00:00 KST 2022'  요론 형태로 오는 것이다.......

이걸 다시 어떻게 비교 처리 하느냐가 남는것이다.

요까지가 어제 4~부서 다음날 오후 3시까지 한 작업이다.....

//////////////////////////////////////////////////////////////////////////////////////////////////////// 결과 두~둥!!!!!

매핑에서 내가 원하는 날짜값을 바꿀 검색이 안된다!!!!!!!!

내가 요즘 date형색땜시 폭풍검색.....까진 아니다...난 좀 느리니깐....ㅋㅋ

 

암튼 바꿀 지식검색이 안되서 포기한다...ㅠㅠ controller뒤엎기...참고로 뒤엎고 한시간만에 해결!!!

@RequestMapping(value = "/consult/endList.kh", method = RequestMethod.GET)
	public ModelAndView endListSearch(ModelAndView mv,
			@RequestParam(value = "searchDate", required = false) String csDate,
	    	@RequestParam(value = "page", required = false) Integer page,
	    	@RequestParam(value = "csMemberId", required = false) String csMemberId) {
		Pagemarker pm = new Pagemarker();
		int totalCount = cService.getTotalCount(csMemberId,csDate);
		int currentPage = (page != null) ? page : 1;
		pm.pageInfo(currentPage, totalCount);
		mv.addObject("pm", pm);
		
		List<ConsultServer> chatList = cService.printEndListChat(pm, csMemberId,csDate);
		mv.addObject("chatList", chatList);
		mv.addObject("csMemberId", csMemberId);
		mv.addObject("csDate", csDate);		
		mv.setViewName("/consult/chatEndList");
		return mv;
	}

 

근데 바꾸고 보니깐 전보다 심플해짐..ㅋㅋ

 

  	<!-- 종료 상담건 조회 -->
  	<select id="chatEndList"  resultMap="ChatResultMap">
  		SELECT * FROM CHATSERVER_TBL 
  		 	<where>
	  		<if test="(csDate==null or csDate == '') and (csMemberId == null or csMemberId == '' )">CS_RESULT !='N'</if>
	  		<if test="(csDate!=null and csDate != '') and (csMemberId == null or csMemberId == '')">TO_CHAR((CS_DATE),'YYYY-MM-DD')=#{csDate } AND CS_RESULT !='N'</if>
	  		<if test="(csDate==null or csDate == '') and (csMemberId !=null and csMemberId != '') ">CS_MEMBERID=#{csMemberId } AND CS_RESULT !='N'</if>
	  		</where>
  		ORDER BY TITLE_NO DESC
  	</select>
  		
  	<!--채팅 종료 리스트 전체 카운트 조회  -->
	<select id="chatListcount"  resultType="_int">
  		SELECT count(*) FROM CHATSERVER_TBL 
  		 	<where>
	  		<if test="(csDate==null or csDate == '') and (csMemberId == null or csMemberId == '' )">CS_RESULT !='N'</if>
	  		<if test="(csDate!=null and csDate != '') and (csMemberId == null or csMemberId == '')">TO_CHAR((CS_DATE),'YYYY-MM-DD')=#{csDate } AND CS_RESULT !='N'</if>
	  		<if test="(csDate==null or csDate == '') and (csMemberId !=null and csMemberId != '') ">CS_MEMBERID=#{csMemberId } AND CS_RESULT !='N'</if>
	  		</where>
  		ORDER BY TITLE_NO DESC
  	</select>

날짜 값이 반영될때까지 수많은 헛타이핑을 그 얼마나 해대었던가~~~~~~~~~~~~~~~~~~~~~~~손구락!!!보다 손목아프다

이제 버튼 꾸미러 값니다!!!!!! 좀 셨다가.........

지금 하는건 날짜로 검색할수 있는 부분을 코딩중!!! 날짜도 기본일테니깐 만들어봐야지...

input  type=date가 있어서 값구하기는 쉬울껏 같은데

문제는 처음에 date값이 들어오지 않을 때 즉 null 일때 mapping 어떻게 해야하는것인가????

controller에서 날짜를 어떻게 줘야하나....

요즘은 계속 date와 싸우고 있다..ㅠㅠ

//		if(csDate==null) { 
//			SimpleDateFormat sdf=new SimpleDateFormat("yy/MM/ss HH:mm:ss"); 
//			cs.setCsDate(sdf.parse("00/00/00")); 
//			System.out.println(cs.getCsDate());
//		}else {
			cs.setCsDate(csDate); 
//		}

처음에 사실 이렇게 date값을 지정하고 싶었는데 암먹힘다......안먹힐 줄은 알았는데 똥도 먹어봐야 하니깐ㅋㅋ

string으로 변환될때는 simpledateformat이 먹히는데 그걸 다시 date할때는 그냥 null

null을 어떻게 매핑에 연결하는냐가 나왔는데......

<if test="csMemberId.toString()!='notId' and csDate.toString()=='00-00-00'"> 했는데 아닌 것 같고
<if test="csMemberId.toString()!='notId' and csDate=='null'">

1은 어쨋든 아니고........2번도 안되고......

 

일딴 결과는 이렇게 결론이 났음당!

		cs.setCsDate(csDate);

컨트롤러에서는 어차피 null도 받고 날짜 값도 받을거라서 그냥 둔다.

/* 	$('input[type="date"]').val(); ==>	'2022-10-24' */

이렇게 받을꺼니깐~~

	  		<if test="csDate==null and csMemberId.toString()=='notId'">CS_RESULT !='N'</if>
	  		<if test="csDate!=null and csMemberId.toString()=='notId'">TO_CHAR((CS_DATE),'YYYY-MM-DD')=${csDate } AND CS_RESULT !='N'</if>
	  		<if test="csDate==null and csMemberId.toString()!='notId'">CS_MEMBERID=${csMemberId } AND CS_RESULT !='N'</if>

mapping에서 이렇게 조건을 달아줍니다....

나의 무식은 ==null에서 ' ' 자꾸 붙였다는것!    null에서는 붙일 필요가 없었다.....

간단히 해결되었음..........오라클 나빳어!!!!

+ Recent posts