<< 학습 목표 >>
1. 자바와 DB를 연동해야하는 이유를 설명할 수 있다.
2. DB와 통신(데이터를 주고 받는 행위)하는 자바 클래스를 다른 말로 표현할 수 있다.
3. 자바 클래스와 DB를 연동할 수 있다.
앞서 [ 서블릿 본격적인 시작 ( https://codingaja.tistory.com/21 ) ] 글에서 실제 웹 서비스는 아래와 같이 동작한다고 했음
Servlet 카테고리에서 주로 배우는 것들은 컨트롤러(Controller)임
컨트롤러만 있다고 해서 클라이언트의 요청을 완전하게 처리할 수는 없음
사용자가 회원 가입을 한다면 회원 정보를 "영구히 저장"해야함
사용자가 로그인을 한다면 "저장되어있는 회원 정보" 중 사용자가 입력한 아이디, 비밀번호와 일치하는 회원 정보를 찾아야함
사용자가 회원 정보 수정을 한다면 "저장되어있는 회원 정보"를 수정해야함
사용자가 회원 탈퇴를 한다면 "저장되어있는 회원 정보"를 삭제해야함
이런식으로 사용자가 무언가를 요청했을 때 주로 저장되어있는 정보를 가져와야 요청에 맞는 처리를 할 수 있음
어떤 정보를 안전하게 오랫동안 또는 영구히 저장할 수 있는 방법은 어떤것이 있을까?
먼저 파일에 저장하는 방법이 있음
자바의 파일 입출력 방법을 사용해 파일에 정보를 저장한다면 파일을 삭제하기 전까지는 사용자의 정보가 저장되어있음
또한 파일에 저장된 정보를 가져올 수 있음
그러나 파일에 저장하면 저장된 정보를 효율적으로 관리(저장, 수정, 삭제, 조회 등)를 할 수가 없음
정보를 효율적으로 관리할 수 있으면서 오랫동안 또는 영구히 저장하는 방법은 DB(Database)를 사용하는 것
DB와 관련된 카테고리는 아니므로 "왜 DB에 정보를 저장하면 효율적으로 관리할 수 있는지", "왜 오랫동안 또는 영구히 저장할 수 있지" 등 DB와 관련된 기초적인 내용은 언급하지 않겠음
만약 DB를 공부해본적이 없다면 여기서 잠깐 멈추고 DB를 끝까지 다 공부하고 오자
DB를 모르면 이후에 있는 Servlet 카테고리의 내용과 JSP 카테고리의 내용을 배울 수 없음
DB는 서블릿에서 연결하는게 아닌 자바(클래스)에서 연결함
서블릿은 Controller(컨트롤러 / 제어자)의 역할이라고 했음
그러므로 서블릿은 요청을 받고 파라미터 유효성을 검증함
클라이언트의 요청을 처리하는 주체는 서비스(Service / 자바의 클래스)가 담당함
특히 DB와 연결한 후 DB로 쿼리(Query) 를 보내고 쿼리 결과를 받는 역할의 서비스를 DAO(Data Access Object) 라고 부름
사용자가 회원 가입 페이지에서 회원 가입 하는 상황을 전체적인 시스템의 흐름으로 알아보자
DAO( Data Access Object / 자바 클래스 ) 가 DB에 접속하기 위해서는 별도의 라이브러리가 필요함
라이브러리는 DB 마다 서로 다름
우리는 MariaDB를 사용하므로 MariaDB가 제공하는 라이브러리를 다운 받아야함
MySQL 또는 Oracle DB를 사용한다면 해당 DB가 제공하는 라이브러리를 다운 받아야함
라이브러리를 다운 받기 위해 구글에 maven repository 로 검색하자(1)
그 후 검색 결과의 첫 번째 사이트(2) 로 들어가자
( 만약 검색 결과가 이와 다르다면 직접 이동하자 / https://mvnrepository.com/ )
mariadb 로 검색(1) 후 첫 번째 검색 결과(2)로 들어가자
어느 버전이든 마음에 드는 버전을 선택해 들어가자
jar 형식으로 압축된 라이브러리를 다운 받자(1)
( jar 형식 - 자바에서 인식할 수 있는 압축 형식 )
다운 받은 라이브러리를 프로젝트 -> src -> main -> webapp -> WEB-INF -> lib 폴더로 드래그 & 드롭 하자
여기까지 DAO가 DB에 접속하기 위해 필요한 라이브러리를 다운 받았음
이제 본격적으로 DAO에서 DB에 접속하고(1) 쿼리를 전송하고 실행(2) 한 후 쿼리 실행 결과를 받자보자(3)
(1), (2), (3) 을 하기 위해 임시로 DAO를 만들자
chapter04 -> DAO 클래스를 추가하고 아래 코드를 추가하자
package chapter04;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DAO {
public void someMethod() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "전송하고 실행할 쿼리(Query)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// pstmt.executeUpdate();
// pstmt.executeQuery();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[ (1) DB에 접속 ] 하기 위해서는 먼저 lib 폴더에 추가한 라이브러리를 불러와야함(1)
그 후 불러온 라이브러리의 getConnection 메서드를 사용해 DB에 접속함(2)
DB에 접속하기 위해 getConnection 메서드의 인자로 넣는 값을 자세히 분석해보자
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
getConnection 메서드의 인자로 넣는 값은 DB에 접속하기 위한 URL임
우리가 네이버에 접속하기 위해 주소창에 https://www.naver.com 을 입력하듯이 DB에 접속하기 위한 URL임
( 만약 "아닌데? 난 네이버에 접속할 때 www.naver.com 으로 입력하는데" 하시는 분은 다시 https://codingaja.tistory.com/16, https://codingaja.tistory.com/17 글을 보고 오자 )
jdbc:mariadb:// 는 DB에 접속하기 위해 사용하는 프로토콜임
우리가 네이버에 접속하기 위해 https:// 부터 입력하듯이
만약 MySQL, Oracle DB를 사용해서 해당 DB로 접속해야한다면 프로토콜이 달라짐
localhost 는 DB가 동작 중인 서버의 IP 주소임
localhost는 내 컴퓨터의 IP 라는 뜻이라고 했음
3306은 DB의 포트번호임
practice 는 DB 내 Database명임
( DB와 관련된 기초 내용은 하지 않음 / DB가 Database의 줄임말 아닌가? DB 내 Database명 이라는게 뭐지? 라는 생각이 드는 분은 잠깐 서블릿을 덮고 DB 먼저 공부하고 오자 )
? 뒤에 있는것들은 DB에 접속하기 위한 사용자명(아이디)과 비밀번호임
이제 위 소스코드를 이어서 보자
이렇게 getConnection 메서드로 접속하면 접속 정보를 담고 있는 Connection 타입 객체가 반환됨
이 객체를 통해서 쿼리를 전송하고 실행할 수 있음
코드 가독성을 위해 실행시키고 싶은 쿼리를 먼저 작성(3) 한 후 Connection 객체 안에 들어있는 쿼리를 전송하고 실행시킬 PreparedStatement 객체를 꺼냄(4)
! 여기서 주의 할 점 PreparedStatement 객체를 꺼낼 때 쿼리를 인자로 넣어줘야함
여기까지 됐다면 그 다음으로...
실행할 쿼리가 INSERT, UPDATE, DELETE 라면 executeUpdate 메서드를 호출(5-1)하고 실행할 쿼리가 SELECT 라면 executeQuery 메서드를 호출(5-2)해야함
이렇게 DB에 쿼리를 전송하기 위해 준비( 1, 2 ) 하고 쿼리를 전송 & 실행 한 후 결과를 받아왔다면 ( 3, 4, 5-1, 5-2) DB와 접속을 끊어야함(6)
DB와 접속을 끊지 않으면 DB는 해당 클래스가 아직 쿼리를 전송 & 실행할 것들이 더 남아있구나 생각해 접속을 계속 유지함
이는 마치 음식점에서 음식을 다 먹은 손님이 나가지 않고 계속 그 자리에 앉아있는 상황과 같음
이런 상황이라면 다음 손님이 자리가 나길 계속 기다리면서 음식을 먹지 못하는 것처럼 다른 클래스에서 DB를 사용하기 위해 접속할 수 없는 상태가 발생함
이제 임시로 main을 가지고 있는 자바 소스 파일을 추가하고 DAO 객체를 생성한 후 someMethod 메서드를 호출해보자
( chapter04 -> JavaProgram 소스 파일을 추가하고 아래 코드를 추가하자 )
package chapter04;
public class JavaProgram {
public static void main(String[] args) {
DAO dao = new DAO();
dao.someMethod();
}
}
그 후 해당 소스 파일을 실행시키자
( 소스 파일 내 우클릭 -> [ Run AS ] -> [ Java Application ] )
소스 파일을 실행시켰을 때 [ Console ] 패널에 아무것도 뜨지 않았다면 (1), (2), (3) 과정이 제대로 동작했다는 것
만약 [ Console ] 패널에 예외 메세지가 떴다면 someMethod 내 어떤 코드에서 오타가 있거나 DB 내 이름이 practice 인 Database가 없거나 root 사용자 비밀번호가 틀렸을 것, 하나씩 잘 체크하고 다시 실행시켜 보자
( 그래도 예외 메세지가 뜬다면 댓글로 남겨주세요 )
여기까지 자바와 DB를 연동하는 방법을 배웠음
여기서는 자바와 DB를 연동하는 큰 흐름만 배운 것
그 이유는 자바와 DB를 연동하는 과정이 더 많이 남아있음
앞으로 남은 과정들에 설명할 것들이 많고 복잡하기 때문에 이 글에서는 이렇게 큰 흐름만 배우고 다음 글로 넘어가자
'Servlet + JSP > Serlvet-Chapter04' 카테고리의 다른 글
Chapter04. 자바에서 쿼리 보내고 결과 받기 / SELECT (0) | 2023.03.06 |
---|---|
Chapter04. 자바에서 쿼리 보내고 결과 받기 / INSERT, UPDATE, DELETE (0) | 2023.03.06 |
Chapter04. ServletConfig (0) | 2023.03.03 |
Chapter04. ServletContext (0) | 2023.03.03 |
Chapter04. 포워딩을 할 때 값을 전달하는 방법 (0) | 2023.03.03 |