묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
메소드 명이 중복되면 어떻게 되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 데이터에서 제공하는 메소드 findById 또는 save처럼 커스텀 리포지 또는 혹은 JpaRepository 를 상속받는 interface에 선언한다 치면 어떤것이 우선시 되어 사용이 되는지 또는 에러가 예외가 발생하는지 궁금합니다.또, JpaRepository가 기본적으로 제공하는 페치 조인 메소드는 없을까요?
-
해결됨스프링 시큐리티 OAuth2
클라이언트 실행 시 발생한 오류에 대한 질문
안녕하세요. 섹션 20. OAuth 2.0 Client + Resource Server + Authorization Server 에 대한 질문입니다. Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2022-12-12T02:46:09.215+09:00 ERROR 17972 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'restApiController' defined in file [C:\Users\ryuup\Projects\IntelliJ IDEA\demo7\oauth2client\build\classes\java\main\com\example\oauth2client\RestApiController.class]: Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'authorizedClientManager' defined in class path resource [com/example/oauth2client/OAuth2ClientConfig.class]: Unsatisfied dependency expressed through method 'authorizedClientManager' parameter 0: Error creating bean with name 'clientRegistrationRepository' defined in class path resource [org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2ClientRegistrationRepositoryConfiguration.class]: Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: Factory method 'clientRegistrationRepository' threw exception with message: Unable to resolve Configuration with the provided Issuer of "http://localhost:9000/" at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:793) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:242) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1344) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1188) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:961) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) ~[spring-context-6.0.2.jar:6.0.2] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[spring-context-6.0.2.jar:6.0.2] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0.jar:3.0.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.0.jar:3.0.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.0.jar:3.0.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.0.jar:3.0.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.0.jar:3.0.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.0.jar:3.0.0] at com.example.oauth2client.Oauth2clientApplication.main(Oauth2clientApplication.java:10) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.0.0.jar:3.0.0] Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authorizedClientManager' defined in class path resource [com/example/oauth2client/OAuth2ClientConfig.class]: Unsatisfied dependency expressed through method 'authorizedClientManager' parameter 0: Error creating bean with name 'clientRegistrationRepository' defined in class path resource [org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2ClientRegistrationRepositoryConfiguration.class]: Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: Factory method 'clientRegistrationRepository' threw exception with message: Unable to resolve Configuration with the provided Issuer of "http://localhost:9000/" at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:793) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:543) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1324) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:880) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:784) ~[spring-beans-6.0.2.jar:6.0.2] ... 24 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientRegistrationRepository' defined in class path resource [org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2ClientRegistrationRepositoryConfiguration.class]: Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: Factory method 'clientRegistrationRepository' threw exception with message: Unable to resolve Configuration with the provided Issuer of "http://localhost:9000/" at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:652) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:640) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1324) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:880) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:784) ~[spring-beans-6.0.2.jar:6.0.2] ... 38 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: Factory method 'clientRegistrationRepository' threw exception with message: Unable to resolve Configuration with the provided Issuer of "http://localhost:9000/" at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.2.jar:6.0.2] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648) ~[spring-beans-6.0.2.jar:6.0.2] ... 52 common frames omitted Caused by: java.lang.IllegalArgumentException: Unable to resolve Configuration with the provided Issuer of "http://localhost:9000/" at org.springframework.security.oauth2.client.registration.ClientRegistrations.getBuilder(ClientRegistrations.java:228) ~[spring-security-oauth2-client-6.0.0.jar:6.0.0] at org.springframework.security.oauth2.client.registration.ClientRegistrations.fromIssuerLocation(ClientRegistrations.java:152) ~[spring-security-oauth2-client-6.0.0.jar:6.0.0] at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter.getBuilderFromIssuerIfPossible(OAuth2ClientPropertiesRegistrationAdapter.java:83) ~[spring-boot-autoconfigure-3.0.0.jar:3.0.0] at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter.getClientRegistration(OAuth2ClientPropertiesRegistrationAdapter.java:59) ~[spring-boot-autoconfigure-3.0.0.jar:3.0.0] at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter.lambda$getClientRegistrations$0(OAuth2ClientPropertiesRegistrationAdapter.java:53) ~[spring-boot-autoconfigure-3.0.0.jar:3.0.0] at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na] at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter.getClientRegistrations(OAuth2ClientPropertiesRegistrationAdapter.java:52) ~[spring-boot-autoconfigure-3.0.0.jar:3.0.0] at org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientRegistrationRepositoryConfiguration.clientRegistrationRepository(OAuth2ClientRegistrationRepositoryConfiguration.java:49) ~[spring-boot-autoconfigure-3.0.0.jar:3.0.0] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.2.jar:6.0.2] ... 53 common frames omitted Caused by: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [java.util.Map<java.lang.String, java.lang.Object>] and content type [text/html;charset=UTF-8] at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:124) ~[spring-web-6.0.2.jar:6.0.2] at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1132) ~[spring-web-6.0.2.jar:6.0.2] at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1115) ~[spring-web-6.0.2.jar:6.0.2] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:865) ~[spring-web-6.0.2.jar:6.0.2] at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:714) ~[spring-web-6.0.2.jar:6.0.2] at org.springframework.security.oauth2.client.registration.ClientRegistrations.lambda$oidc$0(ClientRegistrations.java:163) ~[spring-security-oauth2-client-6.0.0.jar:6.0.0] at org.springframework.security.oauth2.client.registration.ClientRegistrations.getBuilder(ClientRegistrations.java:216) ~[spring-security-oauth2-client-6.0.0.jar:6.0.0] ... 65 common frames omitted Process finished with exit code 0 주요 메시지Unable to resolve Configuration with the provided Issuer of "http://localhost:9000"Caused by: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [java.util.Map<java.lang.String, java.lang.Object>] and content type [text/html;charset=UTF-8]https://github.com/ryuu9505/demo202212120252 인가 서버는 정상 실행이 되었고 클라이언트를 실행할 때 발생한 오류입니다.오류의 의미 혹은 해결 방법에 대한 조언을 부탁드립니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
똑같은 파일이름 저장시 문제점 질문드립니다.
안녕하세요 선생님. MVC03부분에서 MemberController.java입니다.// 회원사진 이미지 업로드(upload폴더에 저장, DB에 파일이름도 저장)@RequestMapping("/memImageUpdate.do")public String memImageUpdate(HttpServletRequest request, HttpSession session, RedirectAttributes rttr) {// 파일업로드 API(cos.jar(고전적 방식), 3가지)MultipartRequest multi=null;int fileMaxSize=10*1024*1024; // 10MBString savePath=request.getRealPath("resources/upload"); // 1.pngtry {// 이미지 업로드 // 1_1.pngmulti=new MultipartRequest(request, savePath, fileMaxSize, "UTF-8", new DefaultFileRenamePolicy());} catch (Exception e) {e.printStackTrace();rttr.addFlashAttribute("msgType", "실패 메세지");rttr.addAttribute("msg", "파일의 크기는 10MB를 넘을 수 없습니다.");return "redirect:/memImageForm.do";}// 데이터베이스 테이블에 회원이미지를 업데이트String memID=multi.getParameter("memID");String newProfile="";File file=multi.getFile("memProfile");if(file !=null) { // 업로드가 된상태(.png, .jpg, .gif)// 이미지파일 여부를 체크->이미지 파일이 아니면 삭제(1.png)String ext=file.getName().substring(file.getName().lastIndexOf(".")+1);ext=ext.toUpperCase(); // PNG, GIF, JPGif(ext.equals("PNG") || ext.equals("GIF") || ext.equals("JPG")){// 새로 업로드된이미지(new->1.PNG), 현재DB에 있는 이미지(old->4.PNG)String oldProfile=memberMapper.getMember(memID).getMemProfile();File oldFile=new File(savePath+"/"+oldProfile);if(oldFile.exists()) {oldFile.delete();}newProfile=file.getName();}else { // 이미지 파일이 아니면if(file.exists()) {file.delete();}rttr.addFlashAttribute("msgType", "실패 메세지");rttr.addFlashAttribute("msg", "이미지 파일만 업로드 가능합니다.");return "redirect:/memImageForm.do";}}// 새로운 이미지를 테이블에 업데이트Member mvo=new Member();mvo.setMemID(memID);mvo.setMemProfile(newProfile);memberMapper.memProfileUpdate(mvo); // 이미지 업데이트 성공Member m=memberMapper.getMember(memID);// 세션을 새롭게 생성한다.session.setAttribute("mvo", m);rttr.addFlashAttribute("msgType", "성공 메세지");rttr.addFlashAttribute("msg", "이미지 변경이 성공했습니다."); return "redirect:/";} 이 코드에서요 사진을 올리면 폴더에 사진파일이 올라가고 원래 DB에 저장된 이름을 가진 사진이 지워지는 거잖아요? 그런데 만약 똑같은 a.jpg 파일을 두번 연속 올리게 되면 처음에는 a.jpg가 폴더에 올라가고 db에 a.jpg가 등록되고 페이지에 a.jpg를 참조해서 사진이 잘 보입니다. 그런데 두번째 올리면 a.jpg가 파일 이름이 같아서 DefaultFileRenamePolicy에 의해서 a1.jpg로 저장이 됩니다. 그런데 여기서 문제가 a1.jpg가 폴더에 올라가고 원래 있었던 a.jpg가 삭제가 되는데 db에는 올릴 때 파일명인 a.jpg가 등록되어버려 페이지에 보여질 때 경로에 a.jpg가 되어 있어 사진이 안 보이게 됩니다. db에 DefaultFileRenamePolicy에 의해서 바뀐 파일명이 올라가게 해야 좋을지 아니면 처음 사진을 제출할 때 파일명이 db의 파일명과 같으면 제출이 안되게 할지 중에서 생각해보니 파일명은 같지만 다른 사진이 있을 수 있기 때문에 바뀐 파일명이 올라가게 했으면 좋겠습니다. 괜찮으시다면 바뀐 파일명이 올라가는 방법과 파일명이 같으면 제출이 안되게 하는법 두가지 방법 한번 알려주실 수 있을까요?? 고민을 많이 해봤는데 딱히 떠오르지 않고 아직 초보라서 구현하기 힘드네요;; 선생님의 도움의 손길을 간절히 바랍니다.
-
미해결실전! 스프링 데이터 JPA
test code에서 repository의 값을 읽어오지 못합니다.
안녕하세요. 강의 잘 듣고 있습니다. tdd를 작성 중 계속 findByStoreId, findByMemberId가 다 되지 않고 있어 그 이유가 궁금해 질문 남깁니다. executorService를 사용하지 않고 orderService.postOrder을 사용하면 findByStoreId, findByMemberId가 정상적으로 실행이 되는데 executorService를 사용하기만 하면 계속 repo에 있는 값을 찾아오지 못하네요,, ㅠ 코드는 아래 첨부해놓았습니다!public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom { Optional<Member> findByMemberId(Long id); }public class Member extends Timestamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long memberId; @Column(nullable = false) private String name; @Column(nullable = false) private String nickname; @Column(nullable = false) private String password; @Column(nullable = false) private String address; @Column(nullable = false) private String role; @JsonIgnore @OneToMany(fetch = FetchType.LAZY, mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true ) private List<Orders> orders = new ArrayList<>(); @JsonManagedReference @OneToMany(fetch = FetchType.LAZY, mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true ) private List<Likes> likes = new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY, mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true ) private List<Store> stores = new ArrayList<>(); }public class Item extends Timestamped{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long itemId; @Column(nullable = false) private String name; @Column(nullable = false) private int amount; @Column(nullable = false) private int price; //@Enumerated(EnumType.STRING) private String category; @JsonIgnore @OneToMany(fetch = FetchType.LAZY, mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true ) private List<OrderHasItem> orderHasItems = new ArrayList<>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="store_id", nullable = true) private Store store; public Integer changeStock(int amount){ //case1) this.amount < amount if (this.amount < amount){ throw new CustomException(ErrorCode.NOT_ENOUGH_STOCK); } else if (this.amount == 0){ throw new CustomException(ErrorCode.OUT_OF_STOCK); } else{ this.amount -= amount; //stock 감소 } return this.amount; }@Transactional(rollbackFor = {CustomException.class}) public ResponseDto<?> postOrder(OrderRequestDto requestDto, HttpServletRequest request) { //case1)case2)token validity check tokenProvider.tokenValidationCheck(request); //case3) memberService.isPresentMember(requestDto.getMemberId()); //case4)StoreId에 해당하는 가게가 존재하지 않을 때 if (!storeRepository.existsById(requestDto.getStoreId())) { throw new CustomException(ErrorCode.STORE_NOT_FOUND); } //case5)ItemId에 해당하는 Item이 존재하지 않을 때 requestDto.getItemId().forEach(itemId -> { if (!itemRepository.existsById(itemId)) { throw new CustomException(ErrorCode.ITEM_NOT_FOUND); } }); //case6)Item 주문 수량이 0일 때 if (requestDto.getItemId().size() == 0) { throw new CustomException(ErrorCode.NEED_OVER_ONE); } //itemId에 해당하는 내용들을 찾아서 리스트로 List<Item> itemList = requestDto.getItemId() .stream() .map(item -> itemRepository.findByItemId(item).orElse(null)) //x-Lock(pessimistic_write) .collect(toList()); //item을 OrderHasItems에 넣어두기 Orders order = Orders.builder() .member(memberRepository.findByMemberId(requestDto.getMemberId()).orElse(null)) //s-Lock .store(storeRepository.findByStoreId(requestDto.getStoreId()).orElse(null)) //s-Lock .build(); orderRepository.save(order); //s-Lock for (int i=0; i<requestDto.getItemId().size(); i++){ Item item = itemList.get(i); Integer amount = requestDto.getAmount().get(i); OrderHasItem item1 = OrderHasItem.builder() .orders(order) .item(item) .amount(amount) .build(); orderHasItemRepository.save(item1); //s-Lock //stock update item.changeStock(amount); }@Transactional @SpringBootTest public class ServiceCustom{ @Autowired MemberService memberService; @Autowired OrderService orderService; @Autowired LikeService likeService; @Autowired SearchService searchService; @Autowired StoreService storeService; @Autowired MemberRepository memberRepository; @Autowired OrderRepository orderRepository; @Autowired OrderHasItemRepository orderHasItemRepository; @Autowired LikeRepository likeRepository; @Autowired ItemRepository itemRepository; @Autowired StoreRepository storeRepository; @Autowired RefreshTokenRepository refreshTokenRepository; @Autowired TokenProvider tokenProvider; @BeforeEach public void beforeEach() { //FK check 후 삭제 orderHasItemRepository.deleteAll(); likeRepository.deleteAll(); storeRepository.deleteAll(); itemRepository.deleteAll(); orderRepository.deleteAll(); refreshTokenRepository.deleteAll(); memberRepository.deleteAll(); } @AfterEach public void afterEach() { //FK check 후 삭제 orderHasItemRepository.deleteAll(); likeRepository.deleteAll(); storeRepository.deleteAll(); itemRepository.deleteAll(); refreshTokenRepository.deleteAll(); orderRepository.deleteAll(); memberRepository.deleteAll(); } //create Entity protected Store createStore(String name, String address, String category, Long memberId) { Store store = Store.builder() .name(name) .address(address) .category(category) .member(memberRepository.findByMemberId(memberId).get()) .build(); storeRepository.save(store); return store; } protected Item createItem(String name, int amount, int price, String category, Long storeId) { Item item = Item.builder() .name(name) .amount(amount) .store(storeRepository.findByStoreId(storeId).get()) .price(price) .category(category) .build(); itemRepository.save(item); return item; } protected Member createMember(String name, String nickname, String password, String address, String role) { Member member = Member.builder() .name(name) .nickname(nickname) .password(password) .address(address) .role(role) .build(); memberRepository.save(member); return member; } //create Dto protected MemberRequestDto createMemberRequestDto(String name, String nickname, String password, String address, String role) { return MemberRequestDto.builder() .name(name) .nickname(nickname) .password(password) .address(address) .role(role) .build(); } protected OrderRequestDto createOrderRequestDto(Long storeId, Long item1, Integer amount1, Long memberId) { List<Long> itemId = new ArrayList<>(); itemId.add(item1); List<Integer> amount = new ArrayList<>(); amount.add(amount1); return OrderRequestDto.builder() .storeId(storeId) .itemId(itemId) .amount(amount) .memberId(memberId) .build(); } @Test @DisplayName("주문 요청 동시에 진행할 시 동시성 issue 확인") public void 주문_요청_동시성_문제_테스트() { //given Member member = memberRepository.save(createMember("member1", "member1", "1234", "address1", "CONSUMER")); Store store = storeRepository.save(createStore( "store1","address1","category1",member.getMemberId())); Item item = itemRepository.save(createItem( "item1", 1000, 8000,"category1",store.getStoreId())); OrderRequestDto order = createOrderRequestDto(store.getStoreId(), item.getItemId(), 1, member.getMemberId()); MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", "Bearer " + "1234567890"); request.addHeader("Refresh-Token", "1234567890"); int amountBefore = itemRepository.findAmountByItemId(item.getItemId()); //when int threadCount = 2; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); //concurrent : 2 CountDownLatch latch = new CountDownLatch(threadCount); for (int i=0; i<2; i++){ executorService.submit(() -> { try{ orderService.postOrder(order, request); }catch (Exception e) { log.info("exception : {}", e.getMessage()); }finally{ latch.countDown(); } }); } //then int amountAfter = itemRepository.findAmountByItemId(item.getItemId()); assertThat(amountAfter-amountBefore).isNotEqualTo(2); }
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
user와 request.user
detail.html 코드에서 질문입니다.로그인 한 상태에서 edit 링크를 보여주려고 {% if target_user == request.user %}를 입력하고,Change Info 링크를 보여주기 위해 {% if target_user == user %} 라고 입력했는데....똑같은 역할을 하는 것 같긴 한데, 위의 request.user와 user는 차이가 있을까요?아니면 {% if target_user == user %} 에서 user 앞에 request라는 의미가 함축되어 있는 건가요? <전체 코드>{% extends 'base.html' %} {% block content %} <div> <div style="text-align: center; max-width: 500px; margin: 4rem auto;"> {% if target_user.profile %} <img src="{{target_user.profile.image.url}}" alt="" style="height: 12rem; width: 12rem; border-radius: 20rem; margin-bottom:2rem;"> <h2 style="font-family: 'NanumSquareNeocBd';"> {{target_user.profile.nickname}} {% if target_user == request.user %} <a href="{% url 'profileapp:update' pk=target_user.profile.pk %}"> edit </a> {% endif %} </h2> <h5 style="margin-bottom: 3rem;"> {{target_user.profile.message}} </h5> {% else %} {% if target_user == request.user %} <a href="{% url 'profileapp:create' %}"> <h2 style="font-family: 'NanumSquareNeocBd'"> Create Profile </h2> </a> {% else %} <h2>닉네임 미설정</h2> {% endif %} {% endif %} {% if target_user == user %} <a href="{% url 'accountapp:update' pk=user.pk %}"> <p> Change Info </p> </a> <a href="{% url 'accountapp:delete' pk=user.pk %}"> <p> Quit </p> </a> {% endif %} </div> </div> {% endblock %}
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
현시점 기준 수강후기 이벤트 진행중인지 궁금합니다.
수강후기 이벤트 선착순 30명 까지 "Vue.js 3 완벽 마스터 실전편 무료쿠폰"을 받을 수 있는 걸로 알고 있는데 2022년 12월 12일 기준 수강평은 50개여서 끝난줄 알았는데 아직 이벤트 url은 살아 있는 것 같아서(한정된 수량 소진시 자동 종료인데 어떤게 자동 종료가 되는지... url이 없어진다던지, 이벤트 공지가 없어진다는지 헷갈려서요...) 문의 드립니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
findviewbyid가 실행되지 않습니다.
사진 클릭시 확대 기능 구현을 따라하던 중 findviewbyid를 입력했는데 호출해오지 못하는 것 같습니다 해결법이 따로있나요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
g마켓 모바일 크롤링 가능한가요?
pc는 가능한데 모바일은 안되서 모바일 사이트는 크롤링 할때 다른 팁이 있는지 궁금합니다.http://browse.gmarket.co.kr/m/search?keyword=%EB%8B%AD%EA%B0%80%EC%8A%B4%EC%82%B4
-
미해결스프링 핵심 원리 - 기본편
싱글톤 컨테이너 질문드립니다!;
안녕하세요!! @Configuration과 싱글톤 강의를 보면 configurationTest 메소드에서 memberserviceimpl와 orderserviceimpl의 두 메소드의 getMemberRepository를 호출하면 결국 주소값이 같아야 하는데 저는 두개 다르게 나옵니다.. 코드를 동일하게 작성했는데 왜 결과가 다르게 나올까요ㅠㅠㅠ? 스프링컨테이너에서 싱글톤 패턴을 유지해주는걸로 알고있는데 결과가 제꺼는 매번 새롭게 인스턴스를 생성한것으로 나오네요 ㅜㅜ
-
미해결Slack 클론 코딩[실시간 채팅 with React]
회원가입 페이지 모달관련 질문
회원가입 페이지를 구현하면서 실패시 SignupError를 모달에 props로 전달하려고합니다.근데 다음과 같이 모달에서 바인딩 요소 'string'은 암시적으로 'any' 유형을 가진다고 에러가 발생하는데해당 이유에 대해서 궁금해 질문드립니다.참고자료 함께 첨부하겠습니다. pages/signupconst [signupError, setSignupError] = useState(''); axios .post('/api/users', { email, nickname, password, }) .then(response => { console.log(response); setSignupSuccess(true); }) .catch(error => { console.log(error.response); setSignupError(error.response.data); }); console.log(email, nickname, password); } {signupError && <Error error={signupError} />} components/modalimport React from 'react'; const Modal = ({ error: string }) => { return ( <ModalWrapper> <header>Error!</header> <div>{error}</div> <ModalBtn>확인</ModalBtn> </ModalWrapper> ); }; export default Modal; 에러 로그
-
해결됨CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
자료구조 관련 추가 강의 문의
지금 현재 5.3.3 힙 ~ 5.3.6 셋 부분의 강의가 없는데 언제쯤 추가될 지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요~~ 레디슨관련 질문 드립니다!
레디슨을 이용하여 락을 획득할 때lock.tryLock 메서드 내부에서 현재 lock 이 걸려있는 상태이면 여기서 wait 상태로 스레드를 기다리는 상황인 건가요?그렇다면 available의 결과가 false 가 된 상태는락을 계속 얻으려고 시도하다가 결국 못받은 상황이라고 이해해도 될까요?마지막으로 지금은 void 로 레디스 테스트를 위해 리턴값은 따로 지정하지 않았는데 만약 실무에선 해당 상황에선 보통 어떤 값을 리턴해주는게 좋을까요? 추가로..개인적인 프로젝트에 해당로직을 사용하여 레디슨으로 Lock 을 건 상태에서 동일하게 테스트 코드를 작성하였습니다.초기 전체 카운트를 저장한 후에 스레드 내부에서 동일한 수량으로 감소하는 로직으로 작성하였지만,스레드 내부에서 findBy 한 엔티티의 수량이 모두 초기값으로 동일하게 나타나는 현상이 나타났습니다.. 이럴경우 lock이 제대로 이뤄지지 않은 상태로 된것일까요 아니면 스레드 테스트 환경을 잘못 작성한 것일까요... 추가 질문에 대한 개인적인 해결방안을 찾았습니다.. 레디슨 락에대한 메서드에 Transactional 어노테이션을 작성했더니 위처럼 동작하는군요... Transactional 어노테이션이 Redisson에 어떤 영향을 주었던 걸까요...
-
미해결AWS Certified Cloud Practitioner 자격증 준비하기
실전 문제 풀이 9-38 정답 표기 오류
실전 문제 풀이 9의 38번 문제의 정답이 잘못된 것 같습니다.회사는 Amazon EC2 인스턴스에 대해 최적화된 가격을 원합니다. 이러한 인스턴스에서 실행되는 애플리케이션은 중단을 허용할 수 없으며 워크로드는 최소 1년 동안 작동 상태를 유지해야 합니다. 사는 이러한 요구 사항을 충족하기 위해 어떤 구매 옵션을 사용해야 합니까? (2개를 선택하십시오.)(A). 예약 인스턴스 (B). 스팟 인스턴스 (C). AWS Marketplace 구독 (D). Saving Plan (E). 전용 호스트정답은 A, C로 표기되어 있지만 A, D가 맞는 것 같습니다.
-
미해결그림으로 배우는 자바, 파트1: 입문!
안녕하세요 다시 질물드립니다 ㅠㅠ
우선 정답사진입니다 선생님의 동영상 강의에는위 cube(int n) 부분에(int num)을 넣으셧습니다그리고 아래 그림처럼저는 a를 넣었습니다그래도 잘 작동하는데public static이 아예 달라서매개변수에 어떤거를 넣든 상관이 없는건가요??그리고 이건 선생님 답지를 보기전에제 나름대로 했는데 이상하게 작동했습니다그리고 main 부분의int n = 3 ; 을 4로 바꾸면맽에 출력으로4의 세제곱 =>27이렇게 나옵니다저는 main 부분의 int n = 4 가 int x = cube(n); 으로 들어가서cube 함수랑 충돌나서 오류날줄알았는데main부분의 n이 겹치는데도 왜 이렇게 되는건가요??ㅠㅠ
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
혹시 ?? 반대 연산자는 없나요?
혹시 ?? 반대 연산자는 없나요?dart 공식문서에도 if null?? 은 있지만, if true 에 해당하는 건 없는 것 같습니다.
-
미해결Flutter + Firebase로 넷플릭스 UI 클론 코딩하기 [무작정 플러터]
22.12.11 carousel_slider 문의 드려요..
pubspec.yaml에서 carousel_slider 에 버전을 줘서 해봐도import 'package: carousel_slider/carousel_slider.dart';가 오류가 나고,_CarouselImageState 클래스에서 CarouselSlider가 오류가 발생합니다 ㅜㅜ 도와주세요...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
lazy -> 즉시로딩으로 바꿨을때 쿼리 이상하게 나가는 것
이부분에 대해 자세한 설명은 없으셨거든요근데 이부분도 쿼리가왜저렇게 나가는지 이해해볼 필요가 있는걸까요? 아니면 실무에선 저렇게 쓰지않을거기때문에 이해할필요가없을까요?간단한주문조회v2:엔티티를 dto로 변환 << 강의에서 나왔습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
웰컴페이지 코드가 혹시 어디있을까요 ... ???
Adding welcome page: ServletContext resource [/index.html] <-- 실행하면 요 로그가 뜨는데 이거 welcomepage 설정을 어떤 파일에서 했는지 도저히 안보여서 .... 혹시 알려주실 수 있을까요 ??index.html 파일을 찾는게 welcomepage = index.html 와 같은 표현을 어디서 어떻게 썼는지가 궁금해서 찾고 있었습니다 !
-
미해결홍정모의 따라하며 배우는 C++
3.7 이진수 Binary Numbers에서의 다른 동영상?
3.7 이진수 Binary Numbers 영상에서 몇번 언급하신 손으로 하는 다른 동영상은 어디에서 보는건지요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합테스트 예외 오류
2022-12-11 20:07:11.120 INFO 5728 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@7e8dcdaa testClass = MemberServiceIntegrationTest, testInstance = hello.hellospring.service.MemberServiceIntegrationTest@236ae13d, testMethod = 중복_회원_예외@MemberServiceIntegrationTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@681a8b4e testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class hello.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@20bd8be5, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4a07d605, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@68746f22, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2eea88a1, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7283d3eb, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@130f889], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]; transaction manager [org.springframework.jdbc.support.JdbcTransactionManager@193eb1ba]; rollback [true] 2022-12-11 20:07:11.845 INFO 5728 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@7e8dcdaa testClass = MemberServiceIntegrationTest, testInstance = hello.hellospring.service.MemberServiceIntegrationTest@236ae13d, testMethod = 중복_회원_예외@MemberServiceIntegrationTest, testException = org.opentest4j.AssertionFailedError: Expected java.lang.IllegalStateException to be thrown, but nothing was thrown., mergedContextConfiguration = [WebMergedContextConfiguration@681a8b4e testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class hello.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@20bd8be5, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4a07d605, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@68746f22, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2eea88a1, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7283d3eb, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@130f889], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] org.opentest4j.AssertionFailedError: Expected java.lang.IllegalStateException to be thrown, but nothing was thrown 라는 오류가 나옵니다 package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest @Transactional class MemberServiceIntegrationTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("hello"); //When Long saveId = memberService.join(member); //Then Member findMember = memberRepository.findById(saveId).get(); assertEquals(member.getName(), findMember.getName()); } @Test public void 중복_회원_예외() throws Exception { //Given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //When memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));//예외가 발생해야 한다. assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } }package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } /** * 회원가입 */ public Long join (Member member){ validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember (Member member){ memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); } /** * 전체 회원 조회 */ public List<Member> findMembers () { return memberRepository.findAll(); } public Optional<Member> findOne (Long memberId){ return memberRepository.findById(memberId); } } 일단 memberserviceTest도 돌려서 확인했을때 중복 회원 예외에 대한 문제는 나오지를 않았습니다. 다른 질문들 확인했을때 메세지 뜨는게 달라서 안뜬다고 해서 그 메세지 자체 그대로 복붙했습니다. 에러에서는 그런게 보이지도 않았구요 db에 문제가 있는건가 싶어서 테이블 자체를 없앴다가 다시만들고 테스트 당시 db에 spring1이라는 이름의 데이터 한개 있습니다.이 테스트 자체가 member1이랑 member2랑 이름이 같아서 중복 회원 오류를 테스트 하는거라서 spring이라는 이름으로 겹치지 않게 할려고 일부로 데이터도 spring1으로 해놨습니다.어떤 문제때문에 지금 계속 저 오류가 뜨는건지 질문드립니다.