본문 바로가기

내일 배움 캠프

2023-12-05

오늘은 내배캠 심화주차 팀프로젝트 1일차이다. 오늘 진행한 일은 다음과 같다.

 

1. 프로젝트 API명세서, ERI, Wireframe작성

 

2. Menu 초기 JPA 데이터를 입력하기 위한 Sql문 작성 및 글로벌 Exception 작성

 

1. 오늘은 프로젝트 첫날이라 팀프로젝트 진행전 기본적으로 필요한 구상을 진행했다. 이번 팀프로젝트 아이디어는 김밥천국 키오스크같은 배달 앱이다. 원래는 배민어플처럼 구상하는것이 목표였으나 기간의 한계와 구조의 확장성만 고려하여 정했다. 따라서 아이디어의 구현이 빠르게 완료되면 배달앱으로 발전시킬 예정이다.

저번 팀 프로젝트에서도 첫날 구조를 잘 잡아서 코드가 작성이 편했던 그 경험을 바탕으로 신중하게 API명세서 ERD를 작성했다. Wireframe은 사실 해도 직접 프론트를 만드는것이 아니면 크게 체감되지는 않지만 일단 작성은 했다. 

먼저 ERD는 다음과 같다.

이번 ERD에서는 Order가 핵심이다 Order를 중심으로 모든 Entity가 연결되며 프로젝트의 전반적인 처리를 담당한다. 원래는 장바구니까지 뺏으나 이러면 Order의 책임이 너무 무거워져서 Basket을 통한 N:M 구성을 통해 Order책임 비중을 줄였다. 보이는 이미지에서 내가 담당한 Entity는 Menu이다. 

Menu는 김밥천국 메뉴를 정보를 제공해 주는 역할을 하며 관리자가 추가 및 수정기능을 할수있게끔 설계를 했다. 

API명세서는 위 사진의 ERD를 바탕으로 작성을 진행했다.

 

2. Menu를 구상하기 위해서는 초기 어플리케이션을 실행할때 리포지토리에 데이터를 넣어주거나 SQL 파일을 통해 Spring이 동작할때 시작하는 2가지 방법이 있었는데 첫번째 방법은 너무 비효율적인 생각이 들어 두번째 방법을 통해 완성했다. 

2번째 방법을 바탕으로 SQL 을 작성하고 application.yaml파일에 아래의 코드블럭을 추가해 실행할때마다 추가하도록 했다.

sql:
  init:
    mode: always

  

하지만 위의 방법은 데이터가 들어가 있어도 재실행하면 다시 SQL 문이 실행돼서 데이터가 중복으로 쌓이는 문제를 가지고 있었다. 따라서 SQL파일을 수정하여 실행할때 DB에 같은 데이터가 있다면 입력되지 않도록 변경했다. 

CREATE TABLE IF NOT EXISTS menu (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    category VARCHAR(255),
    name VARCHAR(255),
    price DOUBLE
);

INSERT INTO menu (category, name, price)
SELECT * FROM (
      SELECT '김밥' AS category, '김밥' AS name, 2.0 AS price UNION ALL
      SELECT '김밥', '야채김밥', 3.0 UNION ALL
      SELECT '김밥', '참치', 3.0 UNION ALL
      SELECT '라면', '라면', 2.0 UNION ALL
      SELECT '라면', '참치라면', 2.0 UNION ALL
      SELECT '라면', '해물라면', 2.0 UNION ALL
      SELECT '라면', '해장라면', 2.0
              ) AS init
WHERE NOT EXISTS (
    SELECT 1 FROM menu
    WHERE menu.category = init.category
      AND menu.name = init.name
      AND menu.price = init.price
);

이렇게 진행하고 보니 더이상 재실행해도 중복된 데이터는 생기진 않았지만 이렇게 안해도 뭔가 application.yaml파일에서 설정을 통해 해결할 수 있지않을까? 라는 생각이 들었다. 그래서 내일은 이 설정을 통해 실행할때 DB에 데이터가 있다면 실행을 하지않고 없으면 실행하는 설정을 찾아서 적용해볼 예정이다.

 

'내일 배움 캠프' 카테고리의 다른 글

2023-12-07  (1) 2023.12.08
2023-12-06  (1) 2023.12.06
2023-12-04  (3) 2023.12.04
2023-12-01  (2) 2023.12.01
2023-11-30  (0) 2023.12.01