본문 바로가기
DB (DataBase) (국비)/DB 메모

수업 메모

by Hwanii_ 2023. 6. 10.
728x90

[ 23.06.09 ]

 

1. 크롤링은 샘플 데이터를 만드는것이기 때문에 Model이 한다.

그런데,  종종 현업에서 대규모 프로젝트의 경우 Model이 작업해야할

데이터베이스의 양이 너무 많아서 Controller가 크롤링을 대신 하는 경우도 있다.

이것은 회사 문화 차이 이다.

 

2. 함수 (메서드)  실행이 오로지 목적인 클래스 이라면, 멤버변수가 필요 없다.

이 개념은, 객체화를 해서 객체를 만들어 내는데 전혀 관심이 없는 상황이라 그렇다.

(객체로 무언가를 하는 상황이 아니다)

따라서 이런 경우, 함수 앞에 static 키워드를 붙혀서 객체와 무관한 함수로 선언한다.

== 클래스 메서드 (static 메서드)

이외에도, 수많은 클래스 메서드들이 존재하는데, 객체와 무관한 함수들을

판단하는 힘을 가지면 좋을듯 하다.

 

3. 크롤링시 외부에서 조건에 맞는 데이터를 가져와서 담을 공간이 필요하다.

이 공간을 향상된 배열, 즉, 배열리스트에 담을 수 있다.

(샘플 데이터는 영화 (객체) 이다)

이렇게 샘플 데이터를 담은 배열리스트 데이터를 Controller 에게 보내 줘야 한다.

이 함수는 크롤링 기능 로직이 구현되어 있다. output은 배열리스트 이다.

>> ArrayList<MovieVO>

 

4. 처음 변수를 선언 및 초기화를 했을 때, 이후 해당 변수의 값이 변경되지 않아야

하는 경우에는 맨앞에 final 키워드를 붙혀 상수화를 시켜준다.

 

5. 크롤링시 사용되는 Elements 클래스가 있다.

Elements가 1개면, 선택한 어떤 값을 1개만 가져오는 것이고,

2개이면, 선택한 어떤 값을 2개 가져오는 것이다.

>> Elements elements1 = document.select("strong.title");

>> Elements elements2 = document.select("span.txt-info");

 

6. 크롤링 해서 가져온 객체 (영화)가 가지고 있는 인자로 무조건 PK가 있어야 한다.

객체를 식별할 수 있는 식별자가 필요하기 때문이다.

따라서 MovieVO 클래스에 멤버로 PK를 선언 및 초기화를 하는 것을 기억 하기.

 

7. 크롤링 해서 가져온 MovieVO (객체)를 DB에 저장 한다.

저장하기전에 DBMS에서 이 객체들을 저장할 테이블을 CREATE 해줘야 한다.

테이블을 생성할 때, MovieVO 멤버변수 ( == 칼럼명) 들의 제약조건을 생각 해야 한다.

>> PK는 특별한 경우가 아니라면, 시스템이 직접 부여를 해야 하므로, 아래와 같이 표기.

NUM INT PK AUTO_INCREMENT

 

>> NAME은 String 타입이고, 해당 열의 행이 비어있으면 안되는 조건을 걸어준다.

NAME VARCHAR(크기) NOT NULL

 

>> ODATE는 String 타입이고, 해당 열의 행이 비어있으면 안되는 조건을 걸어준다.

ODATE VARCHAR(크기) NOT NULL

 

이때 날짜 타입이 따로 존재해서 VARCHAR 대신에 DATE, DATETIME 등이 있다. 

 

정리 >>

CREATE TABLE MOVIE(

NUM INT PK AUTO_INCREMENT,

NAME VARCHAR(크기) NOT NULL,

ODATE VARCHAR(크기) NOT NULL

);

 

과 같이 코드를 작성하여 테이블을 CREATE 해준다.

 

테이블 명으로 MOVIEVO로 할 수 있지 않을까 라는 의문에는,

Value Object (VO)는 자바에서 사용하는 단어라 DBMS 에서 사용하기에는 어색하다.

 

8. Model의 MovieDAO 클래스 에서는 CRUD인 비즈니스 메서드를 구현한다.

1) selectAll()

2) selectOne()

3) insert()

4) update()

5) delete()

 

9. ★

기존에 Model의 DAO 클래스에서 객체 데이터들을 담을 공간으로 자바의

ArrayList<MovieVO> 와 같이, 배열리스트를 DB로 대체해서 사용 했었다.

 

하지만, 이제부터 데이터들을 담을 공간으로 DB를 사용하기에,

Model의 DAO 클래스에 멤버로 ArrayList<MovieVO> 와 같은 것을 사용하지 않는다.

 

따라서, DAO 클래스에는 비즈니스 메서드만 존재하고, 별도의 멤버변수 또는 생성자가

존재하지 않게 된다.

 

10.

insert(MovieVO mVO) 메서드 생각하기.

Controller 에게 MovieVO 타입의 mVO를 인자로 받아서,

이 객체 (영화) 를 DB로 넣는 로직을 구현한다.

이때, 필요한 객체의 인자 (== 행) 의 값들은 Controller을 통해서 온것이다.

 

 

순서를 정리하면 아래와 같다.

 

1) 크롤링 해온 객체들 (영화 데이터들) 을 자바의 배열리스트에 저장.

 

2) 배열리스트에 담긴 객체들을 Controller 에게 전달.

 

3) 영화 데이터들을 받은 Controller는 Model DAO의 insert() 메서드의 인자가

MovieVO mVO 이기 때문에, 당연하게도 영화 데이터들을 한번에 보내는게 아니라,

영화 데이터를 1개씩 보내야 한다. == 그러한 로직을 Controller에서 구현 해야 한다.

(즉, insert()를 배열리스트.size() 만큼 for문을 통해 반복 해야 한다)

 

정리 >>

DAO의 비즈니스 메서드는 CRUD에 의거해서 절대로 변경되지 않는다.

insert() 메서드의 인자로는 MovieVO mVO가 고정이기 때문에,

이 사회적인 약속에 맞춰서 로직을 구현 해야 한다.

 

가령, insert() 메서드를 오버로딩 해서 새로운 메서드를 절대로 만들지 않는다.

 

== 높은 응집도를 위해서, 새로운 메서드를 만들지 않음.

 

11. Model의 DAO 클래스 내부의 비즈니스 메서드들은 DB와 연결이 되어야 한다.

즉, DBMS와 연결되게 하는 로직을 구현 해야 한다.

이것이 JDBC 이다.

 

12. JDBC 인터페이스를 구현할 때 필수적으로 필요한 4가지가 존재 한다.

 

1) 드라이버 로드시 필요한 클래스

 

2) JAVA를 DB와 연결하기 위한 클래스

(Connection 클래스의 객체인 connection을 생성하는 것이 목표 == 연결 통로 역할)

 

3) 데이터를 read하고 write 할수 있게 하는 클래스

(Statement 클래스의 객체인 statement를 생성하고 사용하는 것이 목표 == read ok, write ok)

 

4) JAVA를 DB와 연결 해제하기 위한 클래스

(연결 해제는 클래스가 만들어진 순서의 역순 이다)

 

이 4가지의 근본 코드를 이해할 수 있으면 좋지만, 이해하기 어렵다면,

이 4가지는 어떤 프로젝트, 어떤 프로그램, 어떤 소프트웨어 에도 공통적으로 구성되기에,

그냥 암기해서 사용 하도록 하기.

 

13. JDBC 인터페이스를 구현할 때, DAO의 비즈니스 메서드들에 공통적으로 코드를 작성해야 한다.

코드를 반복해서 작성하네 ?

>> 모듈화를 생각 할 수 있다.

 

 

14. 데이터를 read하고 write 할수 있게 하는 클래스.

(Statement 클래스의 객체인 statement를 생성하고 사용하는 것이 목표 == read ok, write ok)

 

statement = connection.createStatement(); 를 했으면,

 

resultSet = statement.executeQuery(mySQL 에서 사용하는 SELECT 구문 );

(output이 resultSet 이다)

 

int result = statement.executeUpdate(mySQL 에서 사용하는 INSERT, UPDATE, DELETE 구문);

(output이 int 타입 이다)

( 적용된 row(행)이 없을 때, MySQL은 반환값으로 0 또는 음수를 준다 )

 

1)

executeQuery() >> SELECT 시 사용한다.

즉, 테이블에 영향을 주지 않으면 executeQuery()를 사용한다. (단순 read)

 

예시

 

예시

 

2)

executeUpdate() >> INSERT, UPDATE, DELETE 시 사용한다.

즉, 테이블에 영향을 주면 executeUpdate()를 사용 한다.  (write)

 

예시

 

예시

 

예시

 

>> 적용된 row(행)이 없을 때, MySQL은 반환값으로 0 또는 음수를 준다.

 

예시

 

예시

 

>>

UPDATE MOVIE SET NAME = '이름' WHERE NAME = '영화';

를 하면 기존에 값이 새롭게 UPDATE 되어,

Query OK, 1 row affected 라는 문구를 볼수 있다.

 

하지만, 이제 '영화' 라는 NAME이 없는 상태에서,

UPDATE MOVIE SET NAME = '이름' WHERE NAME = '영화';

를 하면 UPDATE에 실패하고,

Query OK, 0 row affected 라는 문구를 볼수 있다.

 

이는, ( 적용된 row(행)이 없을 때, MySQL은 반환값으로 0 또는 음수를 준다 )

인것을 확인할 수 있다.

 

적용이 잘 된 경우는, 1 이상이 나오는 모습을 확인 할 수 있다.

1개면 1

2개면 2

10개면 10

..

 

15. 예외가 발생 했다.

>> catch (SQLException e)

 

대표적인 에러

1) 구문 에러

2) 사이즈 에러 (사이즈가 50인데 100을 넣으려고 할때)

3) PK 중복 에러

4) 드물지만, DBMS 공간이 없어서 에러

..

 

16. 데이터 보존성 개념

 

기존에 어떤 데이터를 INSERT 했다고 했을 때,

시스템 내부에서 PK를 부여 했을 것이다.

(내가 그렇게 제약조건을 걸어서 테이블을 생성했으니까)

 

근데, 그 데이터를 DELETE 했다고 하자.

 

이후, 새롭게 데이터들을 INSERT 했는데,

DELETE 됬던 그 데이터의 PK가 새로운 데이터에게 부여되지 않는 모습을 확인 가능 하다.

 

이는, MySQL 백에서 혹시라도 이 삭제된 데이터를 보존할 경우를 생각해서 갖고 있는 것이다.

 

예시로 회원가입을 했는데, 그 아이디를 삭제하고 (회원탈퇴)

다시 만들으려고 하면 해당 아이디로 재가입이 안되는 것을 볼 수 있다.

 

디지털 포렌식 >>

사라진 데이터를 긁어모으는 작업을 해서 데이터를 살려내는 작업.

 

17. selectAll() 메서드.

 

public ArrayList<MovieVO> selectAll(MovieVO mVO)

 

전체 출력과, 이름으로 검색 해서 출력을 하고 싶은 상황 일 때,

둘다 selectAll() 메서드를 사용 해야 한다.

 

기존에 이런 경우에 Controller 에서 mVO 객체의 인자 중에,

사용하지 않는 인자를 사용해서 DAO에게 넘겨주었다.

== searchCondition

(그렇게 하면, 코드를 if-else if문으로 구현 될것이다)

 

하지만, mySQL의 LIKE '%%' 구문을 알면 아래와 같이 코드를 간결하게 작성 하는 방법도 있다.

 

 

 

18. resultSet.getInt() / resultSet.getString()

 

while(resultSet.next()) {

int num = resultSet.getInt("NUM");

// int 타입의 값을 가지는 NUM 이라는 칼럼명이 있으면 그 int값을 num에 대입.

 

String name = resultSet.getString("NAME");

// String 타입의 값을 가지는 NAME 이라는 칼럼명이 있으면 그 String값을 name에 대입.

 

String odate = resultSet.getString("ODATE");

// String 타입의 값을 가지는 ODATE 이라는 칼럼명이 있으면 그 String값을 odate에 대입.

 

MovieVO mdata = new MovieVO(num,name,odate);

mdatas.add(mdata);

}

 

그외에 getDate() 등도 있다.

 

19. next() 메서드

 

// next() 메서드

// 1) pointer 개념.

// 2) boolean 타입의 output. >> true or false

 

// 현재 참조변수 resultSet에는 statement.executeQuery(sql_SELECTALL) 이 대입되어,

// DB의 MOVIE 테이블에 있는 조건에 해당하는 데이터 (영화 객체들)를 모두 가지고 있다.

// 그래서 이, 영화 데이터들 안을 전부 확인할건데, 각 영화들을 pointer 개념으로 하나하나씩 가리키게 된다.

// 언제까지 ?

// resultSet.next()가 false가 될때까지 이다.

// false 라는 말은 영화 데이터들을 모두 확인해서 더이상 가리킬 영화가 없다는것을 의미한다.

반응형

'DB (DataBase) (국비) > DB 메모' 카테고리의 다른 글

용이한 유지보수 및 편의성을 위해 만든 VO의 멤버변수 개념  (1) 2023.06.12
JDBC 필수 요소 4가지  (0) 2023.06.11
next() 메서드  (0) 2023.06.09
JDBC 모듈화 관련 개념  (0) 2023.06.09
메모  (0) 2023.06.07