DAO(Data Access Object)
- 실제 데이터베이스에 접근하는 객체입니다.
- 데이터베이스 연결: 데이터베이스에 연결하고 연결을 관리합니다.
- CRUD 작업: 데이터베이스에 대한 Create, Read, Update, Delete 작업을 수행합니다.
- 데이터 매핑: 데이터베이스로부터 가져온 데이터를 객체로 변환하고, 객체 데이터를 데이터베이스에 저장합니다.
DAO의 장점
- 코드의 재사용성: 데이터베이스 접근 로직을 DAO 클래스에 캡슐화하여 여러 곳에서 재사용할 수 있습니다.
- 유지보수성 향상: 데이터베이스와의 상호작용 코드가 한 곳에 집중되어 있어 수정이 용이합니다.
- 비즈니스 로직과의 분리: 데이터 접근 로직과 비즈니스 로직을 분리하여 코드를 더 명확하고 구조화할 수 있습니다.
- 테스트 용이성: DAO를 Mocking하여 비즈니스 로직을 테스트할 때 데이터베이스와의 실제 연결 없이 테스트할 수 있습니다.
DTO(Data Transfer Object)
- 계층 간 데이터 교환을 위한 객체입니당.
- 로직이나 알고리즘 없이 Getter, Setter만 있어유
- 단순한 데이터 구조: DTO는 데이터를 담기 위한 필드와 그 필드에 접근하기 위한 getter 및 setter 메서드로만 구성됩니다.
- 비즈니스 로직 없음: DTO는 오직 데이터 전송을 목적으로 하기 때문에 비즈니스 로직이 포함되지 않습니다.
- 계층 간 데이터 전달: 서비스 계층, 데이터 접근 계층(DAO), 프레젠테이션 계층(Swing UI) 등 서로 다른 계층 간에 데이터를 효율적으로 전달하는 역할을 합니다.
이전에 MySQL을 통해 데이터를 만들었었다.
이젠 이 데이터를 가져와서 인텔리제이에서 쓸 수 있게 만들어보자.
package app.telecom.dto;
public class Telecom {
private int customerId;
private String customerName;
private int year;
private String grade;
public Telecom() {}
public Telecom(int customerId, String customerName, int year, String grade) {
super();
this.customerId = customerId;
this.customerName = customerName;
this.year = year;
this.grade = grade;}
public int getCustomerId() {
return customerId;}
public void setCustomerId(int customerId) {
this.customerId = customerId;}
public String getCustomerName() {
return customerName;}
public void setCustomerName(String customerName) {
this.customerName = customerName;}
public int getYear() {
return year;}
public void setYear(int year) {
this.year = year;
public String getGrade() {
return grade;}
public void setGrade(String grade) {
this.grade = grade;}
@Override
public String toString() {
return "Customer [customerId=" + customerId + ", customerName=" + customerName + ", year=" + year + ", grade=" + grade + "]";
}
}
한 줄씩 해석해보겠다.
package app.telecom.dto;
- 이 클래스가 app.telecom.dto 패키지에 속해 있음을 선언합니다. 이는 클래스의 논리적 위치를 정의하고, 패키지 구조를 통해 코드를 더 잘 관리하고 조직할 수 있게 합니다.
public class Telecom {
- Telecom이라는 이름의 공개(public) 클래스를 정의합니다. public 키워드는 이 클래스가 다른 패키지에서도 접근 가능함을 의미합니다.
private int customerId; private String customerName; private int year; private String grade;
- private int customerId; : customerId 필드는 고객의 고유 식별자를 나타내며, private 접근 제어자로 선언되어 클래스 내부에서만 접근 가능합니다.
- private String customerName; : customerName 필드는 고객의 이름을 나타내며, 마찬가지로 private 접근 제어자로 선언되었습니다.
- private int year; : year 필드는 고객과 관련된 연도를 나타내며, private 접근 제어자로 선언되었습니다.
- private String grade; : grade 필드는 고객의 등급을 나타내며, private 접근 제어자로 선언되었습니다.
public Telecom() {}
매개변수가 없는 기본 생성자입니다. 인스턴스를 생성할 때 기본값으로 객체를 초기화합니다.
public Telecom(int customerId, String customerName, int year, String grade) { super(); this.customerId = customerId; this.customerName = customerName; this.year = year; this.grade = grade; }
- public Telecom(int customerId, String customerName, int year, String grade) { : 모든 필드를 초기화하는 매개변수가 있는 생성자입니다. 객체를 생성할 때 특정 값으로 필드를 초기화할 수 있습니다.
- super(); : 부모 클래스의 생성자를 호출합니다. 이 경우 명시적인 부모 클래스가 없기 때문에 암시적으로 Object 클래스의 생성자를 호출합니다.
- this.customerId = customerId; : 매개변수로 전달된 customerId 값을 현재 객체의 customerId 필드에 할당합니다.
- this.customerName = customerName; : 매개변수로 전달된 customerName 값을 현재 객체의 customerName 필드에 할당합니다.
- this.year = year; : 매개변수로 전달된 year 값을 현재 객체의 year 필드에 할당합니다.
- this.grade = grade; : 매개변수로 전달된 grade 값을 현재 객체의 grade 필드에 할당합니다.
참고 : 칼럼은 고객ID, 고객이름, 나이, 등급이다.
public int getCustomerId() { return customerId; }
- public int getCustomerId() { : customerId 필드의 값을 반환하는 getter 메서드입니다. public 접근 제어자로 선언되어 외부에서 호출 가능합니다.
- return customerId; : customerId 값을 반환합니다.
public void setCustomerId(int customerId) { this.customerId = customerId; }
- public void setCustomerId(int customerId) { : customerId 필드의 값을 설정하는 setter 메서드입니다. public 접근 제어자로 선언되어 외부에서 호출 가능합니다.
- this.customerId = customerId; : 매개변수로 전달된 customerId 값을 현재 객체의 customerId 필드에 할당합니다.
public String getCustomerName() { return customerName; }
- public String getCustomerName() { : customerName 필드의 값을 반환하는 getter 메서드입니다.
- return customerName; : customerName 값을 반환합니다.
public void setCustomerName(String customerName) { this.customerName = customerName; }
- public void setCustomerName(String customerName) { : customerName 필드의 값을 설정하는 setter 메서드입니다.
- this.customerName = customerName; : 매개변수로 전달된 customerName 값을 현재 객체의 customerName 필드에 할당합니다.
public int getYear() { return year; }
- public int getYear() { : year 필드의 값을 반환하는 getter 메서드입니다.
- return year; : year 값을 반환합니다.
public void setYear(int year) { this.year = year; }
- public void setYear(int year) { : year 필드의 값을 설정하는 setter 메서드입니다.
- this.year = year; : 매개변수로 전달된 year 값을 현재 객체의 year 필드에 할당합니다.
public String getGrade() { return grade; }
- public String getGrade() { : grade 필드의 값을 반환하는 getter 메서드입니다.
- return grade; : grade 값을 반환합니다.
public void setGrade(String grade) { this.grade = grade; }
- public void setGrade(String grade) { : grade 필드의 값을 설정하는 setter 메서드입니다.
- this.grade = grade; : 매개변수로 전달된 grade 값을 현재 객체의 grade 필드에 할당합니다.
@Override public String toString() { return "Customer [customerId=" + customerId + ", customerName=" + customerName + ", year=" + year + ", grade=" + grade + "]"; }
- @Override : 이 메서드가 부모 클래스(Object)의 toString() 메서드를 재정의하고 있음을 나타냅니다.
- public String toString() { : 객체의 문자열 표현을 반환하는 메서드입니다.
- return "Customer [customerId=" + customerId + ", customerName=" + customerName + ", year=" + year + ", grade=" + grade + "]"; : customerId, customerName, year, grade 필드의 값을 포함하는 문자열을 반환합니다.