developer Studying/Java

[Java]JDBC와 DAO, DTO 코드 흐름 읽어보기

ParkYeseul 2024. 9. 22. 12:18

처음 스트링 부트를 사용해서 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와 서블릿을 사용하여 웹 개발할 때의 코드 흐름과 필요한 파일 목록

(주인장이 헷갈려서 한 번 더 정리)

  1. 클라이언트 요청: 사용자가 브라우저에서 URL을 통해 요청 보냄
  2. 서블릿 매핑: 웹 애플리케이션의 web.xml 파일 또는 어노테이션을 사용하여 요청 URL과 서블릿 매핑
  3. 서블릿 실행:
    • 요청을 처리하기 위한 서블릿의 doGet() 또는 doPost() 메서드 호출
    • 필요한 비즈니스 로직(예: 데이터베이스 CRUD 작업)을 수행
  4. JSP 페이지로 포워딩: 서블릿이 처리한 결과를 JSP 페이지로 포워딩하여 사용자에게 응답
  5. JSP 페이지 렌더링: JSP 페이지가 클라이언트에게 HTML로 변환되어 응답
  6. 예시

사용자가 /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