설문조사형 플랫폼 구현(사용자)

Intro.

22.02.24 첫 번째 프로젝트를 마쳤다.
여러 변수가 있었지만 기대했던 것과 비슷한 결과를 낼 수 있어 다행이었다.
(사실 이상 그 자체가 아니라 좀 아쉬운 부분이 있다. 그래도 차츰 수정하는 걸로)

그러다 같이 프로젝트를 진행했던 분이 내 코드를 보고 질문했던 게 생각났다.
질문의 요점은 '이 코드는 어떤 역할을 하고, 왜 이렇게 작성했는지'였다.

당시에 진짜 어설프게 설명했다.
내가 질문한 사람이었으면 뭐라고 하는 건지 이해가 안 됐을 거다.

(물어본 이유는 제 코드를 보고 자신의 문제를 해결하기 위해서 물어본 거였다.)

막상 작성해놓고 본인이 작성한 코드도 헷갈렸다.

이런 일이 반복돼서는 안 돼

이 상황은 어떤 방향으로든 문제가 심각하다고 판단해,
프로젝트에서 사용한 코드를 분석해 기록하기로 했다.
그리고 앞으로도 기록할 것이다.

하다보면 쓴 코드의 의도를 상세히 기억할 수도 있고,
내가 작성하지 않은 코드라도 빠르게 읽을 수 있겠지?


(사용자, 메인페이지)

닉네임 등록 기능 구현

  • 닉네임을 입력 후 엔터키 이벤트 통해 입력한 닉네임이 DB에 등록되고
    설문조사 페이지로 이동하는 기능
	/* 닉네임 등록 */
//	==/regist, method post 함수 역할==
//			1. userNick에서 닉네임 입력 후 엔터를 누르면 
//				1-1. 닉네임이 등록된다. 
//					1-2. 첫 질문지 인덱스값을 조회한다.
//						1-3. 그 값을(첫 질문지 인덱스값)을 /survey 주소로를 포함시켜 이동.
	@Override
	@RequestMapping(value = "/regist" , method = RequestMethod.POST)
	public String registNick(UserDTO userDTO, MyAnswerDTO myAnswerDTO ,
    HttpServletRequest request, RedirectAttributes rAttr) throws Exception {
		
		session = request.getSession(); 
		List<AdminAskDTO> askDTO = userService.selectAsk(); 
		// 설문지의 첫 질문지의 ask_id 값을 조회하기 위해 사용
>       // 근데 왜 list로 받아왔을까?
		-> 내가 작성한 코드가 아니라 물어봤다.
        원래는 One으로 했는데, 웬만하면 list로 받는 게 좋다는 의견이 있어 list로 받았다고 했다.
        구체적으론, 나중에 수정 작업할 때 용이하게 하기 위해서라고 들었다.
		  
		List<AdminAnswerDTO> answerDTO = userService.selectAnswer();
> 		// 사실 위에 건 없어도 되는 코드다.
		-> 근데 사용하지 않은 코드가 있으면 어떤 문제가 발생하는 걸까?
       	  
		 userService.registNick(userDTO);
         // 닉네임 등록하는 method
		  
		 userDTO.setUser_idx(userService.selectUser(userDTO));
         // 가장 최근에 등록한 usernick의 idx를 가져오는 selectUser 메서드를 이용해
         userDTO에 담아 userDTO.setUser_idx에 설정한다.
		  
		 log.info("UserDTO : " + userDTO); log.info("닉네임 등록 성공");
		  
		 session.setAttribute("nick", userDTO);
         // 등록한 닉네임의 user_idx를 기반으로 설문조사 답안을
         저장할 것이기 때문에 다른 기능에서도 사용할 수 있기 session에 설정한다.
		 
		return "redirect:/survey?ask_idx="+askDTO.get(0).getAsk_idx()+
        "&user_idx="+userDTO.getUser_idx();
        // 닉네임 등록 및 설정 후 설문지의 첫 질문지 페이지로 넘어가기 위해 return 값 설정
		
	}

설문조사 질문리스트 가져오기

  • 닉네임을 등록 후 설문지로 넘어오면 등록된 질문지와 답변을 리스트로 가지고 온다
/* 설문조사 질문리스트 가져오기 */
//	==/survey, method get 함수 역할==	
//			1. /regist, method post 함수에서 받아온 파라미터를 확인한다.
//			2. 받아온 파라미터로 질문지를 조회한다.
//			3. 받아온 파라미터로 선택지를 조회한다.(1,2번과 동일한 파라미터)
//			4. jsp 페이지에서 확인한다.
	@Override
	@RequestMapping(value = "/survey" , method = RequestMethod.GET)
	public String surveyAskList(MyAnswerDTO myAnswerDTO, UserDTO userDTO, 
    AdminAskDTO askDTO, AdminAnswerDTO answerDTO, Model model,
    HttpServletRequest request) throws Exception {
		
		log.info("survey페이지 진입");
		
		session = request.getSession();
        //다른 기능에서도 사용하기 위해 session을 전역변수로 설정해두었다.
        이 session에 request.getSession()을 가져온다.
        
		userDTO = (UserDTO) session.getAttribute("nick");
>       //세션에 등록된 닉네임의 idx를 가져오기 위해 
		session에 담은 nick을 userDTO에 담는다.
        -> 근데 왜 담을까?
        아래 userDTO.getUser_idx()에서 가져오기 위해 담는다.
		
		int nickIdx = userDTO.getUser_idx();
		String userInfo = userDTO.getUser_nick();
        //userDTO에는 session에서 가져온 nick이 설정되어 있다.
        사용자가 선택한 답변을 저장하기 위해 userDTO에 담긴 정보들을 가져와
        변수로 지정해 준다.
        
		int answerIdx = answerDTO.getAnswer_idx();
        // 선택한 답변의 idx값을 가지고 오기 위해 변수로 담았다.
		
		myAnswerDTO.setUser_nick(userInfo);
		myAnswerDTO.setUser_idx(nickIdx);
		myAnswerDTO.setAnswer_idx(answerIdx);
        // 변수에 담은 것들을 
       사용자가 선택한 답변을 저장하기 위해 myAnswerDTO에 담는다.
		
		List<AdminAskDTO> askListDTO = userService.askList(askDTO);
		model.addAttribute("ask", askListDTO);	
>       // 모델에 저장해준 "ask"는 jsp에서만 쓰인다.
		
		List<AdminAnswerDTO> answerListDTO = userService.answerList(answerDTO);
		model.addAttribute("answer", answerListDTO);

		return "/ezdiary/user/userSurvey";
	}

설문조사 페이지의 설문지 진행 경과를 알려주는 프로그래스 바 (ajax 이용)

  • 설문지의 답변을 선택할 때마다 질문지의 번호와 내용이 변경된다.
    질문지의 번호로 프로그래스 바를 이용해서 현재 질문지 번호를 알 수 있고, 진행률에 따라
    프로그래스 바에 위에 있는 볼의 위치가 좌 -> 우로 변동된다.
	@Override
	@ResponseBody
	@RequestMapping(value = "/bar" , method = RequestMethod.POST)
	public Map<String, Object> prograssBar(AdminAskDTO askDTO) throws Exception {
		
        //해당 Contrller는 ajax에서 정보를 받아와 접근하는 방식으로 설정되어 있다.
		System.out.println("Bar ajax 접근");
		
		Map<String, Object> result = new HashMap<String,Object>();
		
		result.put("ajaxAsk",userService.ajaxAsk(askDTO));
        //정보를 받을 jsp에 userService.ajaxAsk(askDTO)의 정보를 넘겨주기 위해서
        ajaxAsk로 설정하고 Map 타입으로 저장한다.
		
		return result;
        //result에 담긴 ajaxAsk 정보로 질문 번호와 bar의 위치가 변동한다.
        
	}

다음 질문지를 가져오기(ajax 이용)

  • 다음 질문지와 질문지에 맞는 답변지를 가져오기
 	  @Override
	  @ResponseBody
	  @RequestMapping(value = "/survey2" , method = RequestMethod.POST) 
	  public Map<String, Object> testAjax(@RequestParam("ask_idx") int ask_idx, 
      AdminAnswerDTO answerDTO, AdminAskDTO askDTO)
	  throws Exception {
      		
      System.out.println("ask_idx : "+ ask_idx);  
	  //survey에서 넘어온 ask_idx를 확인
      
	  System.out.println("ajax 컨트롤러 접근");
	  
	  Map<String, Object> result = new HashMap<String,Object>();
	  
	  result.put("ajaxAsk",userService.ajaxAsk(askDTO));
      // 현재 ask_idx보다 큰 다음 ask_idx를 가져온 후 result에 담는다
	  result.put("ajaxAnswer",userService.ajaxAnswer(answerDTO));
	  // 현재 ask_idx보다 큰 다음 ask_idx의 답변지를 가져온 후 result에 담는다.
      
	  return result; 
      // ajax success시 처리를 위해
      위 정보들을 담은 result를 userSurvey.jsp에 반환한다.
	  
	  }

사용자가 선택한 답변 확인하기

  • 모든 설문지의 답변을 끝내면 로딩 화면으로 넘어간 후 로딩이 끝난 후
    질문지와 사용자가 선택한 답변이 나오고,
    하고 싶은 말을 입력할 수 있는 입력창과 버튼이 나온다.
    그 중 이 메서드는 질문지와 사용자가 선택한 답변을 가져오는 기능을 한다.
	/* 하고싶은말 등록 페이지 */
	@Override
	@RequestMapping(value = "/msgPage" , method = RequestMethod.GET)
	public String msgPage(MyAnswerDTO myAnswerDTO, Model model, 
    HttpServletRequest request) throws Exception {
		
		log.info("하고싶은말 등록 페이지 진입");
		
		session = request.getSession();
		userDTO = (UserDTO)session.getAttribute("nick");
		
		int userIdx = userDTO.getUser_idx();
		
		myAnswerDTO.setUser_idx(userIdx);
        // userIdx을 기준으로 사용자가 선택한 답변을 가져오므로 
        myAnswerDTO에 userIdx를 설정한다.
		
> 		List<MyAnswerDTO> mySurveyList = userService.mySurveyList(myAnswerDTO);
		//설정한 myAnswerDTO.setUser_idx로 mySurveyList의 쿼리를 실행해
        mySurveyList에 값(질문지 번호와 답변 번호와 내용들)을 받아온다.
		model.addAttribute("mySurveyList", mySurveyList);
		
		int userCount = adminService.userTotalCount();
        //footer에 이 설문지를 완료한 사용자 수를 보여주기에 위해 작성
		 model.addAttribute("userCount", userCount);
		
		
		return "/ezdiary/user/userMsg";
	}

하고 싶은 말 작성

  • 하고 싶은 말 글 상자에 내용을 작성하고 내용을 DB에 insert한다
	@Override
	@RequestMapping(value = "/msg" , method = RequestMethod.POST)
	public String sendMsg(UserMsgDTO userMsgDTO , HttpServletRequest request) 
    throws Exception {
		
		log.info("userMsgDTO : " + userMsgDTO );
		session = request.getSession();
		userDTO = (UserDTO)session.getAttribute("nick");
		
		int userIdx = userDTO.getUser_idx();
		String userNick = userDTO.getUser_nick();
		
//		System.out.println("메세지 작성 useridx : " + userIdx);
		userMsgDTO.setUser_idx(userIdx);
		userMsgDTO.setUser_nick(userNick);
		
		userService.sendMsg(userMsgDTO);
        
		return "redirect:/result";
	}

좋은 웹페이지 즐겨찾기