<aside> ☝🏻 실제 로직을 작성하는 부분
</aside>
UserService(interface)public interface UserService {
// DTO 받아도 되고
boolean signUp(UserSignUpRequestDto dto);
// Entity 받아도 됨(DTO -> Entity 변환 시점: Controller or Service)
// 그냥 받아도됨
String login(String email, String password);
// 이건 나중에 친절한 기훈씨가 공부해서 알려줄거임
// boolean signUpUsingMapStruct(MemberSignUpRequestDto dto);
}
DefaultUserService 서비스 만들기prefix: **Default**로 하는게 의미상 맞다고 생각함// ioc 컨테이너가 쓸수있게 bean객체 + 서비스라는거 알려줌
@Service
// 생성자 만들어준다햇제? 파이널 붙여주세요
@RequiredArgsConstructor
// 한개로만 쓸꺼니까 final 붙여주셈
public final class DefaultUserService implements UserService {
private final UserRepository userRepository;
private final AuthenticationManagerBuilder authenticationManagerBuilder;
private final AuthenticationManager authenticationManager;
private final PasswordEncoder passwordEncoder;
private final TokenProvider tokenProvider;
// 친절한 기훈씨가 공부해서 알려줄 예정
// private final MemberMapper memberMapper;
// 회원가입 요청왔는데 아이디 중복되면 안되겠쥬? 있는지 없는지 확인하는 함수
public boolean checkEmailExists(String email) {
return userRepository.existsUsersByEmail(email);
}
// 오버라이드 알쥬? 서비스 인터페이스 가져온거임
@Override
public boolean signUp(UserSignUpRequestDto dto) {
//중복확인
boolean check = checkEmailExists(dto.email());
if (check) {
throw new IllegalArgumentException("이미 존재하는 유저입니다.");
}
String rawPassword = dto.rawPassword();
//저장할떄 비밀번호 인코딩
String digest = passwordEncoder.encode(rawPassword);
// 유저 정보 저장
User user = User.builder()
.email(dto.email())
.password(digest)
.nickname(dto.nickname())
.status(AccountStatus.ACTIVE)
.gender(dto.gender())
.build();
userRepository.save(user);
return true;
}
@Override
public String login(String email, String password) {
//토큰과 유저정보가 맞는지 비교
//인증에 필요한 정보를 담고,
//인증 결과에 따라 인증된 사용자 정보와 권한 정보를 포함하는 Authentication 객체를 반환
//실패시 예외발생시킴
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(email, password);
// 사용자 인증 및 권한 검사를 수행
Authentication authentication =
////인증이 성공한 경우 Authentication 객체는 인증된 사용자 정보와 권한 정보를 포함
authenticationManager.authenticate(authenticationToken);
//모든 과정이 문제가 없으면 authentication정보를 담은 토큰을 만들어줌
return tokenProvider.generateToken(authentication);
}
}