본문 바로가기
Front-end (국비)/메모

23.06.30 메모 (JSP_MVC 패턴으로)

by Hwanii_ 2023. 6. 30.
728x90

M-V-C 패턴으로 백엔드와 프론트를 완전 분리 시키기.

 

이번에는, 

 

데이터 저장을, 자바의 배열리스트에 저장 하지 않고, 

MySQL (DBMS) 을 사용해서, 데이터를 DB에 저장 해보려 한다.

 

JDBC 인터페이스 구현 하기.

 

홈페이지 연습 하기.

 

>>

Model (자바 / 백엔드)

 

1. 

JDBC 인터페이스

 

2.

BoardDAO

 

3.

MemberDAO

 

 

 

[ BoardDAO ]

 

 

해당 클래스 내부에서 conn, pstmt, rs를 여러번 재 사용 해서,

반복을 피하기 위해 상단에 참조변수를 선언한 모습 이다.

 

 

DB를 사용하기 때문에, 필요한 sql 구문 이다.

 

preparedStatement (향상된 Statement) 를 사용하여,

문법상 자바의 개입이 사라져서, 

클래스 상단에 배치한 모습이다.

 

모든 비즈니스 메서드 내부에서 사용되는 변수들 이기에,

static 키워드를 붙혀서 클래스 변수로 선언.

 

또한, sql 구문은 변하면 안되므로 final 키워드를 붙혀, 상수화 시켰다.

 

또한, 해당 클래스 내부에서 사용되는 sql 구문이기에,

접근 제어자 private를 붙혀 외부로부터 접근이 되지 못하도록 했다.

 

 

핵심 비즈니스 메서드 중, 한개인 selectAll() 메서드 이다.

 

DB로 부터 받은 데이터 (게시물 / 게시판 글) 전체 (전체 게시물 / 전체 게시판 글) 를,

자바의 ArrayList 에 담아서,

Controller 에게 return 값으로 배열리스트를 던질 예정 이다.

 

우선, 

conn 객체를 확보 해야 한다.

 

 

JDBCUtill.connect() 메서드를 통해서,

 

Class.forName() 메서드를 통한, 드라이버 로딩,

DriverManager.getConnection() 메서드를 통한, conn 연결통로 확보를 한다.

그것을 conn 참조변수에 담아 준다.

 

DB로 부터 받아온 데이터를 ArrayList 에 담아야 하기에,

배열리스트를 선언 및 초기화 (생성) 한다.

 

 

향상된 Statement를 사용해서,

sql 구문을 준비 시킨 상태로,

pstmt 참조변수에 담아주면서 DB와 연결 한다.

 

위에서 sql 구문은 다음과 같았다.

 

 

즉, BOARD 라는 테이블을 전부 ~ SELECT 할거야.

(연습이라 *을 사용했지만, 와일드 카드 대신에, 칼럼명을 다 적어주도록 하자)

 

CRUD 중에,

 

R은 executeQuery() 메서드를 사용한다.

 

C, U, D는  executeUpdate() 메서드를 사용 한다.

 

executeQuery() 메서드는 output으로, 

 

 

ResultSet 타입의 값을 return 한다.

 

그래서,

상단에 ResultSet rs; 로 선언을 해두었기에,

rs = pstmt.executeQuery() 처럼, 코드를 작성 한다.

 

sql 구문에 따라서, 결과값을 rs 참조변수에 저장했으니,

 

해당 참조변수를 주체로 하여, next() 메서드를 사용 한다.

 

 

while문을 사용한 이유는, 얼마나 반복 해야할지 모르니까.

즉, SELECT를 하는 sql 구문을 통해서, 해당 테이블에 있는

조건에 맞는 모든 데이터를 가져온 상황인데,

그 데이터가 총 몇개인지 알 수가 없으니까, == 몇번 반복 해야 할지 모르니까.

if문이 아닌, while문 이다.

 

selectOne() 의 경우에는, 딱, 1개의 경우이니, if문을 사용 한다.

 

next() 메서드는, pointer 개념의 메서드 이다.

 

해당 메서드는 ResultSet 클래스가 가지고 있는 메서드 이다.

 

Board 데이터 들을 처음부터 끝까지 돌면서, (각각의 데이터 마다 Pointer을 가리키면서)

 

BoardVO 타입의 참조변수 data에 값을 set 해준다.

 

 

DB의 테이블에서, 

 

NUM 이라는 칼럼명을 가진 아이의 값을 get 해서,

num 이라는 멤버변수의 값에 set 할거야.

 

TITLE 이라는 칼럼명을 가진 아이의 값을 get 해서,

title 이라는 멤버변수의 값에 set 할거야.

 

CONTENT 이라는 칼럼명을 가진 아이의 값을 get 해서,

content 이라는 멤버변수의 값에 set 할거야.

 

WRITER 이라는 칼럼명을 가진 아이의 값을 get 해서,

writer 이라는 멤버변수의 값에 set 할거야.

 

이다.

 

그렇게 data 객체의 값들을 전부 set 했으니,

배열리스트 datas에 add() 하면 된다.

 

언제까지 ? while문을 다 돌을때 까지 ~

 

다 돌아서, next() 메서드가 더이상 가리킬 (Pointer) 대상이 없으면,

return 값으로 false를 반환 한다.

 

 

 

Returns:

 

pointer가 새로 가리킨 새로운 행이 있으면, true를 반환 하고,

 

더이상 가리킬 행들이 없으면 false를 반환 한다고 되어 있다.

 

BoardVO의 멤버변수 이다.

 

 

DB에서 JAVA로 데이터를 모두 가져왔으면,

열었던 순서의 역순으로 JDBC 인터페이스를 disconnect 해줘야 한다.

 

그리고, return 값으로 BoardVO 타입의 배열리스트를 반환 한다.

 

 

 

 

 

그 다음은, selectOne() 메서드 이다.

 

 

위의 selectAll() 메서드와 구조는 거의 동일 하다.

 

CRUD 중에 R에 해당하기 때문에,

 

pstmt.executeQuery() 메서드를 사용 한다.

 

ResultSet rs에 결과를 담기 전에,

 

해당 메서드는 selectAll() 과 다르게,

한개의 대상만 SELECT 하는 메서드 이기 때문에,

무언가 조건이 하나 필요 하다.

 

sql 문을 확인해 보자.

 

 

위의 이미지와 같이, BOARD 라는 테이블을 모두 SELECT 할거긴 한데,

WHERE NUM = ? 이라는 조건이 붙어 있다.

 

즉, 게시물 (객체)의 고유 번호 (식별 번호 / PK) 를 알아야 한다.

 

 

그래서, pstmt 주체가 setInt() 메서드를 사용 하는 모습을 볼 수 있다.

 

pstmt 주체가 set() 메서드를 사용하는 일은, 많이 나올 예정 이다.

 

sql 문의 첫번째 ? 를 의미하는게 숫자 1에 해당 한다.

 

SQL_SELECTONE 구문에, ?가 몇개 있냐에 따라서,

set() 메서드의 개수도 달라진다.

 

즉, ?의 개수 == set() 메서드의 개수

 

bVO.getNum() 이 가능한 이유 :

Controller 로 부터, 사용자로부터 입력 받은, num을

bVO 객체에 담아서, 보내줬기 때문이다.

 

 

WHERE NUM = bVO.getNum() 에 조건에 따라서,

대상 한개만 pstmt.executeQuery() 가 되었기 때문에,

반복을 할 필요가 없는 상황 이다.

 

따라서, if문을 사용해서, rs.next() 를 하고 있는 모습이다.

 

selectOne() 메서드는 return 값으로 bVO 객체를 반환하므로,

 

BoardVO 타입의 참조변수 data에 필요한 멤버변수의 값을 set 해서,

return 값으로 data를 반환 하면 된다.

 

여기서는, data = new BoardVO(); 로 표현 했는데,

그 이유는 스코프 (범위) 이슈 때문이다.

 

try 문 안에, 객체를 선언 및 초기화 (생성) 해버리면,

 

그 자체가 지역변수화 되버려서, 외부에서 return data를 할 수 없게 된다.

 

그래서, 객체의 선언은 try - catch 문 외부에 해놓고,

내부에서 new 키워드를 통해 객체를 생성하는 식으로 코드를 작성하면,

스코프 이슈가 해결된다.

 

암튼, selectAll() 처럼,

 

rs 주체가 next() 메서드를 사용한다.

 

DB의 테이블에서, 

 

NUM 이라는 칼럼명을 가진 아이의 값을 get 해서,

num 이라는 멤버변수의 값에 set 할거야.

 

TITLE 이라는 칼럼명을 가진 아이의 값을 get 해서,

title 이라는 멤버변수의 값에 set 할거야.

 

CONTENT 이라는 칼럼명을 가진 아이의 값을 get 해서,

content 이라는 멤버변수의 값에 set 할거야.

 

WRITER 이라는 칼럼명을 가진 아이의 값을 get 해서,

writer 이라는 멤버변수의 값에 set 할거야.

 

이다.

 

각각의 멤버변수를 모두 set 해서, 그 데이터가 담긴, 참조변수 자체를 return 한다.

 

 

 

 

 

다음은, insert() 메서드 이다.

 

Board (게시판 글) 를 새롭게 작성하게 되면, DB에 글을 저장 해야 하기 때문에,

CRUD 메서드 중, Create에 해당 한다.

 

 

sql 구문을 확인해보자.

 

 

 

 

NUM은 DB 테이블을 생성할때,

 

 

이런식으로, AUTO_INCREMENT KEY를 했기도 하고,

책의 식별 번호를 사용자로부터 입력 받는식으로 설계 하지 않는다.

 

그래서, 아래에서, pstmt 주체가 set() 메서드를 사용할 때,

NUM 을 제외하고 set을 하게 된다.

 

 

사용자로부터 입력받은,

title, content, writer을 객체에 담아서, 객체로 넘어오면,

해당 객체에 담겨져있는 정보를 get 해서,

set 하는 흐름을 확인할 수 있다.

 

pstmt.executeUpdate() 메서드는 return 값으로,

int 타입의 숫자를 반환 한다.

 

숫자가 0보다 작거나 같으면, 

즉, 이미지로 본다면,

int rs 가 0보다 작거나 같다면,

 

무언가 실패 했다는 것을 의미 한다.

 

그래서 return 값으로 false를 반환 시켜주는 코드를 구현 했다.

실패했을 때, false를 반환한다면, Controller는 결과값을 false로 받았을 때,

프론트에서 실패했다는 문구를 알려주는 느낌으로 작성할 수 있겠다.

 

성공적으로 잘 처리가 되었다면,

C, U, D 비즈니스 메서드 들은, return 값으로 true를 반환 한다.

 

 

이게 바로, R 메서드와, C, U, D 메서드의 차이 라고 할 수 있다.

( R 메서드들은 return 값으로 각각, 배열리스트를 반환 / 객체를 반환 한다. )

 

 

 

 

 

다음은,  update() 메서드 이다.

 

C, U, D 중에서 U에 해당 하며, 사실상 구조는 C와 동일 하다.

 

 

sql 구문을 확인해보자.

 

 

게시글을 작성한 사용자가, 게시글을 수정하는 기능에 해당할 것이다.

 

Controller 에게, 새롭게 변경할 (SET) TITLE, CONTENT 값을 받아오고,

어떤 게시글을 변경할건지 WHERE NUM을 받아온다.

 

 

? 가 3개 있으니,

set() 메서드도 3개가 있는것을 볼 수 있고,

첫번째 ? 부터, 차례대로, 1, 2, 3 이다.

 

pstmt 주체가 executeUpdate() 메서드를 사용하기 전에,

즉, 최종적으로 update 하기 전에,

update를 하기 위해, 필요한 값들을 set 하는 과정 이다.

 

 

 

 

 

마지막으로, delete() 메서드 이다.

 

 

CRUD 중에 D에 해당하는 메서드 이다.

 

마찬가지로, C, U 메서드 처럼, D도 구조가 동일 하다.

 

sql 문을 확인해보자.

 

 

어떤 게시글을 삭제할건지 식별자인 (PK) NUM만 조건값으로 있으면 되기 때문에,

간단하다고 볼 수 있다.

 

 

반응형

'Front-end (국비) > 메모' 카테고리의 다른 글

23.06.30 메모 3 (JSP_MVC 패턴으로)  (0) 2023.07.01
23.06.30 메모 2 (JSP_MVC 패턴으로)  (0) 2023.07.01
메모  (0) 2023.06.28
23.06.28 메모  (0) 2023.06.28
<p> </p> 태그 & 블록 요소 & 인라인 요소  (0) 2023.06.21