안녕하세요 선생님! 수업 잘 듣고있습니다 : ) ! 질문이 있습니다. concat 문자열 합치기 처리는 JPQL 문에서 처리 하지 않고 entity column 값을 그대로 가져와서 자바에서도 합치는 처리가 가능할 것 같은데 보통은 어떻게 처리하는게 좋을까요? 저는 공부하면서 뭔가 JPA가 객체지향 SQL을 사용하기 때문에 가능한 데이터를 entity 에 맞춰 그대로 값을 가져오고 자바에서 객체지향처럼 조작해서 처리하는게 것이 재사용성이 있어서 좋다고 생각했는데 실무 경험이 많이 없어서 어떤 기준을 잡아야 할지 헷갈리네요!
안녕하세요 영한님 강의 정말 잘 보고 있습니다!! 다름이 아니라 MemberController의 addForm 메서드 파라미터를 @ModelAttribute("member") Member member 위와 같이 받으신 이유가 단순히 아래와 같이 Model을 파라미터로 받아서 직접 추가하는 것과 같은 효과를 내기 때문인가요? @GetMapping("/add") public String addForm(Model model) { model.addAttribute("member", new Member()); return "members/addMemberForm"; }
아무래도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과 데이터 뻥튀기에대해 강의도 다시듣고 , 찾아보고하지만 머리 뇌리속에 안박히네요..
라디오 버튼의 경우 모두 선택하지 않는 null을 사용할 경우는 거의 없어 보입니다. 따라서 처음 addForm을 표시할 때 부터 제일 앞의 도서가 선택되어있는 상태로 만들고 싶은데 이 경우는 Thymeleaf에서 어떻게 할 수 있을까요? [x] 도서 [ ] 음식 [ ] 기타
저는 평소에 실무에서 @CreationTimestamp를 썼는데요. 이게 하이버네이트에서 제공하는 건줄도 모르고 그냥 막 사용했는데, 이번에 영한님 강의에서 @CreatedDate를 알게되어 둘을 비교해보니 @CreationTimestamp 는 하이버네이트 제공 @CreatedDate 는 스프링 프레임워크 제공 인 것 같더라고요 @CreationTimestamp는 JPA의 표준이 아니라 하이버네이트에서 제공하는 거라 아무래도 나중에 그럴일은 없겠지만, JPA 구현체를 하이버네이트 말고 딴거로 바꾸면 못쓴다는 단점이 있을 것 같긴 한데, @CreationTimestamp를 쓰면 @EnableJpaAuditing 같은거 안 해줘도 돼서 편하더라고요. 실무에서는 어떤 방식이 더 선호되나요?
너무 실례되는 질문인걸 알지만 도저히 못찾겠어서 그러는데요 unInjection 옵션을 켜기 전에는 다 코드상에서 jpql을 인식해서 자동완성을 좀 편하게 했는데요 이번에 따라 치다가 unInjection 한 후로 모든 파일에 jpql이 그냥 일반 string으로 인식되더라구요 ㅠㅠ 이거 코드 하나하나 injection 하는거 말고 다 같이 injection 하는거 없을까요 ?
항상 좋은 강의 감사드립니다. 1. Member loginMember = memberRepository .findById(memberId) ; if (loginMember == null ) { return "home" ; } 이부분 로직에서 궁금한것이 쿠키가 이미 발급되었다는것은 로그인 입력정보와 일치하는 회원이 회원저장소에 존재한다는것을 전제로 하는데 왜 loginMember과 null인지 한번더 검증하는지 이해가 가질 않습니다. 2. cookie만료와 관련해서 addcookie를 여러번 하면 결국 오버랩되어서 마지막으로 set-cookie로 보낸 쿠키만이 저장되는 것인가요?? 3. loginhome에서 로그아웃을 왜 post메서드로 보내는지 이해가 가질 않습니다. 단지 maxage가 0인 쿠키만 보내고 홈화면으로 리다이렉트로 get하면 되는것 아닌가요???
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()); }
안녕하세요 강사님. 항상 좋은 수업 감사드립니다. 다름이 아니라 @ModelAttribute를 사용하면 매번 생성하는 문제가 있다고 하셔서 한번 제 생각대로 구현해봤습니다. 이전 Memory에 사용했던 싱글톤 패턴? 형식으로 DeliverCode 값을 초기화한 List를 가지는 클래스를 구현하고 이를 호출하는 식으로 구현하였는데 이런 방식으로 사용하면 되는것인지 궁금합니다. package hello.itemservice.domain.item ; import java.util.Arrays ; import java.util.List ; public class DeliveryCodesCreate { private static final List<DeliveryCode> deliveryCodes = Arrays. asList ( new DeliveryCode( "FAST" , " 빠른 배송 " ) , new DeliveryCode( "NORMAL" , " 일반 배송 " ) , new DeliveryCode( "SLOW" , " 느린 배송 " ) ) ; public static List<DeliveryCode> getInstance () { return deliveryCodes ; } private DeliveryCodesCreate () { } } @ModelAttribute ( "deliveryCodes" ) public List<DeliveryCode> deliveryCodes () { // List<DeliveryCode> deliveryCodes = new ArrayList<>(); // deliveryCodes.add(new DeliveryCode("FAST", " 빠른 배송 ")); // deliveryCodes.add(new DeliveryCode("NORMAL", " 일반 배송 ")); // deliveryCodes.add(new DeliveryCode("SLOW", " 느린 배송 ")); // return deliveryCodes; return DeliveryCodesCreate. getInstance () ; }
이 강의를 들으며 스프링을 처음 공부해봤습니다. 이 강의를 다 들은 후 [스프링 완전 정복]로드맵을 들을지 [스프링부트와 JPA 완전 정복]을 들을지 고민이 되는데, 추천해주실 수 있나요? 현재 저의 상황을 말씀드리자면 이 강의를 듣기 전 장고로 간단하게 개인 프로젝트를 해본 적이 있습니다. 규모는 크지 않고 간단한 CRUD 정도 해봤습니다. 현재 앱개발 외주를 받았는데, UI를 만드는 사람은 따로 있고 저는 백엔드 서버만 개발하면 됩니다. (외주 개발 기간은 2달 +@ 입니다. 기능은 로그인, 회원가입, 결제.. 등이 있고 택배 어플과 유사한 기능을 하는 앱입니다) 이런 상황을 전체적으로 고려했을 때 어떤 로드맵이 더 좋을까요? 참고로 김영한님의 모든 강의는 이미 구매했습니다.
만약 다음과 같이 인풋을 받았다고 가정하겠습니다. @Valid @ModelAttribute ItemDto itemDto 이 경우에, 각 필드에 대한 검증은 ItemDto 내의 @NotBlank, @Max, @Min과 같은 어노테이션으로 해결하고, ObjectError의 경우 ItemDtoValidator를 만들어 Validator를 구현하여 @InitBinder로 등록해두는 건 안되나요..?