![[Day-15] rest api 엔티티 직접 노출](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBClB%2FbtssigBdq26%2F28fEDhPFAJP2lTOAkmm9lk%2Fimg.png)
조회용 샘플 데이터 입력 InitDbpackage jpabook.jpashop;import jpabook.jpashop.domain.*;import jpabook.jpashop.domain.item.Book;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import javax.annotation.PostConstruct;import javax.persistence.EntityManager;/** * * userA * JPA1 BOOK * JPA2 BO..
![[Day-14] 회원등록/수정/조회 API](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzXpvw%2FbtssfEvwoUe%2F1ZFCW4n1KAd02ikyuuQSe0%2Fimg.png)
회원등록 공통으로 예외처리할 요소가 많이 달라서 ~~Postman으로 보자~~ MemberApiController.java//회원등록//문제발생 : 엔티티를 수정하면 api 스펙이 변해버릴 수 있다. 그렇기 때문에 api 스펙을 위한 별도의 dto 만들어야한다.@PostMapping("/api/v1/members") //body에서 온 json 데이터를 매핑해서 member에 다 넣는다public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { //Valid : Member 검증 (ex: NotEmpty) Long id = memberService.join(member); ret..
![[Day-13] 변경감지와 병합, 상품주문, 주문 목록 검색, 주문 취소](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGGGKQ%2FbtssgH55eio%2F97LrN71KKiDTN5z0lqEzIk%2Fimg.png)
#변경감지와 병합 준영속 엔티티?영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.(여기서는 itemService.saveItem(book) 에서 수정을 시도하는 Book 객체다.Book 객체는 이미 DB 에 한번 저장되어서 식별자가 존재한다.이렇게 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준 영속 엔티티로 볼 수 있다.) 준영속 엔티티를 수정하는 방법1. 변경 감지 기능2. 사용 병합( merge ) 사용 ItemController/** * 상품 수정 */@PostMapping(value = "/items/{itemId}/edit") //post로 받았다.public String updateItem(@PathVariable Long itemId..
![[Day-12] 상품 등록, 목록, 수정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpGHof%2FbtsscEvRVaf%2FFq2myV3LWtX456MPY3AtC0%2Fimg.png)
#상품 등록상품 등록 폼에서 데이터를 입력하고 Submit 버튼을 클릭하면 /items/new를 POST 방식으로 요청상품 저장이 끝나면 상품 목록 화면( redirect:/items )으로 리다이렉트 ItemController/** * 상품 등록 클릭시 */@GetMapping(value = "/items/new")public String createForm(Model model) { model.addAttribute("form", new BookForm()); //이렇게 넘겨줘서 html에서 추적가능 return "items/createItemForm";}/** * 상품 등록 (submit) */@PostMapping(value = "/items/n..
![[Day-11] 회원 등록, 목록 조회](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F024mZ%2FbtssgE9oRWA%2FuLeMor16Ub5oCrcCfrzPmk%2Fimg.png)
#회원등록 MemberForm폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리한다- 필요한 것만 뽑아 쓰는게 깔끔함- 요구사항이 실무에서 단순하지 않음 일대일로 매칭되는 경우 거의없음- 엔티티에 화면을 추가하는 기능이 많아지면 지저분해짐 ->화면종속적기능 -> 유지보수 힘들다엔티티를 최대한 순수하게 유지할것!!!@Getter @Setterpublic class MemberForm { @NotEmpty(message = "회원 이름은 필수입니다.") //name은 필수 나머지는 선택 private String name; private String city; private String street; private String zipc..
![[Day-10] 주문기능테스트, 부트스트랩적용](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcupQ56%2FbtssfyB7nbg%2FXUj2RfuKBuv7zsvAGnfknK%2Fimg.png)
#주문기능테스트 테스트 요구사항- 상품 주문이 성공해야 한다.- 상품을 주문할 때 재고 수량을 초과하면 안 된다.- 주문 취소가 성공해야 한다. OrderServiceTest@RunWith(SpringRunner.class)@SpringBootTest@Transactionalpublic class OrderServiceTest { @Autowired EntityManager em; @Autowired OrderService orderService; //OrderService 받아옴 @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Excep..
![[Day-9] 주문 엔티티, 리파지토리, 서비스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feztsan%2FbtssfEI2ZD7%2Fc7ZYkQbVQV2Q2k26JJ2xtk%2Fimg.jpg)
#주문 엔티티 개발(비즈니스 로직 추가)domain - Order//==생성메서드==////회원,배송,주문내역 넘기기 (...: 여러개)public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { // 위에 선언 private List orderItems = new ArrayList(); order.addOrderItem(orde..
![[Day-8] 상품 엔티티, 리파지토리, 서비스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHnWv%2FbtssfRIaqnd%2FVvLMJiSrMU9FVxrGJbEqI1%2Fimg.png)
구현 기능 - 상품 등록- 상품 목록 조회- 상품 수정#파일구조 #상품 엔티티 개발(비즈니스 로직 추가)domain -> Item//비즈니스 로직/*재고 증가 */public void addStock(int quantity){ this.stockQuantity+=quantity;}/*재고 감소 */public void removeStock(int quantity){ int restStock = this.stockQuantity -quantity; if(restStock NotEnoughStockExceptionpublic class NotEnoughStockException extends RuntimeException { ..
![[Day-7] 회원 도메인, 리포지토리, 서비스, 회원 기능 테스트](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGTS0E%2FbtssarxdlFW%2FVBn7ty1tsX6Lg2EyMl8IMk%2Fimg.png)
#파일구조 (@Repository ==DAO)#회원 리포지토리 개발MemberRepository@Repository //Component scan해서 spring bean 자동등록public class MemberRepository { @PersistenceContext //spring이 jpa가 Entity Manager를 만들어서 EntityManager를 여기에 주입 private EntityManager em; //jpa가 member를 저장하는 로직 //EntitlyManager가 persist하면 영속성 컨택스트에 Member Entity를 넣고 트랜잭션이 커밋되는 시점에 DB에 insert쿼리 날라가서 저장 ..
![[Day-6] 엔티티 설계 (연관관계)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJDbb%2Fbtssbi7Ehnn%2FNzDKDWCyuWxB0dYKcOMfPk%2Fimg.png)
#★모든 연관관계는 지연로딩으로 설정★즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. ex) member를 조회할때 연관된 order엔티티까지 한꺼번에 다 조회된다.최악의 경우에 하나를 조회할때 연관된 모든 것를 DB에서 가져와버림...뭐 하나 잘못 건들면 연관된 데이터 다 끌고와서 난리남절대로 쓰지말것 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. ->n번 호출된다..실무에서 모든 연관관계는 지연로딩( LAZY )으로 설정해야 한다.ex) order 조회할때 order만 가져오게 된다.연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.> 실시간으로 원하는것만 가져오는 것 ★제발 주..
![[Day-5] 엔티티 클래스 개발2](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIC77l%2Fbtsr0YoIMDf%2F0o7tZPjGNzwGmzGFYgLve0%2Fimg.png)
#파일구조 Category //카테고리 엔티티 @Entity @Getter @Setter public class Category { //pk @Id @GeneratedValue @Column(name="category_id") private Long id; private String name; @ManyToMany // Category엔티티도 List로 items을 가지고, item엔티티도 List로 Category를 가진다. //일대다 다대일로 풀어내는 중간테이블이 존재하기 때문에 테이블로 매핑해줘야한다 @JoinTable(name = "category_item", //중간테이블 이름 정하기 //매핑 joinColumns = @JoinColumn(name = "category_id"),//중간테이블과 ..
![[Day-4] 도메인 모델과 테이블 설계, 엔티티 클래스 개발 1](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6VSwF%2FbtssbByqA5z%2FeTaFKjKrZBqv7rOYkNgvGk%2Fimg.png)
[도메인 분석 설계] #참고 *(다) - 무조건 여기에 외래키 존재 , 외래키를 연관관계 주인으로 잡아야함 ex) 자동차 - 바퀴(외래키) 그래야 유지보수 쉽다. - 주인쪽에 값을 세팅해야 값 바뀜 - 1쪽은 그냥 읽는데만 쓰임 엔티티(Entity) - 객체 , 추상적 - DB에서 한 건의 자료를 구성하는 레코드로 속성을 가진다. ex) 과목 : 국,영,수 - DB나 SQL상에 존재하지 않는다. 테이블과 달리 그냥 일종의 개념이다. - 엔티티 사이의 관계: 릴레이션(relationship) - 이것을 도표로 나타낸 것 : ERD(Entity Relationship Diagram) - 도메인 > 엔티티 > 속성 테이블 - 테이블은 데이터베이스나 SQL에 실제로 존재하며 물리적인 구조를 지니고 있다. 엔티티..