설문조사형 플랫폼 구현(사용자)
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";
}
Author And Source
이 문제에 관하여(설문조사형 플랫폼 구현(사용자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@900522z/설문조사형-플랫폼-구현저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)