회원등록 V2 방식을 그대로 사용하고 POSTMAN에서 POST방식으로 BODY안에 CreateMemberRequest 클래스의 필드와 같은값으로 데이터를 전송해봤습니다. 그런데 기본생성자가 없을경우에는 "org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jpashops.ormonetwocombine.dto.RequestItemDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jpashops.ormonetwocombine.dto.RequestItemDto` 포스트맨 에러입니다 이런 에러 구문이 나오더군요, 그런데 기본생성자를 CreateMemberRequest에 추가해주고 다시 Postman으로 전송하더니 잘되더군요, 받아온 JSON 데이터를 파싱하는데 기본생성자가 원래 필수인가요~?
안녕하세요, 선생님. 강의를 듣고 이제 첫 실전에 jpa를 사용하는데 Entity 설계 과정에 어려움이 있어서 질문드립니다. 다름이 아니라 제가 스프링 시큐리와 같이 회원과 권한의 테이블을 설계하려고 해서 조사를 해보니 https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/User.java https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/Authority.java 와 같은 구조 혹은 @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "user_role" , joinColumns = @JoinColumn(name = "user_id" ), inverseJoinColumns = @JoinColumn(name = "role_id" )) private Set < Role > roles; 다대다 구조를 많이 사용하더라구요.. 위 코드의 User 와 Authority는 일대다 구조인데 강의때 배울때 연관관계 주인 설정이나 fetch 타입 설정이 다르고 일대다는 권장 하지 않으셔서 조금 혼동이 오더라구요.. 지 양하라는 말씀을 그대로 쓰는코드들도 꽤 있더라구요. 그래서 최대한 강의때 배운데로 해보려고 아래 스샷처럼 변경 해보았습니다. 위 ERD 이미지 처럼 Entity를 변경해보았습니다.(테이블명은 작업중이라 안맞습니다.) 로그인 시 User객체를 조회 하여 불러오는데 test 코드에서 UserRepository를 통해서 User를 불러오면 데이터를 잘 조회 합니다. 제가 로그인을 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication메소드를 재구현했는데 리턴하는 부분에서 could not initialize proxy - no Session 에러가발생하네요.. @SneakyThrows @Override public Authentication attemptAuthentication ( HttpServletRequest request , HttpServletResponse response ) throws AuthenticationException { UserLoginDto userLogin = objectMapper . readValue ( request . getInputStream (), UserLoginDto . class ); String requestURI = request . getRequestURI (); if ( userLogin . getRefreshToken () == null ) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken ( userLogin . getUsername (), userLogin . getPassword (), null ); // 에러 발생부분 return authenticationManager . authenticate ( token ); } 제가 뭘 잘못하고 있는지, 어떤걸 참고해야 하는지 알려주시면 알될까요?? 감사합니다. 좋은 하루되세요
stateless에서는 클라이언트가 현재 무엇을 사고 싶은지, 어떤 지불방법을 했는지 등등 고객의 상태를 저장하지 않음으로써 자원을 아끼고, connectionless는 클라이언트의 연결을 유지하기 위한 IP주소나 PORT정보들을 저장하지 않음으로써 자원을 아낀다고 생각을 했습니다. 즉 여기서 서버의 자원이라는 것은 저장공간이라고 이해를 했는데요. 이렇게 클라이언트들의 상태 정보나 IP, PORT 정보를 저장하는데 그렇게 많은 공간이 필요한가요?? 이러한 단순한 정보들이 몇만개 있다고해서 그렇게 큰 공간을 차지할 것 같다고 생각이 되지 않아서 질문 드립니다. 단순히 생각해서 한 클라이언트와 연결을 유지하는데 100바이트의 저장 공간이 필요하다고 하면 10만대와 연결하면 10메가 바 이트정도 필요할 것 같은데 ..
안녕하세요 선생님! 수업 잘 듣고있습니다 : ) ! 질문이 있습니다. concat 문자열 합치기 처리는 JPQL 문에서 처리 하지 않고 entity column 값을 그대로 가져와서 자바에서도 합치는 처리가 가능할 것 같은데 보통은 어떻게 처리하는게 좋을까요? 저는 공부하면서 뭔가 JPA가 객체지향 SQL을 사용하기 때문에 가능한 데이터를 entity 에 맞춰 그대로 값을 가져오고 자바에서 객체지향처럼 조작해서 처리하는게 것이 재사용성이 있어서 좋다고 생각했는데 실무 경험이 많이 없어서 어떤 기준을 잡아야 할지 헷갈리네요!
안녕하세요, 질문이 있습니다. show run 커맨드를 입력하면 --More--이라고 나오는걸 봐서 더 많은 정보를 볼수있는것 같은데 (영상에서도 그렇게 설명하셨구요). 근데 뭘 눌러야 정보를 더 볼수 있나요? 위아래키 다눌러보고 엔터키 쳐봐도 다시 Router1# 으로 돌아갑니다.
아무래도JPA 보다는 DB쪽 질문에 가까운거같은데 이해해주시면 감사합니다. Enum이라는게 결국 어떤 카테고리의 역할을 할때가 많은거같은데요 이런경우 보통 인덱스를 걸어주는게 맞나요? db이론상으론 카디널리티가 낮은경우 인덱스를 걸면 효과가 적다고 해서 좀 혼란스럽더라구요. 그리고 강의중간에 말씀하신걸로 보면 그냥 String 형태로 저장해도 된다고 하고 차이가 적다구 하셨긴했는데 카테고리 역할을 할때 의 컬럼이 조건식도 그렇고 많이 쓰이는거 같아서 String비교보단 int비교가 빠르지 않나? 라는 생각이 좀 들었어서 혹시 int값을 주고 다른테이블로 외래키를 연결해서 id값과 String값을 주고 이어준다던가 이럴 필요는 없다고 생각해도 될까요?
1) N+1 문제는 1의 쿼리를날렷을시 N방의 쿼리가 나가는것이고 , 데이터 뻥튀기는 중복값이 나오는 거라고 이해하고있는데요 이둘은 다른 의미라고 봐도되는건가요? 2)N+1 문제에서 맴버와, 팀 LAZY 설정, N:1 관계라고 한다면요~ 초기셋팅 Team teamA = new Team (); teamA. setName ( "teamA" ); em. persist (teamA); Team teamB = new Team (); teamB. setName ( "teamB" ); em. persist (teamB); Member member = new Member (); member. setName ( " 김 A" ); member. changeTeam (teamA); Member member5 = new Member (); member5. setName ( " 홍 A" ); member5. changeTeam (teamA); Member member1 = new Member (); member1. setName ( " 정 B" ); member1. changeTeam (teamB); Member member2 = new Member (); member2. setName ( " 진 B" ); member2. changeTeam (teamB); em. persist (member); em. persist (member1); em. persist (member2); em. persist (member5); List<Member> resultList = em.createQuery("select m from Member m join m.team", Member.class).getResultList(); for (Member memberOne : resultList) { System.out.println(memberOne.getTeam().getName()); } 맴버에관한 쿼리 1방. 팀에대한 쿼리 두방이 나갈거같습니다.. 이런경우가 N+1 이고 데이터 뻥튀기는 없다. 라고 봐도될까요? 3) 이번엔 2번문제의 반대인데요~ 조건은같구요 List<Team> result = em.createQuery("select t from Team t join t.members", Team.class).getResultList(); for (Team team : result) { System.out.println("team = " + team.getName()); for(Member members : team.getMembers()){ System.out.println("members = " + members.getName()); } } 이런경우는 팀에관한 쿼리 한방, 맴버의 이름 2방이 나가니, N+1 이고 , 데이터 뻥튀기가 발생한다가 맞을까요 몇일째 N+1과 데이터 뻥튀기에대해 강의도 다시듣고 , 찾아보고하지만 머리 뇌리속에 안박히네요..
1. https에서 공개키 방식을 이용해서 직접 메세지를 암호화하지 않는 이유가 공개키 방식을 사용하면 암호화하고 복호화하는 속도가 느리기 때문에 상대적으로 속도가 빠른 대칭키 방식을 사용한다고 알고 있습니다. 그런데 https도 http이고 그러면 stateless 특징을 갖고있어서 데이터를 한번씩만 주고 받으면 어차피 끊어질텐데 굳이 대칭키 방식으로 데이터를 주고 받는 이유가 뭘까요? https에서는 stateless 특징이 적용되지 않는건가요?
저는 평소에 실무에서 @CreationTimestamp를 썼는데요. 이게 하이버네이트에서 제공하는 건줄도 모르고 그냥 막 사용했는데, 이번에 영한님 강의에서 @CreatedDate를 알게되어 둘을 비교해보니 @CreationTimestamp 는 하이버네이트 제공 @CreatedDate 는 스프링 프레임워크 제공 인 것 같더라고요 @CreationTimestamp는 JPA의 표준이 아니라 하이버네이트에서 제공하는 거라 아무래도 나중에 그럴일은 없겠지만, JPA 구현체를 하이버네이트 말고 딴거로 바꾸면 못쓴다는 단점이 있을 것 같긴 한데, @CreationTimestamp를 쓰면 @EnableJpaAuditing 같은거 안 해줘도 돼서 편하더라고요. 실무에서는 어떤 방식이 더 선호되나요?
너무 실례되는 질문인걸 알지만 도저히 못찾겠어서 그러는데요 unInjection 옵션을 켜기 전에는 다 코드상에서 jpql을 인식해서 자동완성을 좀 편하게 했는데요 이번에 따라 치다가 unInjection 한 후로 모든 파일에 jpql이 그냥 일반 string으로 인식되더라구요 ㅠㅠ 이거 코드 하나하나 injection 하는거 말고 다 같이 injection 하는거 없을까요 ?
OrderService의 order 메소드에 대한 단위 테스트를 작성해보려는 중에 질문이 생겨서 문의드립니다! orderRepository에서 save(order)를 하려면 Order객체를 만들어줘야하는데 Order 객체를 만드는게 Member, Delivery, OrderItem 이게 필요하니깐 테스트 코드에서 일일이 생성해서 만들어준 다음에 when(orderRepository.findOne(orderId)).thenReturn(만든 order객체) 요런식으로 해줘야 할까요? 아래는 그냥 제가 끄적여 본건데 단위테스트가 독립적인 테스트라 해서 Mockito를 이용해 짜본건데 맞게 했는지 잘 모르겠습니다... OrderService의 order 메소드에 대한 단위 테스트는 어떤식으로 짜면 좋을지 조언 부탁드립니다...! @Mock private OrderRepository orderRepository; @InjectMocks private OrderService orderService; @Mock private MemberRepository memberRepository; @Mock private ItemRepository itemRepository; @Test public void 상품_주문(){ //given Member member = createMember(); Item item = createBook("시골JPA", 10000, 10); int orderCount = 2; //when when(memberRepository.findOne(member.getId())).thenReturn(member); when(itemRepository.findOne(item.getId())).thenReturn(item); doNothing().when(orderRepository).save(any(Order.class)); Long orderId = orderService.order(member.getId(), item.getId(), orderCount); //then //when(orderRepository.findOne(orderId)).thenReturn() Order getOrder = orderRepository.findOne(orderId); assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER, getOrder.getStatus()); assertEquals("주문한 상품 종류 수가 정확해야 한다.",1, getOrder.getOrderItems().size()); assertEquals("주문 가격은 가격 * 수량이다.", 10000 * 2, getOrder.getTotalPrice()); assertEquals("주문 수량만큼 재고가 줄어야 한다.",8, item.getStockQuantity()); }