organize/프로젝트

justBoard2 DB구축

001cloudid 2024. 9. 20. 11:58
728x90

2024.09.20

 

이 전 글에서 정리한 해야할 일

1. DB 구축

2. 게시판

3. 내 정보

4. 프로그램 설치(Maven), JDBC, xml 설정

에서

 

DB구축

먼저 DB구축을 먼저해야겠다고 생각함. 대략적인 테이블과 컬럼을 만들어 놓고 필요하면 추가하는 식으로 하면 되니까.. 테이블을 수정하는 일은 어렵지 않은데, 처음부터 DB만큼은 완벽하게 해놓고 시작하고 싶은 마음에 항상 나중으로 미뤄놓는 습관이 생김. 이유는 전에 프로젝트하면서 날짜 데이터가 제대로 안들어가서 varchar로 바꿨다가 datetime으로 바꿨다가 최종적으로 varchar 타입으로 여러 번 바꾼 적이 있었기 때문..

 

먼저 Oracle과 MySQL을 사용할 줄 알지만, Oracle의 경우 user로 들어가서 하는 게 조금 번거롭기도 하고, 두 번의 프로젝트에서 MySQL을 연동해서 하다보니 그게 편함. 그냥 편한거 사용하자는 생각으로 DBMS는 MySQL로 선정

 

MySQL Workbench 켜고 먼저 기존에 있던 스키마 말고 처음부터 다시 하자는 생각으로..

스키마 생성과 사용

일단은 두 개의 테이블이 존재해야함. 회원 테이블, 게시판 테이블

회원 테이블

컬럼명 타입 크기 Key
id  varchar 20 PK
pw varchar 20 NN
name varchar 20 NN
time varchar? datetime?   default 현재시간, NN

여기서 time은 가입한 시간

 

게시판 테이블

컬럼명 타입 크기 Key
subject varchar 50 NN
content varchar 500  
id varchar 50 FK(회원 테이블 id 참조)
writetime datetime   default 현재시간

 

만들려고 했더니 에러가 생김

뭐가 문제인가 했더니 크기에는 () 안에 넣어줘야함. 

 

게시판 테이블을 먼저 만드려고 하니 문제가 있음.

1. id는 회원테이블의 컬럼을 참조하는 외래키인데 회원 테이블을 먼저 만들지 않아서 오류가 날 것임. 또한 FK의 경우 테이블 레벨 문법을 사용해야함.

2. 게시판 테이블에는 PK가 없다. 분명 교육받을 때 PK를 써주는 것이 좋다 라고 배운 것 같기도하고 아닌 것 같기도하고 곰곰히 생각해보니 PK를 넣어주는 게 좋아보인다. 인덱스나 join을 사용할 때 등 여러 가지 경우에 유리하기 때문에 그와 관련된 것을 검색해보니

출처 : https://jongsky.tistory.com/20

이걸 보니 DBMS를 사용하는 이유는 정보를 저장의 목적도 있지만, 정보를 잘 저장하기 위해서도 있다.

 

회원 테이블은 그대로 가면 될 것 같고, 게시판 테이블을 조금 수정해야할 것 같다.

게시판 테이블

컬럼명 타입 크기 Key
no int   PK
subject varchar 50 NN
content varchar 500  
id varchar 50 FK(회원 테이블 id 참조)
writetime datetime   default 현재시간

no라는 글 번호 컬럼을 추가해주기로 했다.

 

먼저 회원 테이블

member를 그대로 사용하기엔 예약어가 있는 것 같아서 생성이 안됨. '`'를 사용해서 강제적?으로 만들었음

time 컬럼도 마찬가지

물론 테이블 조회할 때 member를 사용하면 나타나지 않음. '`'를 감싸줘야함

time 컬럼에 기본값을 현재 시간으로 해두는 것이 편할 것 같다는 생각이 들었음

수정 ㄱㄱ

수정하는건 매번 헷갈린다...

그래서 뒤에 진도 나가기 전에 외워질때까지 정리해보자

테이블 수정(alter table)

  • 컬럼 추가 : alter table 테이블명 add 컬럼명 타입[(크기)]
  • default 값 수정 : alter table 테이블명 add 컬럼명 타입[(크기)] default '값'
  • 컬럼 가장 앞 추가 : alter table 테이블명 add 컬럼명 타입[(크기)] frist
  • 특정 컬럼 뒤에 컬럼 추가 : alter table 테이블명 add 컬럼명 타입[(크기)] after 앞에 올 컬럼

컬럼수정

  • 데이터 타입 : alter table 테이블명 modify 컬럼명 변경할데이터타입
  •  컬럼 사이즈 : alter table 테이블명 modify 컬럼명 타입(변경할컬럼사이즈)  
  • default값 변경 : alter table 테이블명 modify 컬럼명 타입[(크기)] default 변경값
    단, 기존 default 값이 변경되는 것이 아니라 이후에 입력되는 default값이 변경됨
  • 컬럼명 변경 : alter table 테이블명 rename column 기존컬럼명 to 바꿀컬럼명
  • 컬럼 삭제 : alter table 테이블명 drop 삭제할컬럼명
    단, FK 제약조건이 참조하는 부모 컬럼인 경우 제약조건을 먼저 삭제해야함

이제 게시판 테이블을 생성

Error Code: 1215. Cannot add foreign key constraint 0.016 sec

 

결과 에러남

 

왜 에러가 났는지 검색해보았다.

Error Code 1215는 외부키를 생성하는 중 오류가 발생되는 거라는데 이를 해결하기 위해서는 오타, 문법오류, 외부키로 지정하는 컬럼이 기본키인지 여부

→ 오타? 어찌보면 가장 하기 쉬우면서도 가장 찾기 힘든게 아닐까 싶다. 내가 봤을 때는 오타가 없다

→ 문법오류? 만약 문법 오류가 난다면 테이블 레벨 문법과 컬럼 레벨 문법일텐데 외래키는 테이블 레벨 문법이라 이게 맞는데

→ member의 id가 PK이니 외부키로 지정하는 컬럼이 기본키 맞는데?

 

테이블이 다르면 컬럼 이름이 중복되어도 괜찮은걸로 아는데

 

create table board( `no` int primary key, `subject` varchar(50) not null, content varchar(1000), id varchar(20) not null unique, writetime datetime not null default current_timestamp, foreign key(id) references`member`(id))

 

교재를 찾아봄

create table 테이블명(컬럼명1 타입[(크기)] [제약조건][,...]);

제약조건

  • not null : null을 허용하지 않음
  • unique : 중복값을 허용하지 않음 단, null값은 중복 허용
  • primary key : 테이블의 행을 고유하게 식별해 줄 수 있는 대표컬럼, not null+unique
  • foreign key
    두 테이블 사이의 관계를 선언함으로써 데이터의 무결성을 보장해주는 외래키 제약조건,
    자기 자신 테이블이나 다른 테이블의 특정 컬럼을 참조하는 제약조건,
    pk또는 unique 제약조건이 선언된 컬럼만 참조 가능
    FK가 선언된 컬럼을 자식컬럼이라고 함 ↔ FK가 참조하는 컬럼 부모컬럼
    자식 컬럼에는 부모 컬럼에 있는 데이터 중 하나만 삽입, 수정될 수 있음
    테이블 레벨 문법 사용
  • check : 해당 컬럼이 만족해야하는 조건을 지정

이거 저거 다 찾아봤는데 → 문제는 오타였다... (생략)references`member`(id));라고 작성되어있는데 띄어쓰기 실수...

오타가 진짜 가장 어려운 것 같다.

추가적으로 테이블에 필요한 컬럼이 있거나 수정해야 할 경우 수시로 수정

 

한 두 달전에는 이거 만드는데 10분도 안 걸렸겠지만..

테이블 수정도 까먹어서 truncate 했다가 delete했다가 별의 별 쇼를 다함.

문뜩 truncate, delete가 나왔으니 다시 한 번 정리하고 가야겠다

면접에서도 빈출이라는데 truncate, delete, drop의 차이

일단 DML, DDL이라 Auto-commit 유무 테이블의 데이터 삭제, 테이블 삭제 이렇게 되는 걸로 기억한다.

나머지는 기억이 잘 안 나는데 사실 기억 안난다. 정리하자

delete drop truncate
DML로 commit, rollback할 수 있음 DDL로 auto-commit을 내포하고 있어 한 번 실행하면 되돌릴 수 없음
테이블의 특정 행 삭제
where 절 생략 시 모든 행 삭제
테이블을 삭제 테이블의 모든 행 삭제
delete from 테이블명
[where 조건]
drop table 테이블명 truncate table 테이블명
롤백 가능 롤백 불가

 

delete
truncate
drop

 

내일은 프로그램 설치(Maven), JDBC, xml 설정을 하도록해야겠다.

내가 생각했을 때 진짜 프로젝트를 시작할 때 가장 까다로운 작업이라고 생각든다.

728x90