Giter VIP home page Giter VIP logo

todo-max's Introduction

todo-max

팀원 소개

네모네모(BE) 이안 (BE) 지구 (BE) 감귤 (BE) Kakamotobi (FE) 퓨즈 (FE)

그라운드룰

스크럼 방식

시간: 10:00 - 10:30

스크럼 내용: 어제 했던 일 / 오늘 할 일 / 컨디션(10점 만점)

스크럼 마스터: 스크럼 진행 및 내용 작성

x 지구 감귤 네모네모 이안
퓨즈 카카모토비 지구 퓨즈 네모네모
Details

Process

어제 무엇을 했는지 간단하게 공유.
ex
어제 계획했던대로, 검색창과 서버를 연결해서 자동완성 기능을 구현했다.
어제 계획했던 사이드바의 메인메뉴와 서브메뉴간의 이동을 ㅇㅇ문제 때문에 아직 구현하지 못했다.
작고 구체적인 오늘의 목표/계획 공유.
점심시간 전까지 Promise에 대해서 공부하고 내용을 기록하기. 코어타임 마무리 전까지 사이드바의 메인메뉴와 서브메뉴간의 이동을 구현하고 커밋 올리기. 1시간 동안 딤처리 로직을 리팩토링 하기.
기타 공유
ex
이부분이 도무지 이해가 안가고 해결이 안되고 있는데 도와주실 분 있나요?
Rules
공유자의 공유에 따른 가벼운 멘트 가능.
ex
저도 같은 고민이 있었어요. 조금 이따가 같이 의논해 볼까요?
공유자의 고민, 문제점에 대한 깊은 대화는 위 과정이 끝나고 잡담 시간 혹은 개인학습/미션해결 시간에 하기.
Scrum Master
위 과정과 규칙이 원활하게 따르게 되도록 스크럼 진행하기.
스크럼 마무리할 때 내일의 스크럼마스터 지정.

Communication

  • Github Wiki에 trouble shooting 과정 등을 기록해서 공유한다.
  • 클래스 별 수정사항 등은 Slack으로 공유, 확인했으면 답글이나 이모지 달아주기
  • 회의 방식
    • 공통 회의와 클래스 별 회의를 나눠서 진행한다.
    • 회의 진행 전에 슬랙을 통해 회의 안건을 정리해서 올려놓는다.
    • 회의 진행은 그날의 스크럼 마스터가 진행한다.
    • 만약 회의가 길어지는 경우에는 1시간 진행하고 10분 씩 휴식

협업 전략 (브랜치 구조와 분업하기, 의존적인 작업하기)

코딩 컨벤션

  • 클래스 별 논의

브랜치 전략

main

release

fe, be - 각자 작업한 feature 브랜치들을 fe, be 브랜치로 PR, merge한 feature 브랜치는 삭제

feature#1 - 로컬에서 작업한 내용들을 feature 브랜치로 push

PR 컨벤션

PR 제목

ex) [BE] PR 제목

PR 메세지 템플릿

## What is this PR? 👓

## Key changes 🔑

## To reviewers 👋

## Issues
Closes #{이슈번호}
Closes #{이슈번호}
  • What is this PR? : PR에 대한 간단한 설명
  • Key changes : 주요 변경 사항
  • To reviewers : 중점적으로 봐야 하는 부분 및 고민 사항
  • Issues: PR과 관련된 이슈번호

PR 머지 전략

  • 작업자 외 나머지 팀원들이 리뷰 후 마지막 리뷰어가 머지 후 브랜치 삭제

커밋 템플릿, 이슈 템플릿 등

커밋 컨벤션

커밋 메시지 템플릿

#{이슈번호} {커밋타입}: {커멧 제목}

- {커밋 본문}
- {커밋 본문}
#1 feat: add new feature

- 새로운 기능을 추가하였습니다.
  • 커밋 본문은 선택적으로 작성합니다.

커밋 타입 종류

  • ✨feat : 새로운 기능 추가
  • 🐛fix : 버그 수정
  • ♻️refactor : 코드 리팩토링
  • ✅test : 테스트 코드
  • 📝docs : 문서 수정
  • 🎨style : 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우
  • 💄design : CSS 등 사용자 UI 디자인 변경
  • 🔧chore : 빌드 업무 수정, 패키지 매니저 수정 → 패키지 설치, 개발 환경 세팅
  • 🔀merge : merge
  • 🚚rename: 디렉토리 및 파일명 변경
  • 🌱comment: 주석 추가 혹은 오타 수정
  • ➕add: 의존성 추가

이슈 템플릿

## Feature

## Tasks
- [ ] 1
- [ ] 2
- [ ] 3

todo-max's People

Contributors

yonghwankim-dev avatar honux77 avatar silvertae avatar

Forkers

silvertae swinb

todo-max's Issues

[FE] 초기 환경 설정

Feature

프로젝트에 추가해야 하는 기능 내용

Tasks

  • CRA typescript
  • eslint
  • prettier
  • styled-components 설치
  • design system 구축

[BE] 예외 처리 매커니즘 구현

Feature

API 응답 실패 시 예외 처리 매커니즘 구현

Tasks

  • 예외를 나타내는 ErrorCode 열거형과 예외 클래스 구현
  • 예외 발생 시 클라이언트에게 반환할 ErrorResponse 작성
  • GlobalExceptionHandler 클래스 구현

[BE] 카드 이동

Feature

사용자의 요청에 따라 카드의 위치를 이동시킨다.

Tasks

  • 1 Request DTO 구현
  • 2 position 정렬 메소드 구현
  • 3 DB UPDATE 로직 구현
  • 4 테스트코드 작성

[BE] 로그 적용

Feature

  • 비즈니스 로직 수행시 로그를 기록합니다.

Tasks

  • logback 설정
  • 각 비즈니스 로직별 로그 기록

[BE] 세션을 이용한 로그인 기능 구현

Feature

세션을 id로 사용해서 사용자를 구분하여 todo-list 서비스를 이용하도록 구현한다.

Tasks

  • 1. card, cololumns 테이블에 session_id 필드 추가
  • 2. 쿼리 변경
  • 3. 세션id 생성 시 더미 데이터 insert

[BE] Epic2-Story3. 히스토리 전체 삭제 API 구현

Feature

사용자가 전체 활동 기록 삭제 버튼을 클릭했을 때 목록에 있는 기록들을 삭제하는 기능 구현

Tasks

  • 삭제할 히스토리의 is_deleted 컬럼 값을 true로 변경
  • 처리 결과를 반환
  • 테스트 코드 작성

[FE] 활동기록 레이어와 모달창 UI 작업

Feature

  • 활동기록 레이어의 UI를 구현
  • 취소 모달창의 UI를 구현

Tasks

  • 활동 기록 레이어 컴포넌트
    • 활동 기록 카드 컴포넌트
  • 삭제 모달창
    • 전체 활동 기록 삭제 모달
    • 카드 삭제 모달

[BE] Redis 환경 설정

Feature

Redis를 설치하고 활동 기록 데이터를 저장하도록 환경 설정

Tasks

  • Redis 설치
  • Redis 환경 설정

[FE] MSW 적용

Feature

  • MSW 이용해서 mock data 적용

Tasks

  • MSW 설치 및 세팅
  • Mock data 구성

[BE] 표준 출력과 표준 에러를 로그 분리하여 저장

Feature

  • 현재 수동 배프 스크립트에서 표준 출력과 표준 에러에 대한 로그 기록을 한 파일에서 저장하고 있습니다. 이를 분리하여 저장하도록 합니다.

Tasks

  • 수동 배포 스크립트 설정 변경

Solution

$ nohup java -Dspring.profiles.active=prod -jar be-0.0.1-SNAPSHOT.jar 1 > ~/log.out 2 > ~/err.out &

목표 기한

  • 4시간

[BE] 수동 배포시 Nginx 설정

Feature

  • 수동 배포시 Nginx를 배포하여 80포트로 들어오는 요청들을 3000포트로 서빙하는 Nginx를 배포해봅니다.
  • 이 이슈는 선택사항입니다.

Tasks

  • Nginx 설치
  • Nginx 설정

목표 시간

  • 1일

Solution

  1. NGINX 설치
$ sudo yum update
$ sudo yum upgrade
$ sudo yum install nginx
  1. NGINX 설치 확인
$ nginx -v

image

  1. nginx 서비스 시작
$ sudo service nginx start
  1. 해당 호스트의 80포트로 접속해봅니다.

image

  • nginx 사이트가 뜨면 성공입니다.
  1. nginx 설정 파일 탐색
$ sudo find / -name nginx.conf
  • /etc/nginx/nginx.conf 위치에 있는 것을 확인할 수 있습니다.
  1. nginx.conf 파일 접속
$ sudo vim /etc/nginx/nginx.conf
  1. server 블록안에 다음 내용을 입력
location / {
	proxy_pass http://{EC2 IPv4}:3000;
}
  • localhost로 하는 경우 JS, CSS 리소스를 재귀적으로 얻지 못할 수 있습니다.
  1. 설정 내용 반영
$ sudo service nginx restart;
  1. EC2 IPv4 주소에 포트 80 또는 없이 접속해봅니다.
$ curl http://ec2-43-201-104-148.ap-northeast-2.compute.amazonaws.com/

image

참고

nginx 실행 로그 확인

$ sudo nginx -t

[BE] 히스토리 AOP 구현

Feature

카드 생성, 수정, 삭제, 이동 후 히스토리 생성하는 로직을 AOP로 구현

Tasks

  • [ ]
  • [ ]
  • [ ]

[FE] 새로운 카드 등록 기능 구현 완성 및 헤더영역 작업

Feature

  • 사용자 활동기록 레이어 토글 기능 및 디폴트 문구 출력 기능
  • 새로운 카드 등록시 화면에 새로운 카드가 렌더링 되는 기능

Tasks

  • Header에 활동기록 레이어의 열고 닫힘을 관리하는 state 추가
  • 사용자 활동 기록이 없을 때 렌더링 되는 ActivityHistory UI 구현
  • 새로운 카드 등록 시 Board 컴포넌트의 state를 변경시키는 핸들러 구현
  • 새로운 카드 등록시 해당 Column 가장 위에 카드가 추가되도록 구현

option) Column의 타이틀 옆 카운트되는 숫자 min, max 정해두기

[BE] CORS 설정

상황

  • 웹 서버에서 WAS 서버로 리소스 요청시 CORS 위반으로 카드를 조회하지 못하고 있습니다.

원인

  • CORS 미설정

Soltuion

package com.kiosk.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST")
            .maxAge(3000);
    }
}

[BE] EC2에서 수동 배포를 위한 수동 배포 스크립트 작성 및 실행

Feature

  • EC2 인스턴스 환경에서 수동 배포를 위한 스크립트를 작성하고 실행하여 Spring, React, Mysql이 작동하는지 확인합니다.
  • Nginx를 이용한 포트포워딩을 수행합니다.

Tasks

  • Spring 수동 배포 스크립트 작성
  • React 수동 배포 스크립트 작성
  • MySQL 설치
  • JDK 설치
  • Node.js, npm 설치

[BE] 컬럼 추가/수정/삭제 기능 구현

Feature

  • 컬럼 도메인 관련 CRUD 기능을 구현합니다.

Tasks

  • 컬럼 추가
  • 컬럼 수정
  • 컬럼 삭제
  • 컬럼 조회
    • 특정 컬럼 아이디에 따른 컬럼 이름들 조회
  • 컬럼 예외처리
    • 컬럼 추가
    • 컬럼 수정
    • 컬럼 삭제
  • 컬럼 테스트 코드 작성
    • 컬럼 추가
    • 컬럼 수정
    • 컬럼 삭제
    • 컬럼 조회

목표 기한

  • 2023-07-17(월) ~ 2023-07-18(화), (2일)

[BE] 카드 조작 시 히스토리 생성

Feature

카드 서비스에서 등록,수정,삭제,이동 실행 시 히스토리 생성하도록 구현

Tasks

  • 1 전달 할 값 DTO 생성
  • 2 카드 서비스에서 히스토리 서비스 호출
  • 3 테스트코드

[BE] RDS 환경 구축

Feature

AWS RDS 서비스를 이용하여 MySQL을 사용할 수 있도록 환경 구축

Tasks

  • RDS MySQL 생성
  • ERD를 참고하여 테이블 생성
  • 디폴트 칼럼 값(3개) 및 디폴트 액션 값(4개) 삽입

[BE] ER 다이어그램 및 SQL 쿼리 변경

Feature

Action table을 삭제하고 그와 관련된 변경 사항을 적용

Tasks

  • ER 다이어그램의 Action table 삭제
  • History table의 action_id 컬럼 삭제
  • History table에 action_name 컬럼 추가
  • 테이블 생성 쿼리 변경
  • 샘플 데이터 쿼리 변경

[BE] 카드 삭제

Feature

해당 카드를 삭제한다.

Tasks

  • 삭제 쿼리 작성
  • 레포지토리, 서비스, 컨트롤러 메서드 구현
  • 테스트 코드 작성

[BE] 카드 조회 리팩토링

Feature

  • 카드 조회시 클라이언트에게 응답하기 위해서 3~4번의 쿼리를 날립니다.
  • 카드 조회시 1번의 쿼리로 응답할 수 있도록 리팩토링합니다.

Tasks

  • 카드 조회 자바 코드 리팩토링

[BE] Epic2-Story2. 히스토리 조회 API 구현

Feature

사용자가 활동 기록 버튼을 클릭했을 때 활동 기록 목록이 보이도록 API 구현

Tasks

  • DB에 저장된 히스토리 목록 불러오기
  • 불러온 히스토리 목록 반환하기
  • 테스트 코드 작성

[BE] 예외 처리 로직 변경

Feature

MethodArgumentNotValidException 발생 시 errors 메세지가 아닌 errorCode 메세지로 반환하도록 로직 변경

Tasks

  • makeErrorResponse 메서드 변경
  • ErrorResponse 클래스 변경
  • ValidationError 삭제

[FE] 카드 등록 기능 구현

Feature

  • 사용자는 칼럼에 새로운 카드를 등록할 수 있다.

Tasks

  • 칼럼 타이틀 옆 + 버튼을 클릭하면 해당 컬럼에 새로운 카드를 등록할 수 있는 박스가 나타난다.
  • + 버튼을 다시 한 번 더 누르거나 카드의 [취소 버튼]을 누르면 박스가 사라진다.
  • 카드에 내용을 입력하면 [등록 버튼]이 활성화된다.
    • 카드의 내용이 공백이면 [등록 버튼]은 비 활성화된다.
    • 카드의 글자 수 제한은 500자 이내이다.
    • 글의 길이에 맞춰 박스의 높이가 변한다.
  • 활성화 된 등록 버튼을 누르면 서버로 Post 요청을 보낸다.

[BE] 프로젝트 초기화

Feature

  • TODO 서비스를 구현하기 위해서 스프링 부트 프로젝트를 초기화합니다.

Tasks

  • Card 엔티티 클래스 구현
  • Column 엔티티 클래스 구현
  • History 엔티티 클래스 구현
  • 각 엔티티 클래스에 해당하는 Controller, Service, Repository 스켈레톤 코드 구현

[BE] Swap File을 이용한 EC2 메모리 부족 현상 문제 해결

상황

  • EC2 t2.micro 사용중 스프링과 MySQL 데이터베이스를 같이 실행하는데 실행되지 않거나 빌드가 되지 않습니다.

원인

  • EC2 t2.micro 기준 메모리가 부족하기 때문입니다.

스왑 파일을 이용한 스왑 공간 할당

ec2 램 메모리가 가득 찼기 때문에 실제 디스크의 용량을 이용하여 부족한 메모리를 대체할 공간을 swap memory(스왑 공간)이라 합니다.

해결방법

  1. EC2 SSH 접속
$ ssh -i {key-pem 파일} {서버 OS}@{퍼블릭 ip 주소}
  1. Swap 파일 메모리를 할당합니다.
# swapfile 메모리를 할당
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
  • 128M * 16 = 2GB, 2GB 크기로 swapfile을 설정합니다.
  • dd 명령어는 파일 복사 및 변환 관련 유닉스 명령 유틸리티입니다.
  • /dev/zero는 데이터 스토리지 초기화 관련 파일입니다.
  1. swapfile에 접근할 수 있는 권한을 설정한다.
# swapfile 권한 세팅 (READ, WRITE)
$ sudo chmod 600 /swapfile
  • 읽기 쓰기 권한을 부여합니다.
  1. mkswap 명령어로 swapfile을 추가할 swap 공간을 생성합니다.
# swap 공간 생성 (Make swap)
$ sudo mkswap /swapfile
  1. swapon 명령어를 통해 swapfile을 swap memory에 추가합니다.
# swap 공간에 swapfile 추가하여 즉시 사용할 수 있도록
$ sudo swapon /swapfile
  1. /etc/fstab에 세팅
# /etc/fstab vi 에디터 열기
sudo vi /etc/fstab

# 파일의 맨 끝 다음줄에 아래 명령어 작성
/swapfile swap swap defaults 0 0
  • etc/fstab는 파일시스템 정보를 저장하는 곳입니다. 파티션 변경 및 디스크 추가 시에는 이 파일에 등록해야 자동으로 마운트가 가능합니다.
  1. free 명령어로 ec2 메모리 상태를 확인합니다.
$ free

[FE] 메인화면 UI

Feature

  • 메인화면 UI 구현

Tasks

  • 헤더 컴포넌트
  • 메인영역 컴포넌트
    • 칼럼 컴포넌트
      • 타이틀, + 버튼, X 버튼은 칼럼에 포함
    • 카드 컴포넌트
      • 보통 모드
      • 수정 모드
      • 추가 모드

[FE] 활동기록 레이어 위치 수정

Feature

  • 활동 기록 레이어가 나타나는 위치를 기획서에 맞는 위치로 변경한다.

Tasks

  • StyledAppposition: relative 속성이 적용되면서 변경된 ActivityHistory의 위치를 조정한다.

[FE] 카드 수정 기능 구현

Feature

  • Board 상태 업데이트와 응답 받은 후 로직 구현.

Tasks

  • 카드 수정에 대한 확인 응답에 의해 Board update.

[BE] 카드 등록

Feature

새로운 카드를 등록한다.

Tasks

  • 요청, 응답 DTO 작성
  • 등록 쿼리 작성
  • 레포지토리 메서드 작성
  • 서비스 메서드 작성
  • 컨트롤러 메서드 작성
  • 테스트 코드 작성

[FE] Drag and Drop 기능 오류 수정 및 리팩터링

Feature

  • 정상적으로 카드가 이동하지 않는 문제 해결해보자

Tasks

  • 빈 칼럼으로 카드를 이동할 수 없는 오류 수정하기
  • 다른 칼럼 맨 밑으로 카드 이동시 이동한 카드가 맨 위에 렌더링 되는 오류 수정하기
  • Board, Card 컴포넌트의 props들 리팩터링

[BE] 카드 수정

Feature

사용자에게 어떤 카드의 제목 혹은 내용의 수정 요청이 들어오면,
요청 받은 데이터를 이용해 카드를 수정하고, 성공 여부를 반환한다.

Tasks

  • 1 요청 데이터 DTO 작성
  • 2 DTO를 토대로 DB접근하는 서비스 메소드 구현
  • 3 DB에서 UPDATE 하는 쿼리 구현
  • 4 성공 시 success, 실패 시 에러 코드와 메세지를 반환하는 로직 구현
  • 5 테스트코드 작성

[FE] 카드 Drag & Drop 구현

Feature

  • 카드 drag and drop

Tasks

  • MouseMove
    • mouseMoveHandler on Board component.
    • Update currMouseCoords based on the mouse position. (clientX, clientY).
    • Update selected ColumnCard position based on currMouseCoords.
    • Render CardShadow upon dragging.
    • Use document.elementFromPoint(currentCoords) to determine the element at the corresponding coordinates.
      • belowCard = elementAtPoint.closest(”li”).
      • Calculate the mid y point of belowCard by using getBoundingClientRect().
        • To determine whether coming from above or below.
      • Render CardShadow above/below based on the calculated mid y point.
  • MouseDown
    • Update dragCard.
    • Initialize cardShadowPosition.
    • Initialize currMouseCoords.
  • MouseUp
    • Determine prevColumnId, nextColumnId, beforeCardId, afterCardId.
    • Send PUT request to server.
    • Update board based on response.
  • 필요한 상태
    • currMouseCoords
      • Keep track of the mouse's current coords.
      • Used to synchronize the card being dragged with the mouse's current coords.
        • Feed dragged card's top, left with the these coords.
      • Used to determine the card that is underneath the currently being dragged card using elementAtPoint.
    • dragCard
      • Contains the reference for the card that is being dragged, and the card details.
      • dragCard.cardRef is used to temporarily remove pointer events on the card being dragged (in order to determine belowCard).
      • dragCard.cardDetails is used for feeding CardShadow.
    • currBelowCardId
      • Used to determine whether this Card is the card that is currently below the dragged card, which is used to conditionally render CardShadow.
    • currCardShadowInsertPosition
      • Used to determine whether CardShadow should be rendered above or below belowCard.
  • 필요한 컴포넌트
    • 선택된 카드 위치를 대체할 CardShadow 컴포넌트 추가

[FE] 활동기록 레이어 애니메이션 기능

Feature

  • 활동 기록 레이어가 나타나고 사라질 때 애니메이션 기능을 추가한다.

Tasks

  • 히스토리 버튼 클릭시 fetch한 데이터를 이용해 메인 영역 바깥에 ActivityHistory를 렌더링한다.
  • 렌더링이 끝난 ActivityHistory 컴포넌트는 헤더의 히스토리 버튼 아래쪽 영역으로 슬라이드하면서 이동한다.
  • 슬라이드 되는 동시에 fade in 효과를 적용한다.
  • 히스토리 버튼이나 닫기 버튼 클릭시 나타나날 때 애니메이션이 반대로 적용되며 화면밖으로 사라진다.

추가 작업) ActivityHistoryItem이 5개 초과일 때 레이어가 더 이상 길어지지 않고 스크롤 생성되도록 변경

[BE] 메인 페이지 접속시 TODO 리스트 조회

Feature

  • 사용자가 메인 페이지에 접속하면 칼럼과 칼럼에 해당하는 카드를 조회하여 응답합니다.

Tasks

  • 카드 조회
  • 컬럼 조회
  • 카드를 위치값을 기준으로 정렬
    • 위치값이 높을 수록 위에 존재합니다.

[FE] 카드 수정 기능 구현

Feature

  • 사용자는 칼럼에 새로운 카드를 수정할 수 있다.

Tasks

  • 카드의 [수정 버튼]을 누르면 등록 박스와 동일한 스타일로 전환되면서 수정이 가능해진다.
  • 카드 수정 상태에서 [취소 버튼]을 누르면 변경 사항이 반영되지 않고 수정 상태가 풀린다.
  • 내용을 모두 삭제하면 [저장 버튼]이 비활성화된다.
  • 내용을 수정한 후 [저장 버튼]을 누르면 변경사항이 반영된 카드로 바뀐다.

[BE] MySQL 테이블 초기화 문제 해결

상황

스프링 부트 실행시 resources/db/mysql/schema.sql 파일에 존재하는 테이블을 초기화하는 설정을 하였습니다. 그러나 action 테이블을 참조할 수 없어서 실행에 실패하였습니다.

schema.sql

SET foreign_key_checks = 0;   #체크 해제
DROP TABLE IF EXISTS history;
DROP TABLE IF EXISTS columns;
DROP TABLE IF EXISTS action;
DROP TABLE IF EXISTS card;
SET foreign_key_checks = 1;   #체크 설정

CREATE TABLE action (
	id	int	NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name	VARCHAR(50)	NOT NULL
);

CREATE TABLE columns (
	id	int	NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name	VARCHAR(50)	NOT NULL
);

CREATE TABLE card (
	id	int	NOT NULL AUTO_INCREMENT PRIMARY KEY,
	title	VARCHAR(50)	NOT NULL,
	content	text	NOT NULL,
	position	bigint	NOT NULL,
	is_deleted	Boolean	NOT NULL	DEFAULT false,
	column_id	int	NOT NULL,
    FOREIGN KEY (column_id) REFERENCES columns (id)
);

CREATE TABLE history (
	id	int	NOT NULL AUTO_INCREMENT PRIMARY KEY,
	card_title	VARCHAR(50)	NOT NULL,
	prev_column	VARCHAR(50)	NULL,
	next_column	VARCHAR(50)	NULL,
	created_at	DATETIME	NOT NULL,
	is_deleted	Boolean	NOT NULL	DEFAULT false,
	action_id	int	NOT NULL,
	card_id	int	NOT NULL,
    FOREIGN KEY (action_id) REFERENCES action (id),
    FOREIGN KEY (card_id) REFERENCES card (id)
);

원인

  • sql 스크립트 파일에서 "#"이 주석인줄 알고 적용되는줄 알았으나 실제로는 적용되지 않아서 foreign_key_checks = 0이 정상적으로 작동하지 않은 것이 원인이었습니다. MySQL 워크벤치에서는 쿼리가 동작한 이유는 MySQL 워크벤치 편집창에서는 "#"이 주석처리가 되었기 때문입니다.

해결방법

  • sql 스크립트 파일에서 "#"으로 달린 주석을 제거합니다.
SET foreign_key_checks = 0;
drop table IF EXISTS history;
drop table IF EXISTS columns;
drop table IF EXISTS action;
drop table IF EXISTS card;
SET foreign_key_checks = 1;

결과

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.