저도 동일한 질문을 하려고했는데, 이미 질문 답변이 이뤄지고 있었네요. ㅎㅎ 패스워드 인코더랑 이메일 센더 구현체가 없으니 스프링 빈 주입 안되는 게 맞는 거 같고, 인텔리제이가 적절하게 빨간줄 그어주고 있는 상황입니다.. 궁금한 것은 토비님 인텔리제이 화면에서는 왜 빨간줄이 그어지지 않는지 궁금하네요. 강의 준비하시면서 미리 구현체를 만들어 두신건가요? 스프링을 잘 모르느시는 분들은 혼란 스러울 만한 거 같긴합니다.
데이터 중에는 몇 가지 한정된 값을 갖는 것이 있죠. 가령, 계절의 경우, 봄, 여름 , 가을, 겨울 요일은 월화수목금토일 이와 같이 한정된 값을 갖는 타입을 자바에서는 Enum(열거 타입)이라고 합니다. Enum을 쓰면 지정된 값만 들어올 수 있기 때문에 이상한 값들을 걸러줄 수 있습니다. 또한, 가독성이 좋은 코드를 작성할 수 있는데요. if (member.getGrade() == Grade.VIP) {...} 이 코드를 보면 회원등급이 VIP인 경우 중괄호 블록을 실행한다는 것을 단번에 알 수 있겠죠? 그래서 Enum타입을 씁니다.
다형성을 활용하는 것인데요. 인터페이스로 조작하면 하위 클래스의 소스코드를 몰라도 상위 클래스 사용법만 알면 활용할 수 있습니다. 하위 클래스를 언제든 갈아 끼울 수 있고요. 말씀해주신 대로 구현체의 자체 기능은 바로 사용할 수는 없지만, Downcasting 을 사용해서 하위 클래스의 자체 기능을 사용할 수 있습니다. ((HashMap)map).clone(); 뭐 이런 식으로 사용하면 된다는 겁니다.
에러 메세지를 보면 detached entity passed to persist JPA의 영속성 컨텐스트에서 분리된 상태라 예외가 발생한듯 보입니다. 강사님께서 제공한 코드 그대로 두시고 CustomUserDetailsService 의 l oadUserByUsername() 메소드 위에 @Transactional 만 붙여도 정상 작동합니다. 설명을 덧붙이자면 영속성 컨텍스트는 트랜잭션 안에서 동작 해야 합니다.