요구분석→설계→구현→테스트→유지보수
대부분의 개발자들이 들어가는 파트는 구현부터이다. 신입은 요구분석 파트에 들어가는 일이 적은데, 처음부터 잘못 짜여짐을 방지하기 위함이다. 그렇기에 신입이 요구분석부터 참여했다면 좋은 경험이 된다고들 한다.
요구분석할 때는 어떤 고객에게 제공할지도 중요하다. 이에 관해서는 3종류로 나뉜다.
B2B(business-to-business)
- 기업 간 소프트웨어, 서비스, 또는 솔루션을 교환하거나 협력하는 관계
B2C(business-to-consumer)
- 기업이 개별 소비자에게 직접 제품이나 서비스를 판매하거나 제공하는 관계
B2G(business-to-government)
- 기업이 정부에 제품이나 서비스를 제공하거나 정부의 입찰 과정을 통해 계약을 맺는 관계
--<요구사항 명세서>
--1. 은행은 예금서비스를 고객에게 제공
--2. 은행은 여러지점으로 구성되고 각 지점은 특정 도시에 위치해있음
--3. 각 지점은 고유의 지점명이 부여되며, 추가로 도시, 자산, 영문 지점명,
-- 지점개설일, 전화번호의 정보를 가짐
--4. 고객은 고유의 고객 번호를 가지며, 이름, 주소, 생년월일 정보를 가짐
--5. 예금계좌는 예금번호로 유일하게 식별되고, 잔고, 입/출금 내역이 관리됨
--6. 한 명의 고객은 여러개의 예금계좌에 입금할 수 있고, 하나의 예금 계좌에는
-- 여러 명의 고객이 예금할 수 있음
--7. 지점은 여러 개의 예금 계좌를 관리
아래의 이미지들이 AQueryTool을 이용하여 만든 ERD이다. 이것을 엑셀로도 내보내기가 가능한데, 그렇게 만든 표는 데이터베이스 설계서라고도 한다.
| 관계 | 설명 |
|---|---|
| 식별 관계 (Identifying Relationship) | 자식 엔티티의 기본 키가 부모 엔티티의 기본 키와 동일 자식 엔티티의 존재가 부모 엔티티에 의존 강한 종속성을 지님 |
비식별 관계 (Non-Identifying Relationship) | 자식 엔티티의 기본 키가 부모 엔티티의 기본 키와 다름 자식 엔티티는 부모 엔티티에 의존하지만, 부모 엔티티의 기본 키가 자식 엔티티의 일부로 사용되지 않음 자식 엔티티의 기본 키는 부모 엔티티의 기본 키를 포함하지 않음 약한 종속성을 지님 |


-- 테이블 순서는 관계를 고려하여 한 번에 실행해도 에러가 발생하지 않게 정렬되었습니다.
-- jijum_t Table Create SQL
-- 테이블 생성 SQL - jijum_t
CREATE TABLE jijum_t
(
jname VARCHAR2(20) NOT NULL,
jcity VARCHAR2(20) NOT NULL,
jmoney NUMBER NOT NULL,
jEname VARCHAR2(20) NOT NULL,
jopen VARCHAR2(20) NOT NULL,
jtel VARCHAR2(20) NOT NULL,
PRIMARY KEY (jname)
);
-- 테이블 Comment 설정 SQL - jijum_t
COMMENT ON TABLE jijum_t IS '지점';
-- 컬럼 Comment 설정 SQL - jijum_t.jname
COMMENT ON COLUMN jijum_t.jname IS '지점명';
-- 컬럼 Comment 설정 SQL - jijum_t.jcity
COMMENT ON COLUMN jijum_t.jcity IS '도시';
-- 컬럼 Comment 설정 SQL - jijum_t.jmoney
COMMENT ON COLUMN jijum_t.jmoney IS '자산';
-- 컬럼 Comment 설정 SQL - jijum_t.jEname
COMMENT ON COLUMN jijum_t.jEname IS '영문지점명';
-- 컬럼 Comment 설정 SQL - jijum_t.jopen
COMMENT ON COLUMN jijum_t.jopen IS '지점개설일';
-- 컬럼 Comment 설정 SQL - jijum_t.jtel
COMMENT ON COLUMN jijum_t.jtel IS '전화번호';
-- customer_t Table Create SQL
-- 테이블 생성 SQL - customer_t
CREATE TABLE customer_t
(
cno VARCHAR2(10) NOT NULL,
cname VARCHAR2(20) NOT NULL,
caddr VARCHAR2(50) NOT NULL,
cbirth VARCHAR2(30) NOT NULL,
PRIMARY KEY (cno)
);
-- 테이블 Comment 설정 SQL - customer_t
COMMENT ON TABLE customer_t IS '고객';
-- 컬럼 Comment 설정 SQL - customer_t.cno
COMMENT ON COLUMN customer_t.cno IS '고객번호';
-- 컬럼 Comment 설정 SQL - customer_t.cname
COMMENT ON COLUMN customer_t.cname IS '이름';
-- 컬럼 Comment 설정 SQL - customer_t.caddr
COMMENT ON COLUMN customer_t.caddr IS '주소';
-- 컬럼 Comment 설정 SQL - customer_t.cbirth
COMMENT ON COLUMN customer_t.cbirth IS '생년월일';
-- account_t Table Create SQL
-- 테이블 생성 SQL - account_t
CREATE TABLE account_t
(
ano VARCHAR2(10) NOT NULL,
ajango NUMBER NOT NULL,
adwd NUMBER NOT NULL,
jname VARCHAR2(20) NOT NULL
);
-- 테이블 Comment 설정 SQL - account_t
COMMENT ON TABLE account_t IS '예금계좌';
-- 컬럼 Comment 설정 SQL - account_t.ano
COMMENT ON COLUMN account_t.ano IS '계좌번호';
-- 컬럼 Comment 설정 SQL - account_t.ajango
COMMENT ON COLUMN account_t.ajango IS '잔고';
-- 컬럼 Comment 설정 SQL - account_t.adwd
COMMENT ON COLUMN account_t.adwd IS '입출금';
-- 컬럼 Comment 설정 SQL - account_t.jname
COMMENT ON COLUMN account_t.jname IS '지점명';
-- Foreign Key 설정 SQL - account_t(jname) -> jijum_t(jname)
ALTER TABLE account_t
ADD CONSTRAINT FK_account_t_jname_jijum_t_jname FOREIGN KEY (jname)
REFERENCES jijum_t (jname) ;
-- Foreign Key 삭제 SQL - account_t(jname)
-- ALTER TABLE account_t
-- DROP CONSTRAINT FK_account_t_jname_jijum_t_jname;
-- yegeom_t Table Create SQL
-- 테이블 생성 SQL - yegeom_t
CREATE TABLE yegeom_t
(
ano VARCHAR2(10) NOT NULL,
cno VARCHAR2(10) NOT NULL,
ano VARCHAR2(10) NOT NULL,
PRIMARY KEY (ano)
);
-- 테이블 Comment 설정 SQL - yegeom_t
COMMENT ON TABLE yegeom_t IS '예금';
-- 컬럼 Comment 설정 SQL - yegeom_t.ano
COMMENT ON COLUMN yegeom_t.ano IS '예금번호';
-- 컬럼 Comment 설정 SQL - yegeom_t.cno
COMMENT ON COLUMN yegeom_t.cno IS '고객번호';
-- 컬럼 Comment 설정 SQL - yegeom_t.ano
COMMENT ON COLUMN yegeom_t.ano IS '계좌번호';
-- Foreign Key 설정 SQL - yegeom_t(cno) -> customer_t(cno)
ALTER TABLE yegeom_t
ADD CONSTRAINT FK_yegeom_t_cno_customer_t_cno FOREIGN KEY (cno)
REFERENCES customer_t (cno) ;
-- Foreign Key 삭제 SQL - yegeom_t(cno)
-- ALTER TABLE yegeom_t
-- DROP CONSTRAINT FK_yegeom_t_cno_customer_t_cno;
-- Foreign Key 설정 SQL - yegeom_t(ano) -> account_t(ano)
ALTER TABLE yegeom_t
ADD CONSTRAINT FK_yegeom_t_ano_account_t_ano FOREIGN KEY (ano)
REFERENCES account_t (ano) ;
-- Foreign Key 삭제 SQL - yegeom_t(ano)
-- ALTER TABLE yegeom_t
-- DROP CONSTRAINT FK_yegeom_t_ano_account_t_ano;
--1. 학생은 고유의 학번이 부여되며, 주민등록번호, 이름, 주소, 전화번호, 학년 정보를 가짐
--2. 교수는 고유의 교수번호가 부여되며, 주민등록번호, 이름, 주소, 전화번호, 직위, 임용년도 정보를 가짐
--3. 학생과 교수는 하나의 학과에만 소속될 수 있으나, 하나의 학과에는 여러명의 학생과 교수가 소속됨
--4. 학과는 고유의 학과번호가 부여되며, 학과명, 사무실, 전화번호 정보를 가짐
--5. 강좌는 고유의 강좌번호가 부여되며 강좌명, 학점수, 연도, 학기, 강의식, 수강인원 정보를 가진
--6. 하나의 강좌는 한 명의 교수가 강의하고, 한 교수는 여러 강좌를 강의함
--7. 한 학생은 하나 이상의 강좌를 수강할 수 있음
--8. 각각의 학생이 수강한 과목에 대해서 성적이 부여됨
해당 요구사항 명세서를 가지고 DB 설계를 진행해보자.
1. 개체 찾기
| 개체(Entity) | 속성(Attribute) |
|---|---|
| 학생(Student) | 학번 (StudentID, Primary Key) 주민등록번호 (SSN) 이름 (Name) 주소 (Address) 전화번호 (Tel) 학년 (Grade) |
| 교수 (Professor) | 교수번호 (ProfessorID, Primary Key) 주민등록번호 (SSN) 이름 (Name) 주소 (Address) 전화번호 (Tel) 직위 (Position) 임용년도 (HireYear) |
| 학과 (Department) | 학과번호 (DepartmentID, Primary Key) 학과명 (DepartmentName) 사무실 (Office) 전화번호 (Tel) |
| 수강강좌 (Class) | 강좌번호 (ClassID, Primary Key) 강좌명(ClassName) 학점수 (ClassCredit) 연도(ClassYear) 학기(Semester) 강의실(ClassRoom) 수강인원(StudentsNumber) |
2. 개체 간의 관계 파악
3. 물리적 테이블 생성
