SpringBoot 클론코딩 - 7일차

김재현·2022년 9월 29일

Programmers 프로젝트

목록 보기
8/9

Order 처리하기

  • OrderItem을 레코드로 만든다.

  • 제품 ID, 카테고리, 가격, 양
    이들을 담을 테이블을 만들어주자.

  • orders 테이블은 order_id email address postcode order_status created_at updated_at 컬럼들을 갖는다.
  • order_items 테이블은
    별도의 엔터티 ID를 UUID로 갖지 않고 AUTO_INCREMENT로 자동 증가하는 seq(sequence)로 키를 잡음.
    개별 아이템에 대해서는 order_id product_id를 FOREIGN KEY로 했고, order_id로 검색이 되야하기 때문에 index를 걸어놨다.
    그 외에 카테고리, 가격, 양, 생성시간과 추가시간을 컬럼으로 갖고 있다.

  • 실수로 order_id와 product_id를 PRIMARY KEY로 지정해놓은 것을 그대로 두고 테이블을 생성명령을 보내니
    Multiple primary key defined 에러가 출력된다. 이런 실수들을 조심하도록 하자.

OrderRepository 만들기

  • orders order_items은 order를 입력하면 두 테이블에 들어가야한다.
  • 인터페이스 OrderRepository를 만들고
    해당 인터페이스의 구현체인 OrderJdbRepository를 만들어준다.

  • NamedParameterJdbcTemplate을 사용하자.

toOrderParamMap

  • insert할 때는 paramMap을 전달해주어야하기 때문에
    toOrderParamMap을 만들어준다.

toOrderItemParamMap

  • 다음은 OrderItems
    OrderItems은 OrderItems 정보 외에 order_id와 생성시간, 변경시간을 전달해야 한다.
    그렇기 때문에 오더가 만들어지면, 같은 created_at과 updated_at를 갖게 되기 때문에, Order의 ID를 전달해주어야 한다. 또한 order의 created_at과 updated_at도 전달되어야 한다.
  • 마찬가지로 테이블의 컬럼을 넣어준다. 단, seq는 AUTO_INCREMENT을 해놓았기 때문에 추가하지 않아도 된다.

insert

  • insert는 작업이 여러번 이루어져야되기 때문에 @Transactional로 묶는다. → 한 군데라도 에러가 나면 롤백이 일어나도록 한다.

  • 여기에 더해서. 원하는 것은 Order를 추가하고 OrderItems 만큼 인서트를 해야한다.
    forEach사용, item만큼 업데이트 문을 날려줘야한다. seq를 제외한 값을 추가한다.

Service 만들기

  • OrderRepo를 사용하는 서비스를 만들어보자.
    인터페이스 OrderService 생성.
  • ID는 자동으로 만들어져야하고, 이메일과 주소 등은 받아와야한다.

  • email address postcode orderItems는 받아온다.
  • 이것에 대한 implement를 생성하자.
    DefaultOrderService
  • OrderRepository를 사용해야하는데, 이를 이용해서 오더를 만들고, 그 오더를 OrderRepository에 추가해주어야한다.

Controller 만들기

  • 먼저 API를 만들어주자.
  • OrderService 를 생성자 주입으로 가져온다.

  • orderService에 필요한 정보를 가져오기 위해 레코드를 만들어준다.

  • 이메일은 String으로 해준다.
    JSON을 표현하기 위한 데이터 정의나 어노테이션을 쓰거나, JSON이 아닌 다른 메시지 포맷으로 변환되기 위해 필요한 기능들을 넣을 수 있기 때문에 그것을 서비스에서 받아서 클래스를 인지하는 것보다,
    서비스는 서비스 고유의 시그니처 메서드를 갖고, 컨트롤러가 서비스가 필요한 밸류 오브젝트나 파라미터에 매개변수로 변환하는 역할을 수행하는것이 좋다.
  • 예시로 서비스는 Email이 필요한데, 이를 변환하는 역할을 createOrder 컨트롤러가 하는 것.

  • Order와 OrderItem 테이블에 데이터가 정상적으로 들어가는지 확인한다.
    productIdcategory는 웹페이지에서 가져올 수 있다.

  • 정상적으로 들어간다.
  • productId 를 product_id로 써서 한참 해맸다..

리액트에서 API 요청을 받아 Order 처리하기

  • productId로 해야할 항목이 id로 되어있어 정보가 꼬였었다.

  • 스프링부트 서버와 리액트가 잘 연결되지 않았기 때문에 구현에 문제가 있었다. 이런 문제가 생기지 않도록 조심하도록 하자.
  • summary에서 버튼을 클릭할 때
    이메일, 주소, 우편번호는 order 데이터에 해당한다.
    따라서 타이핑하는 것에 대한 상태를 관리해주어야 한다.

  • const [order, setOrder] = useState({});
    userState, const로 order, setOrder를 필드로 정의.
  • 각각의 input 태그와 연결시켜준다.
    value={order.~~~}
    밸류 어트리뷰트에 order, 각각에 이어지는 필드를 연결한다.
  • 변경 이벤트인 onChange를 했을 때, 변경이 발생했을 때 생기는 이벤트를 캐치해서 Order에 필드를 갖고 와서 연결해야한다.
const changeInput = (e) => {
        const value = e.target.value;
  • onChange 할때마다 받는 콜백을 연결해야함.
    onChange={changeInput}
    Input에 onChange가 발생하면 changeInput이 호출된다.
  • 콘솔로그를 넣어서 타이핑한 값이 잘 입력되나 확인해보자.

  • 잘 입력된다.

개별로 정의하기

  • 각 필드에 맞는 콜백함수를 만들어주자.

  • changeInput함수를 각 필드에 맞게 바꿔주고, onChange 값도 그에 맞춰 바꿔준다.
    초기값이 없어 오류가 발생하는 것은 ~~: "으로 초기값을 공란으로 만들어서 해결해주자.
  • onChange를 삭제하면 각 항목에 입력이 안되는 것을 확인할 수 있다.

React 컨트롤드 컴포넌트

  • 요소가 리액트의 상태가 연결되는 것을 react controlled component
    연결되지 않는 것을 react uncontrolled component라고 한다.

결제하기 버튼 구현하기

  • 결제하기 버튼이 Order를 출력하도록 하자.
    handleSubmit 구현하기

  • 콘솔 로그를 찍어보자

  • 잘 찍히는 것을 확인할 수 있다.

0개의 댓글