봄싹 시즌 2 개발 중에 자연스래 담당하는 모듈이 나뉘어져서 요즘은 주로 회원 관리 모듈만 개발하고 있습니다. 처음엔 뭐 간단하겠지.. 별거 있나.. CRUD만 하면 되겠지.. 라고 생각했었는데 그게 아니더군요.

일단 회원 관리와 더불어 인증/권한까지 같이 담당하게 되었는데, 사용자가 회원 가입과 로그인을 하고 그 사용자에게 권한을 부여하는 관리자 기능까지 생각해보면 할 일이 심심치는 않았습니다.

1. 회원 가입

로그인과 더불어 사용자가 가장 빨리 접하는 기능 중 하나 일 겁니다. 그래서 디자인에도 조금 신경을 써야했습니다. 그리고 스팸 사용자도 막고 싶었습니다. 캡차를 쓸 수도 있겠지만, 이메일 인증 방법을 사용하기로 결정했습니다. 회원 가입을 서브밋 하면 인증 메일을 전송하고, 사용자가 인증 메일의 링크를 클릭하면 사용자 상태를 인증 된 상태로 바꿔주는 겁니다. 그 전에는 로그인이 되지 않습니다.

검증은 2단계로 화면단에서 한 번, 서버 단에서 한 번 그렇게 두 번 걸러집니다. 이때, 클라이언트 쪽 검증은 제이쿼리의 validation 플러긴을 사용했으며, 중요한 검증 작업 중 하나로 email 중복 체크가 있습니다. 이 부분이 제대로 동작하지 않더라도 최종적으로는 DB단에서 unique 제약 위반으로 에러가 나고 해당 회원 정보는 추가되지 않을 겁니다. 하지만, 그 에러 메시지를 만나게 하기 전에 사용자가 email만 입력한 상태에서 검증을 해주고 싶습니다. Ajax가 필요한 시점입니다. 하지만 요청을 너무 자주 보내고 싶진 않기 때문에, 기본적인 email 형태를 갖췄는지 validation을 한 뒤에 해당 검증을 잘 통과 했을 경우에만 ajax로 요청을 보내서 중복 된 email이 아닌지 확인해 줍니다.

이렇게 화면단/서버단 검증이 잘 끝나서 회원 가입을 진행하게 되면 이메일을 전송하느라 3~5초 정도 시간이 걸리는데 이 시간 동안 사용자에게 뭔가 진행중이라는 사실을 알려주고 화면을 블러킹해줍니다. 이 때 아이튠즈의 블러킹 화면과 비슷한 화면을 보여주도록 했습니다.ㅋㅋ 단, IE에서는 모서리가 각져서 보인다는 거... FF나 Safari에서는 잘 보였습니다.

회원 가입 폼 처리가 끝난 뒤, 회원 가입 인증 대기 화면을 보여줍니다.

2. 가입 승인 대기

회원 가입 인증 메일을 전송했기 때문에, 이제 사용자는 해당 메일을 확인하고 그 메일에 들어있는 링크를 클릭하여 회원 가입 인증을 거칠 수 있습니다.

하지만 만약 사용자가 메일을 한 번 받아놓고 다른 일을 하다가 메일이 쌓여서 봄싹이 보낸 메일이 어딨는지 못 찾았다면? 혹은 메일을 실수로 지웠다면? 해당 사용자는 답답해 할 겁니다. 그래서 인증 메일 재전송 기능이 필요했습니다.

또한 현재 페이지에서 회원이 사용중인 메일 서비스로 바로 이동할 수 있는 링크도 유용할 겁니다.

마지막으로 승인을 받은 사용자에게 기본 권한을 설정해줍니다. 기본으로 모든 사용자는 USER라는 role을 가지도록 구현해 줬습니다. 그래야 익명 사용자와 가입한 사용자를 구분할 수 있을테니 말이죠.

스팸 사용자가 발생할 수 있습니다. 인증을 거치지 않고 계속 가입만 한 사용자들이 DB에 쌓일 수 있죠. 그럴 경우에 대비해서 주기적으로 배치를 실행해서 인증을 거치지 않은 사용자 정보를 삭제해 줍니다.

2. 로그인

여차 저차해서 회원 가입 인증까지 끝낸 사용자는 로그인 화면을 보게 될 겁니다. 회원 가입 인증 메일에 들어있던 링크가 로그인 화면으로 보내주면서 내부에서는 인증 작업을 해주는 것이죠.

이제부터는 스프링 시큐리티와 관련이 있는데, 그다지 어렵진 않았습니다. 스프링 시큐리티를 공부하는게 아니라 그냥 간략하게 사용만 하는 것이니까요. 그다지 어려울 것은 없습니다. 인증 방법은 여러가지가 있는데 일단은 가장 흔한 폼 인증 방식을 선택했습니다. 다음에는 OpenID로 지원해볼 생각이지만, 당장은 아닙니다.

아직 가입을 하지 않은 사용자가 로그인 화면에 들어온 경우가 있을 수 있기 때문에 회원 가입 화면으로 가능 링크가 필요합니다.

또한 가입은 했지만 아직 인증을 거치지 않은 사용자가 있을 수 있는데, 그런 경우 가입 승인 대기 화면으로 포워딩을 하고, 이메일 인증을 받도록 합니다.

비밀 번호를 잊어버렸을 수도 있는데, 이런 경우 가입시 입력한 이메일을 다시 입력받아서 해당 이메일로 비밀번호를 전송해 줍니다. 이 떄 입력하는 이메일도 검증 작업이 필요하겠죠.

3. 관리자

다행히(?) 이 부분은 제 담당이 아닙니다. 성윤군이 담당하고 있는데 제이쿼리를 이용해서 드래그앤드랍으로 권한을 변경할 수 있게 해준다니.. 기대중입니다.

회원 전체 목록 조회.

회원 정보/권한 조회.

회원 정보/권한 변경.

회원 삭제.

모든 목록을 뽑아낸 것이 아니라, 지금까지 완료한 작업이나 오늘 내일 처리할 작업까지만 정리한 것입니다. 아마도 생각하지 못한 작업들이 더 있겠지요. 간단해 보였던 회원 관리가 이렇게도 할 일이 많았다니.. 다른 모듈들은 어떨지 걱정입니다. 이번 주 내로 회원 관리를 정리하고 일손이 모자른 스터디 모듈이나 관리자 모듈쪽에 붙어야겠습니다. 그쪽도 아주 재밌을텐데 말이죠.