처음 스트링 부트를 사용해서 DB와 연결 작업을 할 때 필요한 파일이 참 많았다.
DTO, DAO, Controller, Service, Mapper ...
흐름과 순서를 익혀서 겨우 겨우 작업을 했지만
지금도 100% 완벽히 이해했다고 하기엔 부족함이 많다.
이번엔 Servlet과 JSP로 웹 개발을 하기 때문에 DB연결 방식을 정확히 짚고 넘어가고자
복습하는 시간을 가져보려고 한다.
나는 전체적인 코드 흐름이 어떻게 흘러가는 지 이해하고 싶어
그 부분에 중점을 두었다!!!!!
🧩JDBC
- 자바에서 데이터 베이스에 접속할 수 있도록 하는 java api
- SQL문을 실행할 수 있게 해주는 함수 호출 인터페이스
- DBMS가 달라지더라도 동일한 API를 사용하게 해주기 때문에 Driver와 URL만 수정하면 됨
(Driver는 각 DBMS와 통신을 담당하는 자바 클래스로 JDBC를 사용하기 위해서 사용하려는 DBMS에 맞는 jar파일이 필요!)
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTest {
private final static String URL = "jdbc:mysql://127.0.0.1:3306/(db이름)";
private final static String USER_ID = "(dbuser)";
private final static String USER_PWD = "(dbpwd)";
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// DB 연결
conn = DriverManager.getConnection(URL, USER_ID, USER_PWD);
System.out.println("DB Connection Success!!!!!");
// Query 문 작성
String sql = "select * from book where isbn = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "111");
// Query 실행
rs = pstmt.executeQuery();
if (rs.next()) {
System.out.print(rs.getString("isbn") + "\t");
System.out.print(rs.getString("title") + "\t");
System.out.print(rs.getString("author") + "\t");
System.out.print(rs.getInt("price") + "\t");
System.out.print(rs.getString("desc") + "\t");
System.out.print(rs.getString("img") + "\t");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
1. Connection
Connection conn = DriverManager.getConnection(url, user, password);
데이터베이스와의 연결을 나타내는 객체
이 객체로 SQL 쿼리를 실행, 트랜잭션 관리, 데이터베이스와 통신
- url: 데이터베이스의 URL. 데이터베이스 종류에 따라 다름 (예: jdbc:mysql://localhost:3306/mydb)
- user: 데이터베이스 사용자 이름.
- password: 데이터베이스 사용자 비밀번호.
2. PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql);
SQL쿼리를 실행하기 위한 객체
3. SQL 실행 메서드
1. executeQuery
ResultSet rs = pstmt.executeQuery();
pstmt를 사용해 SELECT 쿼리를 실행하여 결과 반환 -> ResultSet 객체에 저장
2. executeUpdate
int affectedRows = pstmt.executeUpdate();
DML쿼리(insert, delete, update)를 실행하고 영향을 받은 행의 수 반환
🛵 DTO
- DB에서 가져온 데이터를 저장하는 객체
- 로직을 갖고 있지 않은 순수한 데이터 객체로 getter/setter메서드만 갖음
- 계층 간 데이터 교환을 위한 객체
package test;
public class BookDto {
private String isbn;
private String title;
private String author;
private int price;
private String desc;
private String img;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
}
🏕️ DAO
- DB에 접근해서 데이터 처리를 위한 객체
- 데이터베이스에 접근해 데이터를 조회하거나 조작하는 기능을 전담하는 객체
package test;
import java.sql.SQLException;
import java.util.List;
public interface BookDao {
int insert(BookDto BookDto) throws SQLException;
List<BookDto> select() throws SQLException;
}
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BookDaoImpl implements BookDao {
private DBUtil dbUtil = DBUtil.getInstance();
private static BookDao bookDao = new BookDaoImpl();
private BookDaoImpl() {}
public static BookDao getBookDao() {
return bookDao;
}
@Override
public int insert(BookDto bookDto) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
int ret = 0;
try {
conn = dbUtil.getConnection();
String sql = "insert into book values (?, ?, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bookDto.getIsbn());
pstmt.setString(2, bookDto.getTitle());
pstmt.setString(3, bookDto.getAuthor());
pstmt.setInt(4, bookDto.getPrice());
pstmt.setString(5, bookDto.getDesc());
pstmt.setString(6, bookDto.getImg());
ret = pstmt.executeUpdate();
} finally {
dbUtil.close(pstmt, conn);
}
return ret;
}
@Override
public List<BookDto> select() throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<BookDto> list = new ArrayList<>();
try {
conn = dbUtil.getConnection();
String sql = "select * from book";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
BookDto bookDto = new BookDto();
bookDto.setIsbn(rs.getString("isbn"));
bookDto.setTitle(rs.getString("title"));
bookDto.setAuthor(rs.getString("author"));
bookDto.setPrice(rs.getInt("price"));
bookDto.setDesc(rs.getString("desc"));
bookDto.setImg(rs.getString("img"));
list.add(bookDto);
}
} finally {
dbUtil.close(rs, pstmt, conn);
}
return list;
}
}
insert 메서드는 BookDto 객체를 받아 데이터베이스에 책 정보를 삽입
<<큰 코드 흐름>>
1. 변수 초기화 (데이터베이스 연결, 쿼리 실행 결과 및 결과를 저장할 리스트 초기화)
Connection conn = null;
PreparedStatement pstmt = null;
int ret = 0;
Connection 및 PreparedStatement 객체 초기화
ret은 삽입된 행의 수 저장
2. 데이터베이스 연결 후 SQL 쿼리 준비
String sql = "insert into book values (?, ?, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
SQL 쿼리 준비-> SQL 쿼리를 정의하고, PreparedStatement 객체 생성
pstmt.setString(1, bookDto.getIsbn());
pstmt.setString(2, bookDto.getTitle());
pstmt.setString(3, bookDto.getAuthor());
pstmt.setInt(4, bookDto.getPrice());
pstmt.setString(5, bookDto.getDesc());
pstmt.setString(6, bookDto.getImg());
BookDto 객체의 각 속성을 SQL 쿼리의 파라미터로 설정
3. 쿼리 실행
ret = pstmt.executeUpdate();
executeUpdate 메서드를 호출하여 쿼리를 실행하고, 삽입된 행의 수를 ret에 저장
🌠 JSP와 서블릿을 사용하여 웹 개발할 때의 코드 흐름과 필요한 파일 목록
(주인장이 헷갈려서 한 번 더 정리)
- 클라이언트 요청: 사용자가 브라우저에서 URL을 통해 요청 보냄
- 서블릿 매핑: 웹 애플리케이션의 web.xml 파일 또는 어노테이션을 사용하여 요청 URL과 서블릿 매핑
- 서블릿 실행:
- 요청을 처리하기 위한 서블릿의 doGet() 또는 doPost() 메서드 호출
- 필요한 비즈니스 로직(예: 데이터베이스 CRUD 작업)을 수행
- JSP 페이지로 포워딩: 서블릿이 처리한 결과를 JSP 페이지로 포워딩하여 사용자에게 응답
- JSP 페이지 렌더링: JSP 페이지가 클라이언트에게 HTML로 변환되어 응답
- 예시
사용자가 /books URL에 접근 -> BookServlet의 doGet() 메서드가 호출되어 데이터베이스에서 목록 조회
-> 조회한 책 목록을 request 객체에 설정하고, bookList.jsp로 포워딩 ->
bookList.jsp 페이지가 렌더링되어 사용자가 볼 수 있는 형태로 출력
☪️ 소곤소곤
아 확실히 머리에 흐름이 잡힌 기분이 든다.
이거 왜 쓰는 거지? 생각이 들 때는 바로 바로 찾아서 머릿 속에 적립해야겠다.
알고나니 눈도 마음도 편-안
조금 졸리고 배고프다ㅎ
공부에 참고한 사이트
https://velog.io/@h000/JDBC%EC%99%80-DAO-DTO
@ChatGPT
'developer Studying > Java' 카테고리의 다른 글
[Java]try catch문 이해하기 -예외처리 (0) | 2024.09.22 |
---|