목록전체 글 (261)
당니의 개발자 스토리
회원 등록자 이번 시간에는 회원 가입을 만들어 보겠습니다.우리가 이전 시간에 만들었던 홈 화면에서회원 가입을 딱 누르면,제가 members/new로 가도록 개발해놨단 말이에요.여기 보시면 태그 a랑 href는 아시죠?링크 태그 사용법 : https://mjmjmj98.tistory.com/122이 링크 태그를 통해서 members/new로 이동하도록 되어 있습니다. 그래서 여기서부터 회원 가입 폼이 떠야 되겠죠.자 회원 가입 폼이 떴을 때를 생각을 해서 먼저 폼 객체를 만들 거예요.제가 java 코드는 웬만하면 다 직접 치고요. html은 웬만하면 복사 붙이기를 하겠습니다.일단 이렇게 하고 여기에다가도 재밌는 기능을 하나 넣을 거에요.@NotEmpty 라고 jakarta.validation 라는 게 있..
홈 화면과 레이아웃여러분 이제 드디어 웹계층을 개발해보겠습니다. 실제 지금까지 만든 베이스 코드를 기반으로 화면을 하나씩 만들어가는 거죠. 실제 동작하는 화면을 만드는 신나는 시간입니다.먼저 웹계층 개발에 목차를 말씀드리면,제일 처음에 홈 화면이랑 레이아웃이 어떻게 되는지 설명을 해 드릴 거고요. 참고로 여기서는 타임리프로 어떻게 구성하는지 쭉 해볼 겁니다.자 그리고 회원을 등록하고 목록을 조회하는 회원 기능, 그 다음에 상품을 등록하고 목록을 뿌리고 상품을 수정하는 기능을 하면서 뭘 할 거냐면 제가 여러분께 변경 감지와 병합(merge)이라는 것을 설명 드릴 거에요.뭐냐면 jpa에서 상품 수정 다음에 바로 할 건데, 어떻게 데이터를 수정하는 게 올바른 방법인가에 대해서 변경 감지와 병합(merge)으로..
주문 검색 기능 개발이번 시간에는 주문에서 검색 기능을 한번 개발해 보겠습니다.그러니까 이번 장의 핵심은 JPA에서 동적 쿼리를 어떻게 해결해야 되는가? 이거를 설명드리려고 일부러 이걸 만들었어요.화면 먼저 보여드리면,주문 내역을 가보면,이렇게 여기 회원명과 주문 상태로 검색을 할 수 있게 되어 있어요. 필터링 조건이 들어가는 거죠. 회원명이 userA 이렇게 하면userA만 되고 이걸 취소하면,주문 상태가 주문인 거랑 취소인 거랑 이렇게 보이겠죠.이걸 잘 보시면 결국 이게 동적 쿼리가 만들어져야 되는 상황이에요. 파라미터로 회원명이 있으면 where 문에 회원명이 들어가야 되고, 주문 상태가 선택이 되면 where 문에 주문 상태가 들어가야 되고요.보통 실무에서는 이런 동적 쿼리를 안 쓸 수가 없거든요..
주문 기능 테스트자 이번 시간에는 지금까지 만든 주문 기능을 한번 테스트 코드로 작성해 보겠습니다.우선 여기 보면만든 것 중에 중요한 비즈니스가 order 메서드를 통해서 주문을 하는 게 있고,그 다음에 주문이 잘 취소되는지 확인하는 cancelOrder 메서드가 있고,그리고 또 하나가 핵심 validation 로직이 있었죠. 주문할 때 만약 재고 수량을 초과하면 오류가 나야 되겠죠. 그게 지금 이 로직에서 잘 동작하는지 확인하는 테스트를 작성을 해보겠습니다.먼저, OrderServiceTest를 만들어야겠죠. cmd + shift + T 하면 만들어집니다.여기까지는 자동으로 나와야합니다. 그 전에 다 했던 것들이죠. 그래서 여기까지 세팅을 건 다음에 저희가 이제 상품을 주문하는 테스트를 만들어야 되죠...
주문 서비스 개발이제 드디어 주문 서비스를 개발해 보겠습니다.OrderService를 만들구요.주문 서비스는 사실 제일 중요한게 이 세 가지겠죠.자 그러면 지금까지 만든 걸 가지고 어떻게 엮는지 보여드릴게요.서비스니까 우선 @Service annotation 있어야 되고 @Transactional을 거의 자동으로 readOnly를 true로 잡아줬구요. 그 다음에 @RequiredArgsConstructor가 있어야 하고, OrderRepository가 있어야 되죠. 그런데 OrderService는 생각해 보시면 repository가 많이 필요합니다. 일단 하면서 보여드릴게요.주문 먼저 개발해 보겠습니다.자 주문은 일단 데이터를 변경하는 것이기 때문에 @Transactional이 있어야 되고요.그 다음에..
주문 리포지토리 개발이번 시간에는 주문 리포지토리를 개발해 보겠습니다.repository 패키지 안에 OrderRepository를 만들면 되고,이제 자동으로 나와야죠.그 다음에 이제 주문 로직은 단순하죠.Order를 그냥 넣으면 되니까요.그리고 이제 Order 단건 조회를 하려면,findOne 해가지고 id를 넣어서 반환 할 때 em.find로 Order.class랑 id 값을 넣어주고 return 하면 됩니다.마지막으로주문 내역을 누르면,검색이 됩니다.지금 보시면 userA로 검색이 되고, 주문 상태도ORDER랑 CANCEL로 검색이 됩니다.자 그럼 이러한 검색 기능을 개발해야 되겠죠. 검색 기능은 좀 복잡하기 때문에 동작 쿼리가 들어가야 돼서 제일 마지막에 따로 설명을 드릴게요. 따로 한 강의를 쪼..
주문, 주문상품 엔티티 개발이번 시간에는 가장 중요한 주문도메인을 한번 개발해 보겠습니다.여러분 지금까지 설명드린 것 중에 이 주문 도메인이 정말 제일 중요해요. 왜냐하면 여기에 뭔가 비즈니스 로직들이 얽혀서 돌아가는 걸 JPA나 엔티티를 가지고 어떻게 풀어내는지 아실 수가 있거든요.그리고 이제 저희가 흔히 듣던 트랜잭션 스크립트 패턴과 도메인 모델 패턴, 도메인 모델 패턴을 많이 못 접해보셨을 거에요. 엔티티에 실제 비즈니스 로직이 있고 더 많은 것을 엔티티로 위임하고 이런 스타일인데 그런 것들이 어떻게 되는지 코드를 통해서 이해해 보실 수가 있습니다.우선 구현은 상품을 주문하고, 주문이 제일 복잡하겠죠? 그 다음에 주문 내역을 조회하고 주문을 취소할 수 있습니다. 이렇게까지가 구현인데 한번 보여드릴게..
상품 서비스 개발여러분 이번 시간에는 상품 서비스를 개발해 보겠습니다.ItemService를 만들면 되구요.여기까지 쭉쭉 적어주시면 되겠죠.그 다음에 save가 필요하겠죠. 근데 지금 보시면 readOnly 잖아요.그럼 save는 @Transactional이 있어야 되죠. 왜냐면 readOnly = true이면,얘가 저장이 안됩니다. 그래서 save 위에 @Transactional을 써줘서 오버라이딩을 해버린 거죠. 그러니까 맨 위의 @Transactional annotation은 전체를 먹는 거고. method에 가까운 게 더 우선권을 가집니다.자 그 다음에 조회하는 걸 만들어 볼게요.이미 만들어 놔서 이렇게 하면 끝납니다. 그럼 findItems()는 @Transactional이 없으니까 맨 위에 있..