๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[ํ•ต์‹ฌํ”„๋กœ์ ํŠธ] DB๋ฉ˜ํ† ๋ง (2023.06.08) ๋ณธ๋ฌธ

full stack/ํ”„๋กœ์ ํŠธ

[ํ•ต์‹ฌํ”„๋กœ์ ํŠธ] DB๋ฉ˜ํ† ๋ง (2023.06.08)

Shinjio 2023. 6. 8. 10:30

๐Ÿ”Ž๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP, Object-Oriented Programming)

๊ฐ์ฒด๋ž€?

์„ธ์ƒ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ (์œ ๋ฌดํ˜•)

์‚ฌ๋žŒ/๋™๋ฌผ/์‚ฌ๋ฌผ/์žฅ์†Œ/์˜ˆ์•ฝ/์ฃผ๋ฌธ/๋ฐฐ์†ก/๋Š๋‚Œ/๊ฐ์ • ๋“ฑ ์ง€๊ทนํžˆ ๊ฐœ๋…์ ์ธ ์ •์˜

 

(1) ๊ณ ์œ ํ•œ ์†์„ฑ

(2) ํƒ€์ธ๋„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

(3) ์‚ฌ์ „์— ๋“ฑ๋ก๋œ ๋‹จ์–ด 

 

A : "์šฐ๋ฆฌ ์˜ค๋Š˜ ์ ์‹ฌ ๋•Œ ๋ผ๋ฉด ๋จน์„๋ž˜?"

B : "์‘, ๊ทธ๋ž˜ ์ข‹์•„~"

 

๋ผ๋ฉด ---> ๊ฐ์ฒด(O)

์˜ค๋šœ๊ธฐ์ง„๋ผ๋ฉด ----> ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„๋œ ์‹ค์ฒด (์ธ์Šคํ„ด์Šค)

 

๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ์†์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜์ง€?

- Primitive Type (์ดˆ๊ธฐํƒ€์ž…)

์ •์ˆ˜ํ˜• 

 * byte     ... 8bit (1byte) : 2^8=256๊ฐ€์ง€ (-128 ~ -1, 0~127)

 * short    ... 16bit (2byte)

 * int         ...32bit (4byte)

 * long      ...64bit (8byte)

์‹ค์ˆ˜ํ˜•

 * float       ...32bit

 * double    ...64bit

๋ฌธ์žํ˜•

 * char        ...16bit ์œ ๋‹ˆ์ฝ”๋“œ

๋ถˆ๋ฆฐํ˜•

 * boolean   ...1bit(true/false)

 

bit(๋น„ํŠธ, binary digit) : ์ปดํ“จํ„ฐ์—์„œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋‹จ์œ„(0,1)

1bit : 0 ํ˜น์€ 1  >>> 2^0 2๊ฐœ

2bit : 00 01 10 11 >>> 2^2 4๊ฐœ

3bit : 000 001 010 011 100 110 111   >>> 2^3 8๊ฐœ

 

์†์„ฑ + ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จ๋œ ๊ฐ์ฒด๋“ค์€ ์ž๋ฐ”์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ์ง€?

(1) ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค (User-defined class)

(2) ๋‚ด์žฅ ํด๋ž˜์Šค(built-in class) : ArrayList / String / Integer / Double / Random / Date / Calendar etc

 

 

์ถ”์ƒํด๋ž˜์Šค

 

์ธํ„ฐํŽ˜์ด์Šค (Interface) 

๊ฐ์ฒด๋“ค ์‚ฌ์ด์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘์ด๋‚˜ ์ƒํƒœ๋ฅผ ์ •์˜ํ•ด ๋†“์€ ๊ฒƒ

 

  face <--> face
      .talk()
      .fight()

public interface Human {

   public void talk();
   public void fight();

}

public class Boy implements Human {

   @Override // ์žฌ์ •์˜
   public void talk()
   {
      System.out.println("Boy is talking..");
   }

   @Override
   public void fight()
   {
      System.out.println("Boy is fighting..");
   }
}

public void talk()  // ์„ ์–ธ๋ถ€(head)
{                   // ๊ตฌํ˜„๋ถ€(body)
   ...
}

public interface ITV {

   public void on();
   public void off();
   public void switchChannel(int channel);

}

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ > ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ

Boy๋Š” Human์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๊ตฌํ˜„ 

 

 

Reference Type์ด๋ž€?

java ๋Š” ์ธ๊ฐ„์ด ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์–ธ์–ด๋กœ ๊ตฌ์„ฑ

class ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๊ฐ€์ƒ๋จธ์‹ ์ด ์ดํ•ด๊ฐ€๋Šฅํ•จ

class ํŒŒ์ผ์„ JVM์— ์‹คํ–‰ >> Java Runtime Data Area 

 

์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” stack ์˜์—ญ์— ์ €์žฅ

์ธ์Šคํ„ด์Šค๋Š” ํž™์˜์—ญ์— ์ €์žฅ. ์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค. 

 

 

s1์€ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ ๋ณ€์ˆ˜ > ํž™ ์˜์—ญ์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ 

 

Student s1 = new Student("Tomson", 28);
Student s2 = new Student("Jack",   25);
Student s3 = new Student("Bill",   24);
Student s4 = new Student("John",   26);
Student s5 = new Student("Steve",  28);

ArrayList<Student> list = new ArrayList<Student>();

list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
list.add(s5);

list = {s1, s2, s3, s4, s5}

for (int i = 0; i < list.size(); i++) {
   Student s = list.get(i);
   System.out.println(s.getName());
}

for (Student s : list)
{
   System.out.println(s.getName());
}

 

ArrayList ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ 3๊ฐ€์ง€

1. ํƒ€์ž…<T>์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, Object๊ฐ€ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ์„ธํŒ…๋จ

 

2. ArrayList<String> list = new ArrayList<>(); >>>> ์ด๊ฒŒ ์ธ์ •์ด ๋˜๋ƒ? ๋œ๋‹ค! >>> ํƒ€์ž…์ถ”๋ก 

 

3. ArrayList<int> list = new ArrayList<int>(); >>> ์‚ฌ์šฉ๋ถˆ๊ฐ€

    int ๊ฐ™์€ Primitive Type ์€ ํƒ€์ž…์œผ๋กœ ํƒ€์šฉํ•  ์ˆ˜๊ฐ€ ์—†์Œ

    ์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” Integer Reference Type์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

   ArrayList<Integer> list = new ArrayList<Integer>();

      list.add(new Integer(10));// boxing

      list.add(10); //autoboxing

 

 

 

๊ทผ๋ฐ ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์•„์ง€๋ฉด ์–ด๋–กํ• ๋ž˜? 

ArrayList๋กœ๋Š” ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์›Œ์กŒ์„ ๋•Œ

>> ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ

 

 

CREATE TABLE T_MEMBER(
   MB_ID VARCHAR2(20) NOT NULL, 
   MB_PW VARCHAR2(20) NOT NULL, 
   MB_NAME VARCHAR2(40) NOT NULL,
   MB_EMAIL VARCHAR(50) NOT NULL,
   CONSTRAINT PK_MEMBER PRIMARY KEY(MB_ID)
);

CREATE TABLE T2(
   ...
   ...
);

 

 

(1) http://www.erwin.com (์ „์„ธ๊ณ„ 1์œ„) <---๋„ค์นด๋ผ์ฟ ๋ฐฐ๋‹นํ† ์ง์•ผ

(2) www.erdcloud.com  

(3) www.equerytool.com  

 

 


 

๋ฉ˜ํ† ๋ง ๋‚ด์šฉ

ํšŒ์›ํ…Œ์ด๋ธ”

> ํšŒ์›์œ ํ˜•(user_role) : ์ผ๋ฐ˜ํšŒ์›('U', User), ๊ด€๋ฆฌ์žํšŒ์›('A', Administrator)

> AI(auto_increment)


> ํšŒ์›(tbl_user)...................์˜์–‘๋ณด์ถฉ์ œ(tbl_supplement)
     
       1              :            0, 1, N   (N, Numermous ์—ฌ๋Ÿฌ๊ฐœ์˜ )

> ERD
  ER-Diagram
  Entity Relationship Diagram    


VO(Value Object)=DTO(Data Transfer Object)=Java Model=Java Bean=POJO(Plain Old Java Object)

MemberDTO.java
UserVO.java

public class UserDTO {

    // ํšŒ์› ์•„์ด๋””
    private String user_id;

    // ํšŒ์› ๋น„๋ฐ€๋ฒˆํ˜ธ
    private String user_pw;

    // ํšŒ์› ์„ฑ๋ณ„
    private String user_gender;

    // ํšŒ์› ์ƒ๋…„์›”์ผ
    private Date user_birthdate;

    // ํšŒ์› ๊ฐ€์ž…์ผ์ž
    private Date user_joindate;

    // ํšŒ์› ์œ ํ˜•
    private String user_role;

    public String getUserId() {
        return user_id;
    }

    public void setUserId(String userId) {
        this.user_id = user_id;
    }

    public String getUserPw() {
        return user_pw;
    }

    public void setUserPw(String userPw) {
        this.user_pw = user_pw;
    }

    public String getUserGender() {
        return user_gender;
    }

    public void setUserGender(String userGender) {
        this.user_gender = user_gender;
    }

    public Date getUserBirthdate() {
        return user_birthdate;
    }

    public void setUserBirthdate(Date userBirthdate) {
        this.user_birthdate = user_birthdate;
    }

    public Date getUserJoindate() {
        return user_joindate;
    }

    public void setUserJoindate(Date userJoindate) {
        this.user_joindate = user_joindate;
    }

    public String getUserRole() {
        return user_role;
    }

    public void setUserRole(String userRole) {
        this.user_role = user_role;
    }

    // tbl_user ๋ชจ๋ธ ๋ณต์‚ฌ
    public void CopyData(tbl_user param)
    {
        this.user_id = param.getUserId();
        this.user_pw = param.getUserPw();
        this.user_gender = param.getUserGender();
        this.user_birthdate = param.getUserBirthdate();
        this.user_joindate = param.getUserJoindate();
        this.user_role = param.getUserRole();
    }
}
------------------------------------------------------------------
 
 
------------------------------------------------------------------
์˜ค๋ผํด ์‹œํ€€์Šค์™€ ํŠธ๋ฆฌ๊ฑฐ์˜ ์ดํ•ด

CREATE TABLE tbl_wishlist
(
    wish_seq          NUMBER(15, 0)    NOT NULL,
    user_id           VARCHAR2(30)     NOT NULL,
    supplement_seq    NUMBER(15, 0)    NOT NULL,
    wish_date         DATE             NOT NULL,
     PRIMARY KEY (wish_seq)
);

--์‹œํ€€์Šค๋ž€? ์•ž๋’ค ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ
--์ „๋ ฅ ์‚ฌ์šฉ๋Ÿ‰/์ „๋ ฅ ํŒ๋งค๋Ÿ‰/์•„ํŒŒํŠธ ์‹œ์„ธ/์ฃผ๊ฐ€์˜ ๋ณ€ํ™”/์•…๋ณด/๊ธ€๋ฒˆํ˜ธ
--x์ถ•์˜ ์ฃผ๋กœ ์‹œ๊ฐ„ ์˜์—ญ(Time Domain)

CREATE SEQUENCE tbl_wishlist_SEQ
START WITH 1
INCREMENT BY 1;

(ํ˜„์žฌ๊ฐ’) 0 : tbl_wishlist_SEQ.CURRVAL
(๋‹ค์Œ๊ฐ’) 1 : tbl_wishlist_SEQ.NEXTVAL


CREATE OR REPLACE TRIGGER tbl_wishlist_AI_TRG
BEFORE INSERT ON tbl_wishlist --์˜ค๋ผํด ํŠธ๋ฆฌ๊ฑฐ๋Š” DML(INSERT/UPDATE/DELETE)์—๋งŒ ์“ธ ์ˆ˜ ์žˆ์Œ. * SELECT๋ฌธ์— ํŠธ๋ฆฌ๊ฑฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ!!
REFERENCING NEW AS N3 FOR EACH ROW
BEGIN
    SELECT tbl_wishlist_SEQ.NEXTVAL
    INTO :N3.wish_seq
    FROM DUAL;
END;

SELECT 3 + 2 FROM DUAL;
SELECT SYSDATE FROM DUAL;


INSERT INTO tbl_wishlist (wish_seq, user_id, supplement_seq, wish_date)
VALUES (1, 'user_id 001', 1, sysdate);

NEW.wish_seq = 1
NEW.user_id = 'user_id 001'

--------------------------------------------------------
์š•์„ค ์‚ญ์ œ๊ธ€ ์ž๋™ ๋ฐฑ์—… ํŠธ๋ฆฌ๊ฑฐ

CREATE OR REPLACE TRIGGER TRG_BOARD_DELETE
BEFORE DELETE ON TBL_BOARD
REFERENCING NEW AS NEW FOR EACH ROW
BEGIN
    INSERT INTO tbl_board_delete (b_seq, b_title, b_content, b_dt, user_id, b_views, delete_dt)
    VALUES (:OLD.b_seq, :OLD.b_title, :OLD.b_content, :OLD.b_dt, :OLD.user_id, :OLD.b_views, SYSDATE);
END;

DELETE FROM TBL_BOARD WHERE B_SEQ=3;


> ํ•จ๊ป˜ ๋จน์œผ๋ฉด ์•ˆ๋˜๋Š” ์˜์–‘์ œ?


--------------------------------------------------------

 

Trigger ๊ธฐ์–ตํ•˜๊ธฐ

trigger๋Š” ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ด€๋œ ์ •๋ณด๋กœ ํ…Œ์ด๋ธ” ์‚ญ์ œ์‹œ ์‚ญ์ œ๋˜์ง€๋งŒ, 

์‹œํ€€์Šค๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

ERD

www.equerytool.com  ํ™œ์šฉ!

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ sql ๋ฐ ํ…Œ์ด๋ธ” ๋ช…์„ธ์„œ ๋งŒ๋“ค์–ด์คŒ!