<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 서비스 만들기

// 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);
	}
}