🔍 문제 상황
비밀번호 변경 DTO에서
PasswordEncoder를 생성자 매개변수로 받으려고 시도
public class ChangePwDTO {
private String password;
private PasswordEncoder passwordEncoder; // ❌ 잘못된 설계
public ChangePwDTO(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
}🤔 원인 분석
- DTO의 역할 위반
- DTO는 단순한 데이터 전송 객체(Data Transfer Object)
- 비즈니스 로직이나 의존성을 포함하면 안 됨
- Spring 바인딩 실패
- Spring이 HTTP 요청을 DTO로 변환할 때,
PasswordEncoder객체를 제공할 수 없음 - 기본 생성자가 없거나 필요한 매개변수를 알 수 없어 예외 발생
✅ 해결 방법
Service 레이어에서 의존성 처리
public class ChangePwDTO {
private String password;
// Getter, Setter만 포함
}
// Service - 비즈니스 로직 처리
@Service
@RequiredArgsConstructor
public class UserService {
private final PasswordEncoder passwordEncoder;
@Transactional
public void 비밀번호변경(ChangePwDTO changePwDTO) {
String encodedPassword = passwordEncoder.encode(changePwDTO.getPassword());
// 비밀번호 업데이트 로직
}
}DTO는 의존성을 가지지 않아야 한다!
- DTO: 데이터 전송만 담당
- Service: 비즈니스 로직 및 의존성 처리
Share article