본문 바로가기
클라우드 활용 자바개발자 양성과정/02-2. JDBC

7. JDBC MVC패턴 실습문제 & 최종정리

by moca7 2024. 8. 1.

 

[ 상품관련프로그램_실습문제 ]
[ 상품관련프로그램_실습문제_최종 ]

 

 

 

 

[ 상품관련프로그램_실습문제 ]

 

 

 

 

 

 

==============================================================================

 

[ 상품관련프로그램_실습문제_최종 ]

 

 

 

 

CREATE TABLE PRODUCT_IO (
    IO_NUM      NUMBER(5)       PRIMARY KEY
  , PRODUCT_ID  VARCHAR2(30)    REFERENCES PRODUCT ON DELETE CASCADE
  , IO_DATE     DATE            DEFAULT SYSDATE NOT NULL 
  , AMOUNT      NUMBER(5)       NOT NULL
  , STATUS      CHAR(6)         CHECK(STATUS IN ('입고', '출고'))
);

CREATE SEQUENCE SEQ_AAA
    NOCACHE;



CREATE OR REPLACE TRIGGER TRG_001
AFTER INSERT ON PRODUCT_IO
FOR EACH ROW

BEGIN
    
    IF :NEW.STATUS = '입고'
        THEN
            UPDATE PRODUCT
               SET STOCK = STOCK + :NEW.AMOUNT
             WHERE PRODUCT_ID = :NEW.PRODUCT_ID;
    ELSE         
             
            UPDATE PRODUCT
               SET STOCK = STOCK - :NEW.AMOUNT
             WHERE PRODUCT_ID = :NEW.PRODUCT_ID;
    END IF; -- PL/SQL은 IF 쓰면 END IF도 서줘야 한다.
END;
/


INSERT INTO PRODUCT_IO
     VALUES ( SEQ_AAA.NEXTVAL, 'nb_ss7', '19/07/01', 30, '입고');
INSERT INTO PRODUCT_IO
     VALUES ( SEQ_AAA.NEXTVAL, 'nb_ss7', '19/07/02', 3, '출고');
INSERT INTO PRODUCT_IO
     VALUES ( SEQ_AAA.NEXTVAL, 'pc_ibm', '19/07/02', 10, '입고');

 

 

 

ㅁ List의 제네릭 타입이 달라도 오버로딩은 불가하다.

- 같은 List여도 제네릭 타입이 다르니 오버로딩 될 것 같은데 안 된다.

 

// 조회 성공 - 여러 줄

public void selectSuccessMany(List<Product> list)

    System.out.println("\n조회 성공했습니다.");

    for(Product p : list) {

        System.out.println(p);

    }

}

// (ProductIO) 조회 성공 - 여러 줄

public void selectSuccessMany(List<ProductIO> list) {

    System.out.println("\n조회 성공했습니다.");

    for(ProductIO p : list) {

        System.out.println(p);

    }

}

 

- 아래와 같은 빨간 밑줄이 발생한다.

 

 

 

- 이유는 먼저 Type Erasure의 개념을 알아야 한다.

 

Type erasure can be explained as the process of enforcing type constraints only at compile time and discarding the element type information at runtime.

 

'Type erasure는 컴파일 타임에만 타입 제약을 강제하고 런타임엔 타입 정보 요소를 버리는 과정으로 설명 될 수 있다.'

 

즉, List<>의 제네릭 타입이 무엇이든 컴파일 타임만 존재하고 런타임엔 삭제 되기 때문에 결국 List만 남게 된다.

 

컴파일된 후 런타임에서 서로 같은 타입의 매개변수를 가지는 같은 이름의 메서드가 존재하게 되고,

이 때문에 오류가 발생한다. 

 

 

ㅁ 계속 stmt에 sql문을 전달해서 실행하는데 rset이 비어 있는 문제

- sql devloper에서 COMMIT;을 안 했다!

 

 

ㅁ Oracle 데이터베이스에서 컬럼의 DEFAULT 값이 설정되어 있는 경우, 해당 컬럼에 명시적으로 NULL 값을 삽입할 수 있는지 여부는 몇 가지 조건에 따라 달라집니다.

 

 

  • 컬럼이 NOT NULL로 정의된 경우: DEFAULT 값이 설정되어 있어도 명시적으로 NULL 값을 삽입할 수 없습니다. 이 경우, 명시적으로 값을 제공해야 하며, 제공하지 않으면 DEFAULT 값이 사용됩니다.
  • 컬럼이 NULL을 허용하는 경우: 컬럼이 NULL을 허용하는 경우, DEFAULT 값이 설정되어 있더라도 명시적으로 NULL 값을 삽입할 수 있습니다. 이 경우, 컬럼에 명시적으로 NULL을 삽입하면 DEFAULT 값이 무시되고 NULL 값이 저장됩니다.

 

 

ㅁ 최종정리

 

- odjbc6 프로젝트 라이브러리에 추가

- run 패키지, view 패키지, controller 패키지, (model.)service 패키지, model.dao 패키지, model.vo 패키지,  common 패키지

- 뷰에서 컨트롤러만 전역변수로 생성하고 나머지는 전부 new로 그때 그때 생성한다.

 

 

(1) vo

- 일반변수 3개, list 2개 있는 경우. 생성자도 5개 다 안해도 되고 toString도 5개 다 안해도 됨.

 

- db에 저장된 컬럼명과 자료형에 맞게 선언한다.

String, int, Date 타입. 컬럼명은 좀 더 풀어서 의미를 알 수 있게 선언.

- 기본생성자, 모든생성자, toString, 게터세터.

 

 

(2) run

- view 실행

 

 

(3) view

- 사용자가 보고 프로그램에 데이터를 입력하거나 어떤 기능을 요청하면 controller로 호출

 

- Scanner 변수

- 컨트롤러 변수

- 메인화면

- switch 혹은 else if문(default는 마지막 else) 

 

- 뷰에서 바로 컨트롤러를 호출하는 경우, 뷰에서 내 메소드를 호출하는 경우가 있다.

전자는 사용자로부터 입력받을 것 없이 바로 호출하면 되는 경우.

후자는 사용자로부터 입력받을 것이 있는 경우. (전부 String으로 받음)

 

그런데 후자도 결국 컨트롤러 호출로 이어지는 것은 마찬가지.

그리고 그냥 뷰 내에서 자주 쓰이는 메소드(사용자id 입력 등)를 따로 정의해두기도 한다.

 

- 사용자가 보게될 응답화면 5가지.  (전부 매개값이 있다)

insert&update&delete 실패, 성공, select 실패, select 한 줄, select 여러 줄

 

 

 

(4) controller

-  serivce 호출 & service로부터 받은 값을 성공/실패 판단해서 view 호출,

- 데이터 가공처리 : 사용자로부터 받은 String을 변환, vo객체나 list에 담아서 전달.

 

 

 

 

(5) service

- 6가지 요소.

- 커넥션 생성(4-1, 4-2), 커넥션 반납, dao 호출, controller로 리턴, 커밋과 롤백

 

 

(6) dao

- JDBC 4+7 단계에서 

 

1. 최종 결과값을 담을 변수 null로 생성(int형 변수, vo 객체, list)

2. conn, stmt, rset 객체 null로 생성

3. sql  생성

 

4-3. stmt 생성

4-4, 4-5. sql 실행하고 rset이나 result로 결과 담기

4-6. (insert, update, delete는 x) rset으로부터 한 행이면 vo 객체에, 여러 행이면 list에 담기

4-7. (conn은 x) rset, stmt 반납

 

- 최종 결과값을 담을 변수 여기서 선언. 

 

 

(7) common

- 6가지 요소.

- 커넥션 생성(4-1, 4-2), 커넥션 반납, 커밋, 롤백, stmt반납, rset반납

 

- 커넥션 생성말고는 전부 매개변수가 있다. conn, stmt, rset.

- 6개 전부 xxxx != null && !xxxx.isClosed() 조건. 

- 6개 전부 static 메소드로 선언.

 

 

※ driver.properties, query.xml

- driver는 JDBCTemplate의 getConnection 메소드 내에서 Properties 객체 생성해서 사용.

- query는 클래스 dao에서 전역변수로 Properties 객체 생성, dao의 생성자에서 prop.loadFromXml(new FileInputStream("resources/query.xml"))

 

 

 

 

 

 

 

 

 

 

 

 

'클라우드 활용 자바개발자 양성과정 > 02-2. JDBC' 카테고리의 다른 글

5. Properties  (0) 2024.08.01
4. 모듈화 작업 & static import  (0) 2024.07.31
3. PreparedStatement  (0) 2024.07.30
2. JDBC에 MVC 패턴 적용하기  (0) 2024.07.29
1. JDBC 기본  (0) 2024.07.29