본문 바로가기
Backend/JDBC

JDBC DTO의 개념

by Forsaken Developer 2023. 6. 12.
728x90
728x90

JDBC DTO의 개념

데이터베이스의 내용을 조회하고 조회된 내용을 반환받기 위해서는 여러개의 컬럼 값을 전달 받아야한다.

각각의 컬럼을 반환받는 메소드를 만들게 되면 컬럼 수 만큼의 메소드를 추가해야한다.

하지만 함수의 리턴 값은 하나이고 데이터들을 전달 받기 위한 방법이 필요하다.

결과 데이터를 하나로 묶어 반환할 수 있는 방법은 크게 2가지가 있다.

첫 번째로는 HashMap을 사용하는 방법이고 두 번째로는 DTO(Data Transfer Object)를 사용하는 방법이다.

두 방법 모두 key-value 방식으로 동작하며 데이터의 이동을 목적으로 사용할 수 있다.

HashMap을 사용하면 별도의 DTO class를 만들 필요없이 데이터를 가져올 수 있다.

하지만 DTO를 사용하는 것이 더 바람직하다.

컬럼명이 변경되었다고 가정하면 필드와 필드에 맞게 setter, getter메소드도 수정해야한다.

그러면 사용하는 쪽에서도 setter, getter 메소드를 찾을 수 없기 때문에 컴파일 오류가 발생한다.

오류가 발생하기 때문에 어느 위치에 수정을 해야할지 빠르게 파악할 수 있다.

하지만 HashMap을 사용하면 컴파일 과정에서는 오류가 발생하지 않고 런타임 과정에서 오류가 발생하여 오류를 추적하기가 어려워진다.

public class MenuDTO {
	private String menuCode;
	private String name;
	private int price;
	private String orderableStatus;
	private String categoryCode;

	public MenuDTO() {
	}

	public MenuDTO(String menuCode, String name, int price, String orderableStatus, String categoryCode) {
		super();
		this.menuCode = menuCode;
		this.name = name;
		this.price = price;
		this.orderableStatus = orderableStatus;
		this.categoryCode = categoryCode;
	}

	public String getMenuCode() {
		return menuCode;
	}

	public void setMenuCode(String menuCode) {
		this.menuCode = menuCode;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public String getOrderableStatus() {
		return orderableStatus;
	}

	public void setOrderableStatus(String orderableStatus) {
		this.orderableStatus = orderableStatus;
	}

	public String getCategoryCode() {
		return categoryCode;
	}

	public void setCategoryCode(String categoryCode) {
		this.categoryCode = categoryCode;
	}

	@Override
	public String toString() {
		return "MenuDTO [menuCode=" + menuCode + ", name=" + name + ", price=" + price + ", orderableStatus="
				+ orderableStatus + ", categoryCode=" + categoryCode + "]";
	}
}

DTO 클래스의 조건

  •  모든 필드는 private로 작성한다.
  • 기본 생성자는 명시적으로 작성하고 모든 필드를 초기화하는 생성자는 관례상 작성한다. (프레임워크에서 기본생성자를 필요로 하는 경우가 있다.)
  • 모든 필드에 대한 setter, getter 메소드를 작성한다.
  • toString 메소드를 작성한다. (optional)
  • 직렬화 처리 (optional)
public class Application {
	public static void main(String[] args) {
		Connection connection = getConnection();
		Statement statement = null;
		ResultSet resultSet = null;
		MenuDTO menuDTO = null;

		Scanner sc = new Scanner(System.in);
		String menuCode = sc.nextLine();

		String query = "SELECT * FROM TBL_MENU WHERE MENU_CODE='" + menuCode + "'";

		try {
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);

			if (resultSet.next()) {
				menuDTO = new MenuDTO();
				menuDTO.setMenuCode(resultSet.getString("MENU_CODE"));
				menuDTO.setName(resultSet.getString("NAME"));
				menuDTO.setPrice(resultSet.getInt("PRICE"));
				menuDTO.setOrderableStatus(resultSet.getString("ORDERABLE_STATUS"));
				menuDTO.setCategoryCode(resultSet.getString("CATEGORY_CODE"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(resultSet);
			close(statement);
			close(connection);
		}
		System.out.println(menuDTO);
	}
}

DTO에 오버라이딩 되어있는 toString 메소드를 통해서 데이터베이스로 부터 조회한 행을 확인할 수 있다.

728x90
반응형

'Backend > JDBC' 카테고리의 다른 글

PreparedStatement 생성  (0) 2023.06.13
JDBC statement와 resultSet 생성  (0) 2023.06.11
JDBC Template 구현  (0) 2023.06.10
JDBC 데이터베이스 접속 정보 분리  (0) 2023.06.09
JDBC Connection 생성  (0) 2023.06.08

댓글