Spring 쇼핑몰 만들기 -4 회원가입 (2)

다음으로 해야할 것은 아이디 중복회원 검사와 비밀번호와 비밀번호 확인이 입력 값이 일치하는지를 확인 해야 합니다.

전에는 어노테이션을 이용해서 Size, Pattern등 간편하게 구현했지만 이번에는 Validator를직접 구현해 주어야 합니다.

JSP 화면 처리

우선 home.jsp에서 중복확인 버튼을 눌렀을 때를 구현합니다.

button에 onclick으로 checkExistMember( )이라고 해줍니다.


버튼을 눌렀을 때 input박스에 있는 아이디를 ajax방식으로 전송하게 되고 결과가 true를 반환하면 member_id_exist가 true / false를 반환하면 member_id_exist도 false를 변경되게 끔 합니다.

여기서 member_id_exist는 사용자가 중복확인 버튼을 누르지 않고 회원가입 버튼을 눌렀을 때 오류가 나게끔 하도록 할 것이기 때문에 form태그 안에 hidden박스로 넣어놓고

MemberDto를 modelAttribute로 넘길 때 생성자로 member_id_exist변수를 false로 지정해줍니다.

그래서 중복확인을 해서 아이디가 없으면(true라면) member_id_exist도 true로, 기존 아이디가 존재한다면(false라면) 변수를 false로 변경해서, 회원가입 폼을 다 작성하고 회원가입 버튼을 누르면 커스텀 Validator를 통해서 member_id_exist가 false라면 에러가 되도록 하고, true라면 정상적으로 회원가입이 되도록 합니다.

중복 회원 ajax처리

ajax로 전송한 아이디는 Controller가 아닌 RestController에서 처리합니다.

@RestController
public class MemberApiController {
	
	@Autowired
	private MemberService memberService;
	
	@PostMapping("/api/checkExistMember/{member_id}")
	public String chkExistMember(@PathVariable("member_id")String member_id) {
		boolean state = memberService.chkExistMember(member_id);
		
		return state + "";
	}
	
}

Service

@Service
public class MemberService {
	
	@Autowired
	private MemberDao memberDao;
	
	public void joinMember(MemberDto memberDto) {
		memberDao.joinMember(memberDto);
	}

	public boolean chkExistMember(String member_id) {
		String find_member_id = memberDao.findMemberId(member_id);
		
		if(find_member_id == null) {
			return true;
		}else {
			return false;
		}
	}

DB에서 회원아이디를 이용해서 값을 가져오는데 해당 값이 없으면 boolean을 리턴으로 true, 아이디가 존재하면 중복된 회원이므로 false를 리턴하도록 한다.

Dao

	public String findMemberId(String member_id) {
		return sqlSessionTemplate.selectOne("member.find_member_id", member_id); 
	}

Validator 커스터마이징

Validator를 상속받는 클래스를 하나 만들어 줍니다.

support 메소드에 검증받기 위한 객체를 등록해주고, validate에서 검증을 구현합니다.
target을 이용하여 검증 객체를 가져오고, errors를 이용하여 modelAttribute의 이름을 가져옵니다.

회원가입때 사용하려는 modelAttribute의 이름인 joinMemberBean의 이름이 같고, 이 객체의 password와 password2의 값이 같지 않다면 member_password와 member_password2라는 이름으로 NotEquals라는 에러코드로 등록해줍니다.

커스터 마이징한 Validator의 에러 메시지를 나타내기 위해 properties를 생성해서
[에러코드].[modelAttribute이름].[객체변수] = 메시지
이렇게 나타내 줍니다.

한글이 깨지는 것은 Eclipse Marketplace에서 Properties Editor 플러그인을 설치하면 정상적으로 되돌아 온다고 합니다.


그리고 이 properties 메시지 처리를 위한 context파일을 하나 만들어 주고 properties경로를 포함하여 작성해줍니다.

다음으로 web.xml의 server에 해당 context를 설정합니다.

마지막으로 객체가 FORM태그에 실려서 넘어올 때 데이터를 검증해야하기 때문에 Controller에 @InitBinder를 넣어줍니다.

	@PostMapping("/member/join")
	public String join_member(@Valid @ModelAttribute("joinMemberBean") MemberDto joinMemberBean, BindingResult result) {
		
		if(result.hasErrors()) {
			return "member/join";
		}
		memberService.joinMember(joinMemberBean);
		
		return "member/join_success";
	}
    
    	@InitBinder
	public void initBinder(WebDataBinder binder) {
		MemberValidator validator = new MemberValidator();
		binder.addValidators(validator);
	}

검증이 완료되었다면 Controller -> Service -> Dao -> Mapper를 통해 회원 정보를 저장하고, 검증이 완료되지 않았다면 다시 join.jsp로 돌아가도록 합니다.

Service

@Service
public class MemberService {
	
	@Autowired
	private MemberDao memberDao;
	
	public void joinMember(MemberDto memberDto) {
		memberDao.joinMember(memberDto);
	}
    }

Dao


@Repository
public class MemberDao {
	
	@Autowired
	private SqlSessionTemplate sqlSessionTemplate;
	
	public void joinMember(MemberDto memberDto) {
		sqlSessionTemplate.insert("member.join_member", memberDto);
	}
   }
 

Mapper


<mapper namespace="member">
	<insert id="join_member" parameterType='sloth.shop.dto.MemberDto'>
		insert into sloth_shop.shop_member (member_id, member_name, member_password,
		member_createdAt) values(#{member_id}, #{member_name},
		#{member_password}, now())
	</insert>
</mapper>

좋은 웹페이지 즐겨찾기