코딩항해기

[Error/Spring] (기능 검증) 회원 정보 업데이트 불가 본문

Error solution

[Error/Spring] (기능 검증) 회원 정보 업데이트 불가

miniBcake 2024. 11. 1. 09:59

 

 

팀프로젝트에서 MVC를 연결하기 위해 회원 정보 업데이트 기능을 테스트 해보려고 하니 작동이 되지 않으며 예외가 발생했다.

 

해당 기능은 담당하지 않은 파트라 아직 코드를 전혀 모르기 때문에 브라우저와 콘솔만 확인하고 파악했을 때는 View와 Controller의 복합적인 문제로 보인다.

 

1. view에서 데이터를 정확한 명칭으로 전달하지 못해 발생하는 null

2. 에러 발생 시 없는 error 페이지로 이동하도록 설계된 Controller 로직 미스..

 

 

View

데이터를 전달하지 못하는 문제를 해결하기 위해 View를 확인했다.

데이터 명 관련해서는 두 가지 문제가 있었고, 해당 문제를 해결했다.

 

1-1. 입력창에 name 속성이 지정되어있지 않은 문제

1-2. name 속성이 정해진 데이터명과 일치하지 않는 문제

 

해당 문제를 해결하자 정상적으로 데이터가 넘어가 update가 진행되는 것을 확인했다.

(member 테이블의 unique 제약조건은 미리 해제 해둔 상태로 동일한 값으로 덮어쓰는 것을 가능하도록 해둔 상태이다.)

 

 

Controller

 

단순 error페이지 설계문제라면 update 성공 시에는 정상 페이지로 이동해야하는데 이동하지 못하는 걸 보니 Controller 로직 자체가 설계를 따르지 않는 것을 보인다. 또한 비밀번호가 업데이트 되지 않는 문제가 있다. 해당 문제를 해결하기 위해 Controller 코드를 확인했다.

 

2-1. 페이지 이동 값 설계 위반 문제

2-2. 비밀번호 업데이트 미진행 문제

 

	@PostMapping(value = "/updateMypage.do") // 회원 정보 변경 후 DB에 변경된 데이터 저장 해주는 controller
	protected String updateProfile(HttpSession session, HttpServletRequest request, MemberDTO memberDTO) {
		log.info("[UpdateProfile] 시작");

		int userPK = (int) session.getAttribute("userPk");

		memberDTO.setCondition("UPDATE_CONDITION");
		memberDTO.setMemberNum(userPK);
		log.info("[UpdateProfile View에서 전달 받은 값] : {}", memberDTO);

		// 프로필 사진 업로드 처리
		String path = "uploads/"; // 업로드할 경로
		String fileName = FileUtil.createFileName(); // 파일 이름 생성
		String profilePicPath = FileUtil.insertFile(request.getServletContext(), path, memberDTO.getFile(), fileName);
		log.info("[UpdateProfile View에서 전달 받은 프로필 경로] : {}", profilePicPath);

		memberDTO.setMemberProfileWay(profilePicPath);

		boolean flag = memberService.update(memberDTO);
		if (!flag) {
			return "redirect:error.jsp";
		}
		return "redirect:mainPage.do";

	}

 

코드를 보면 하단의 return 부분에서 설계와 달라진 것을 확인할 수 있다.

또한 업데이트 로직에서 비밀번호 수정에 대한 입력값이 있다면 해당 업데이트를 별도로 진행해야하는데 (비밀번호는 DB에서 반환해주지 않기 때문에 덮어쓰기 할 수 없기 때문이다.) 해당 로직이 없는 것을 확인할 수 있다.

 

	@PostMapping(value = "/updateMypage.do") // 회원 정보 변경 후 DB에 변경된 데이터 저장 해주는 controller
	public String updateProfile(HttpSession session, HttpServletRequest request, MemberDTO memberDTO) {
		log.info("[UpdateProfile] 시작");
		log.info("[UpdateProfile View에서 전달 받은 값] : {}", memberDTO);
		memberDTO.setCondition("UPDATE_CONDITION");
		memberDTO.setMemberNum((int)session.getAttribute(SESSION_PK));

		// 프로필 사진 업로드 처리
		String path = "uploads/"; // 업로드할 경로
		String fileName = FileUtil.createFileName(); // 파일 이름 생성

		//파일 저장
		String profilePicPath = FileUtil.insertFile(request.getServletContext(), path, memberDTO.getFile(), fileName);
		log.info("[UpdateProfile 새로 생성한 프로필 이미지 이름] : {}", profilePicPath);

		memberDTO.setMemberProfileWay(profilePicPath); //DB에 저장하기 위해 저장한 파일명 세팅
		//비밀번호를 제외한 업데이트 진행
		if(!memberService.update(memberDTO)) {
			log.error("log: updateMypage - normal update error");
			return FAIL_DO; //기본 실패처리로 진행
		}
		log.info("log: updateMypage - normal update success");

		//비밀번호 업데이트
		if(!memberDTO.getMemberPassword().isEmpty()){ //view에서 검증, input값이 넘어오기 때문에 null일 경우 없음
			log.info("log: updateMypage - password update progress");
			//비밀번호 업데이트도 진행된다면
			memberDTO.setCondition("UPDATE_PASSWORD_CONDTION");
			if(!memberService.update(memberDTO)){
				//비밀번호 업데이트 실패 시
				log.error("log: updateMypage - password update error");
				return FAIL_DO; //기본 실패처리로 진행
			}
			log.info("log: updateMypage - password update success");
		}
		//변경될 수 있는 회원 정보 세션 업데이트 진행
		session.setAttribute(SESSION_NICKNAME, memberDTO.getMemberNickname());
		session.setAttribute(SESSION_PK, memberDTO.getMemberNum());
		session.setAttribute(SESSION_PROFILE, memberDTO.getMemberProfileWay());
		//마이페이지로 이동
		return "redirect:infoMypage.do";
	}

 

 

일부 주석의 위치와 내용이 잘못 되어 있어 해당 부분의 내용을 수정해 정확한 정보를 콘솔창에 찍을 수 있도록 수정했으며, 추가 로직과 비밀번호 업데이트 로직을 추가했다. 또한 세션 정보도 함께 갱신할 수 있도록 추가했다.

 

설계에 맞는 요청을 보낼 수 있도록 추가했으며 실패 시에는 메인화면으로 이동하는 기본 실패 스위트 알랏창 페이지로 보낼 수 있도록 했다.

 

 

확인

 

정상적으로 회원 정보 + 비밀번호가 업데이트되어 마이페이지로 돌아오는 것을 확인할 수 있었다.

다만 view에서 검증을 전혀 진행하고 있지 않고 있어... 해당 부분 수정을 View에 요청해야할 것 같다.