#상품 등록상품 등록 폼에서 데이터를 입력하고 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..
#회원등록 MemberForm폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리한다- 필요한 것만 뽑아 쓰는게 깔끔함- 요구사항이 실무에서 단순하지 않음 일대일로 매칭되는 경우 거의없음- 엔티티에 화면을 추가하는 기능이 많아지면 지저분해짐 ->화면종속적기능 -> 유지보수 힘들다엔티티를 최대한 순수하게 유지할것!!!@Getter @Setterpublic class MemberForm { @NotEmpty(message = "회원 이름은 필수입니다.") //name은 필수 나머지는 선택 private String name; private String city; private String street; private String zipc..
#주문기능테스트 테스트 요구사항- 상품 주문이 성공해야 한다.- 상품을 주문할 때 재고 수량을 초과하면 안 된다.- 주문 취소가 성공해야 한다. OrderServiceTest@RunWith(SpringRunner.class)@SpringBootTest@Transactionalpublic class OrderServiceTest { @Autowired EntityManager em; @Autowired OrderService orderService; //OrderService 받아옴 @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Excep..
#주문 엔티티 개발(비즈니스 로직 추가)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..
구현 기능 - 상품 등록- 상품 목록 조회- 상품 수정#파일구조 #상품 엔티티 개발(비즈니스 로직 추가)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 { ..
#파일구조 (@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쿼리 날라가서 저장 ..
#★모든 연관관계는 지연로딩으로 설정★즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. ex) member를 조회할때 연관된 order엔티티까지 한꺼번에 다 조회된다.최악의 경우에 하나를 조회할때 연관된 모든 것를 DB에서 가져와버림...뭐 하나 잘못 건들면 연관된 데이터 다 끌고와서 난리남절대로 쓰지말것 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. ->n번 호출된다..실무에서 모든 연관관계는 지연로딩( LAZY )으로 설정해야 한다.ex) order 조회할때 order만 가져오게 된다.연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.> 실시간으로 원하는것만 가져오는 것 ★제발 주..
2.1,2 HTTP는 클라이언트와 서버 간 통신을 한다.HTTP 프로토콜에서는 반드시 한쪽이 클라이언트(request) 다른 한 쪽은 서버(response)역할을 담당클라이언트측에서 먼저 통신이 시작 -> request가 있어야 response가 있음 GET : 서버에 요구하는 종류 == 메소드/index.html : request URI(요구대상) == 리소스HTTP/1.1 : 클라이언트 기능 식별 == HTTP 버전 번호- 다른예시POST(메소드) /form/entry(URI) HTTP/1.1(프로토콜 버전)Host: hackr.jp (리퀘스트 헤더 필드)Connection: keep-alive (리퀘스트 헤더 필드)Content-Type: application/x-www-form-urlencoded..
#파일구조 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"),//중간테이블과 ..
[도메인 분석 설계] #참고 *(다) - 무조건 여기에 외래키 존재 , 외래키를 연관관계 주인으로 잡아야함 ex) 자동차 - 바퀴(외래키) 그래야 유지보수 쉽다. - 주인쪽에 값을 세팅해야 값 바뀜 - 1쪽은 그냥 읽는데만 쓰임 엔티티(Entity) - 객체 , 추상적 - DB에서 한 건의 자료를 구성하는 레코드로 속성을 가진다. ex) 과목 : 국,영,수 - DB나 SQL상에 존재하지 않는다. 테이블과 달리 그냥 일종의 개념이다. - 엔티티 사이의 관계: 릴레이션(relationship) - 이것을 도표로 나타낸 것 : ERD(Entity Relationship Diagram) - 도메인 > 엔티티 > 속성 테이블 - 테이블은 데이터베이스나 SQL에 실제로 존재하며 물리적인 구조를 지니고 있다. 엔티티..
#파일구조 application.yml spring: #띄어쓰기 제대로..... datasource: #2칸 url: jdbc:h2:tcp://localhost/~/jpashop #4칸 , DB접속 url username: sa password: driver-class-name: org.h2.Driver jpa: #2칸 hibernate: #4칸 ddl-auto: create #6칸 properties: #4칸 hibernate: #6칸 # show_sql: true #8칸 format_sql: true #8칸 logging.level: #없음 org.hibernate.SQL: debug #2칸 org.hibernate.type: trace #2 MemberRepository @Repository //=..
#라이브러리 살펴보기 의존관계를 볼 수 있다. spring-boot-starter-thymeleaf 타임리프 템플릿 엔진(View) spring-boot-starter-web tomcat: 톰캣 (웹서버) spring-webmvc: 스프링 웹 MVC spring-boot-starter-data-jpa spring-boot-starter-aop spring-boot-starter-jdbc :HikariCP 커넥션 풀 (부트 2.0 기본) , DB 커넥션 가져다 쓴다 hibernate + JPA : 하이버네이트 + JPA spring-data-jpa: 스프링 데이터 JPA spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅 spring-boot-starter-test junit..