게시글
질문&답변
2022.12.25
WebSecurityConfigurerAdapter deprecated
api 앞에 "/" 빠져서 그런거 아닌가요?
- 0
- 4
- 2.3K
질문&답변
2022.07.15
JpaRepository를 이용할시 에러가 발생합니다.
안되는 부분 설명에 내용이 꼬인것 같아서 다시 정리해서 질문드립니다 !! 우선, [ 현재 상황 ] 1) JpaRepository를 상속받음으로써 Repsitory에 대한 Bean에 넣어줌 2) ComponentScan을 이용한 AutoAppConfig 으로 자동으로 Component 붙은 클래스들을 Bean에 넣어줌 3) 이때 Filter를 통해 Configuration.class 는 읽지 못하게 해놨습니다. [ 에러 상황 ] 1) org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberController': Unsatisfied dependency expressed through field 'memberService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImp' defined in file [/Users/parksungjun/Desktop/창업동아리/ShoppingMall/out/production/classes/xik/ShoppingMall/Service/MemberServiceImp.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'xik.ShoppingMall.Repository.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 위의 에러 로그를 보면 " Repository에 MemberRepository 유형의 빈이 없으며, Autowired할 수 있는 빈이 최소 하나 필요하다 " 라는 내용으로 보입니다. 즉, JpaRepository를 통해 빈이 자동생성되는 줄 알았는데 안되고 있다는 의미이죠. 일주일 째 이유를 찾아보고, 강의를 몇번이고 돌려보고 있는데 이유를 못찾겠네요... 그래서 소스 코드를 다시 올리겠습니다. 1) 컨트롤러 @Controllerpublic class MemberController { @Autowired private MemberServiceInterface memberService; @GetMapping("/login") public String Login() { return "/Login/login"; } @GetMapping("/new") public String New() { return "/Login/memberNew"; } @PostMapping("/new") public String create(MemberForm form) { Member member = new Member(); member.setName(form.getName()); member.setPhoneNumber(form.getPhoneNumber()); memberService.join(member); // redirect:/ 하면 홈화면으로 보내는 것이다. return "redirect:/5xik"; } @GetMapping("/members") public String list(Model model) { List members = memberService.findMember(); model.addAttribute("members", members); return "/Login/memberCheck"; }} 2) MemberService @Transactional@Componentpublic class MemberServiceImp implements MemberServiceInterface{ private MemberRepository memberRepository; // 외부에서 리포지토리를 넣어줄 수 있게끔 직접 nw 하는게 아닌 생성자를 이용해서 만들어준다. @Autowired public MemberServiceImp(MemberRepository memberRepository) { this.memberRepository = memberRepository; } // 회원가입 @Override public Long join(Member member) { // 휴대폰 번호 중복 체크 validateDuplicateMember(member); memberRepository.save(member); return member.getId(); } @Override public void validateDuplicateMember(Member member) { Optional result = memberRepository.findByphonenumber(member.getPhoneNumber()); result.ifPresent(m ->{ throw new IllegalStateException("이미 가입된 휴대폰 번호입니다."); }); } @Override public List findMember() { return memberRepository.findall(); } @Override public Optional findOne(Long memberId) { return memberRepository.findByid(memberId); }} 3) OrderService @Transactional@Componentpublic class OrderServiceImp implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long MemberId,Integer price) { Member member = memberRepository.findByid(MemberId).get(); int discountPrice = discountPolicy.discount(member,price); return new Order(MemberId, discountPrice); }} 4) Repository public interface SpringDataJpaMemberRepository extends JpaRepository, Long>, MemberRepository { @Override Optional findByname(String name);} 5) 빈 조회 테스트 코드 public class ApplicationContextInfoTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoSpringConfig.class); @Test @DisplayName("모든 빈 출력하기") void findBean() { String[] beanDefinitionName = ac.getBeanDefinitionNames(); for (String i : beanDefinitionName) { Object bean = ac.getBean(i); System.out.println("name = " + i + "object" + bean); } } @Test @DisplayName("application 빈 출력하기") void findApplication() { String[] beanDefinitionName = ac.getBeanDefinitionNames(); for (String i : beanDefinitionName) { BeanDefinition beanDefinition = ac.getBeanDefinition(i); if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) { Object bean = ac.getBean(i); System.out.println("name = " + i + "object" + bean); } } }} 6) AutoSpringConfig ( IoC컨테이너 ) @Configuration@ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))public class AutoSpringConfig { }
- 0
- 4
- 4K
질문&답변
2022.03.10
메모리 데이터 조회 예제를 해보고 있는데 폼 데이터를 하나 더 추가하니 조회가 안됩니다.
말씀해주신 부분 수정 후 정상동작 확인했습니다. David 님 감사합니다. (사진)
- 0
- 2
- 241