스프링데이터 + JPA/웹 애플리케이션 개발 27

17. 주문 리포지토리, 서비스

리포지토리 @Repository @RequiredArgsConstructor public class OrderRepository { private final EntityManager em; public void save(Order order){ em.persist(order); } public Order findOne(Long orderId){ return em.find(Order.class, orderId); } // public List findAll(OrderSearch orderSearch){} } 간단하게 주문 저장, 주문 하나 가져오기. 그런데 여러개 가져오는데, 검색 옵션에 따라 가져오기. 저건 동적 쿼리가 필요해서 나중에 따로 함. 서비스 기능 요구 사항은 주문 조회 주문 주문 취소 먼저 ..

16. 주문 도메인 개발

주문, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 기능 테스트 주문 검색 기능 테스트 구현 기능 상품 주문 주문 내역 조회 주문 취소 일단 주문 엔티티 개발 public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.changeMember(member); order.changeDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.se..

15. 상품 개발

상품 엔티티 개발(비즈니스 로직) 상품 리포지토리 개발 상품 서비스 개발 상품 등록 상품 목록 조회 상품 수정 @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Getter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List categories = new ArrayLis..

14. 회원 테스트

테스트 요구사항 회원가입 성공 회원가입 시 같은 이름이 있을 시 예외 발생 @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Test public void 회원가입(){ Member member = new Member(); member.setName("memberA"); Long savedMemberId = memberService.join(member); Member findMember = memberService.findOne(savedMemberId); assertThat(member).isEqualTo(findMember); } @Test public void 중복_회원_예..

11. 애플리케이션 아키텍처

계층형 아키텍처 사용할 거임 controller, web : 웹계층 service : 핵심 비즈니스 로직, 트랜잭션 처리 repository : JPA를 직접사용하는 계층, 엔티티 매니저 사용 domain : 엔티티가 모여 있는 계층. 모든 계층에서 사용. 근데 여기서 컨트롤러가 직접 repository를 사용하기도 하도록 만든다고 한다. 아키텍쳐 딱딱하게 설계해서 간단한 조회같은 건데 무조건 service타게하는 것도 좀 그렇다고.. 패키지 구조 exception은 예외 공통처리를 모아놓은 곳 개발순서 서비스, 리포지토리, 도메인 먼저 계발. 도메인인 이미 우리가 설계를 많이 하긴 함. 근데 추가적인 비즈니스 메소드가 도메인에 들어감(엔티티의 장점) 웹 환경을 제외한 핵심 비즈니스 계층을 먼저 개발하고..

10. 구현 요구사항

지금까지 도메인 설계 다 했고, 이제 본격적으로 걔네들 사이의 비즈니스 로직 설계 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 예제 단순화를 위해 다음 기능은 구현 안함 로그인과 권한관리 파라미터 검증과 예외처리 단순화 상품은 도서만 사용 카테고리, 배송정보는 사용 X 아쉽다 솔직히. 나는 로그인 -> 로그인 세션 유지 게시판 글 남기기 글에 들어가 사용자 클릭하면 사용자 정보 가져오기 정도는 할 수 있을 줄 알았다.

9. 엔티티 개발 주의점

가급적 setter 사용 금지 아니면 private 해서 비즈니스 메소드를 따로 만들어서 하셈 모든 연관관계는 지연로딩으로 이게 JPA가 자동으로 쿼리 만들어서 나가는 거기 때문에 어떤 쿼리들이 나갈 지 연관관계는 예측이 잘 안될수도 있음. 근데 즉시로딩으로 하면 다 끌고 오기 때문에 성능적 손해가.. 그냥 다 지연로딩으로 하셈. @XToOne은 다 즉시로딩이 기본이라 직접 지연로딩으로 설정 해야 함 (ctrl + shift + F가 모든 파일에서 단어찾기) 한방에 같이 가져오고 싶으면 fetch join을 사용하셈. 컬렉션은 new ArrayList()로 초기화 해놔라. null 에러에서 안전함. 거기다 하이버네이트에서 영속화 할때 컬렉션은 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변강 함. 그래..

8. 엔티티 개발 2

다대다 실무에서 안쓴다. @Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name = "category_id") private Long id; private String name; @ManyToMany @JoinTable(name = "category_item", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "item_id")) private List items = new ArrayList(); } 다대다는 위와같은 테이블 형태밖에 할 수 없다. 다대다에 테이블 설정을 해준다. 얘 입장에서 관여할 colu..