저번에 controller에서 UserLoginInfo로 들어오는 정보를 User로 convert 해서 서비스 단에 보내는 로직을 작성하였습니다. 이것을다른 데서 하게 하면 어떨까요? mapping을 손쉽게 하기 위해서 mapstruct를 이용했는데요. 문제는 비밀 번호가 담겨진 것은 가입 로직에서는 encoding 해서 service 단에 넘겨야 한다는 것입니다.

 

 


 그 전에, 가입과 로그인 로직부터 간단하게 도식화 해서 그려보겠습니다.

 

 

 먼저 가입 로직이에요. userName과 Email, password를 json 형식으로 받으면 패스워드만 bcrypt로 암호화를 해요. 나머지 필드인 userName과 Email은 User 객체를 생성할 때 그대로 넣고요. 그 다음에 User 객체를 service layer로 넘겨버려요. 여기서 중요한 것은 암호를 bcrypt로 암호화를 시켰단 것인데요. custom 하게 필드를 mapping 시키는 함수를 만들어야 하겠군요.

 

 그런데, Login 메서드는 그렇지 않은데요.

 

 

 userName과 비밀번호를 받으면, User 테이블로부터 userName이 입력받은 userName과 같은 레코드를 가져 와요. 이것을 노란색이라 하겠습니다. password'는 bcrypt로 암호화된 비밀번호입니다. salt 값과 얼마나 돌릴 것인지를 알고 있으니, passWord에 salt 값을 섞고 특정한 횟수만큼 돌려서 match가 되는지 확인합니다.

 

 그래서 일치하면 accessToken을 돌려주게 됩니다. 그래서, Login 과정에서는 따로 bcrypt로 암호화 해서 User에 mapping을 시켜줄 필요가 없어요.

 

 


 어찌 되었던, 요약을 하면, userRegInfo에서 User로 mapping을 위해서 userPw 부분은 암호화를 해서 보내면 되고, userLoginInfo에서 User로 맵핑을 하기 위해서 userPw는 굳이 암호화를 할 필요는 없다는 건데요. 이 요구사항을 만족하게끔 mapper를 구현해 보겠습니다.

 

 

 instance는 실제로 Impl 구현단에 접근하게끔 해 줍니다.

 

 

 다음에, 17번째 줄을 보면, qualifiedByName이 있습니다. 문서에서 @Named 어노테이션을 설명하는 부분이 있는데요. mapping 함수나 Mapper에서 사용할 수 있는 어노테이션입니다. qualifiedByName에 encryptUserPw라고 적었습니다. 이는 UserRegInfo의 userPw를 User의 userPw로 맵핑시킬 때, encryptUserPw 이름을 가지는 무언가를 이용하겠다는 것입니다.

 

 

 다음에, UserLoginInfoToUser는 굳이 pw를 암호화 할 필요는 없으므로, 그냥 UserLoginInfo에 있는 userName과 pw를 그대로 가지고 옵니다.

 

 

 27번째 줄에 Named 어노테이션이 있는데요. encryptUserPw라고 되어 있습니다. 이는 encryptUserPw 이름을 가진 맵핑 함수임을 의미합니다.

 

 

 다시 RegUserInfo를 User로 mapping 하는 것을 보면, 요래 되어 있었어요. encryptUserPw라고 이름이 지어진 매핑 함수를 보면, 요래 되어 있었는데요.

 

 

 결국, 가입 정보를 가지고 User로 맵핑하기 위해, passWord를 인코드하는 것을 구현한 것입니다.

 

 


 이제 UserController를 어떻게 바꾸면 좋을까요?

 

 

 먼저 regUser 메서드입니다. 기존에, regInfo를 가지고 새롭게 user를 생성해서 mapping 시키는 로직을 32번째 줄 한 줄로 퉁칠 수 있어요.

 

 

 다음에 login 부분도 마찬가지입니다. loginInfo로 넘어온 로그인 정보를 User에 맵핑을 시켜주는 로직을 단 43번째 줄 하나로 바꿔버릴 수 있어요.

 

 

 match 시키는 부분은 크게 바뀐 것은 없어 보이네요.