VO (Value Object) Class는 데이터베이스 테이블에서 가져온 데이터를 객체로 만들어 다른 객체나 클래스로 전달하기 위해 사용하는 클래스이다. 데이터베이스의 테이블 하나를 하나의 클래스로 만들어서 사용할 수 있다.
VO Class는 데이터를 담을 private 멤버 변수들과 해당 변수들을 조작하는 getter/setter 메서드들로 구성된다. 이 클래스는 일반적으로 데이터베이스와 연결된 DAO(Data Access Object) 클래스에서 사용된다.
VO Class는 Eclipse에서 자동으로 생성할 수 있다.
class PersonVO {
private String name;
private int grade;
private double score;
// 1. 오른쪽 클릭 > Source > Generate Constructor using Fields
// 초기화할 변수, 삽입 위치, public 선택 > 자동으로 생성자 생성
public PersonVO(String name, int grade, double score) {
super();
this.name = name;
this.grade = grade;
this.score = score;
}
// To be Continue
우선 VO Class에서 사용할 인스턴스 변수를 private으로 정의한다.
그 후 오른쪽 클릭 > Source > Generate constructor using Fields를 클릭하여 생성자에서 초기화할 변수, 메서드 삽입 위치 그리고 접근 제한자 등을 선택하면 자동으로 생성자를 만들어 준다.
다음으로 오른쪽 클릭 > Source > Generate getter and setter를 클릭해서 메서드를 만들어 줄 변수, 메서드 삽입 위치, 접근 제한자 등을 선택하면 private 멤버 변수를 조작할 get method와 set method도 자동으로 만들어준다. get method에서는 값을 반환받고, set method에서는 값을 설정한다.
class PersonVO {
private String name;
private int grade;
private double score;
// 1. 오른쪽 클릭 > Source > Generate Constructor using Fields
// 초기화할 변수, 삽입 위치, public 선택 > 자동으로 생성자 생성
public PersonVO(String name, int grade, double score) {
super();
this.name = name;
this.grade = grade;
this.score = score;
}
// 2. 오른쪽 클릭 > Source > Generate getter and setter
// get, set method를 만들 변수, 삽입 위치, public 선택 > 자동으로 getter, setter 생성
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
// To be continue
그런데 여기까지 작성한 후 다음 코드를 실행하면 package, className과 메모리 주소가 출력된다.
PersonVO p1 = new PersonVO("hanus", 2, 98);
System.out.println(p1); // package.className@address
내용을 출력하려면 toString() 메서드를 추가해 주어야 한다.
class PersonVO {
private String name;
private int grade;
private double score;
// 1. 오른쪽 클릭 > Source > Generate Constructor using Fields
// 초기화할 변수, 삽입 위치, public 선택 > 자동으로 생성자 생성
public PersonVO(String name, int grade, double score) {
super();
this.name = name;
this.grade = grade;
this.score = score;
}
// 2. 오른쪽 클릭 > Source > Generate getter and setter
// get, set method를 만들 변수, 삽입 위치, public 선택 > 자동으로 getter, setter 생성
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
// 3. 오른쪽 클릭 > Source > Generate toString()
// field, 삽입 위치 선택 > 자동으로 toString method 생성
public String toString() {
return "PersonVO name=" + name + ", grade=" + grade + ", score=" + score;
}
}
오른쪽 클릭 > Source > Generate toString()을 추가하면 자동으로 내용이 출력된다.
위의 클래스에서 생성자는 set method이고 toString()은 get method이므로 결국 private 멤버 변수들과 해당 변수들을 조작하는 getter/setter 메서드들로만 구성되어 있음을 알 수 있다.
VO Class를 사용하는 이유는 데이터를 한곳에서 관리할 수 있고 객체를 전달하기 쉬워 코드의 가독성이 좋아지기 때문이지만, 보안상의 이유도 있다.
method의 구현 내용을 모르더라도, 이름과 파라미터 정보를 가진 악의적인 사용자가 Brute Force 방식으로 파라미터 값을 조작하면 보안상의 문제가 생길 수 있다. 이러한 Parameter Hacking을 막는데 VO Class가 사용된다.
public int checkID(int id, int password){} // 1번
public PersonVO checkID(PersonVO vo){} // 2번
1번 방식을 사용하는 대신 PersonVO의 private 멤버 변수로 id와 password를 선언해서 2번 방식을 사용한다면 PersonVO class의 구현 내용을 보지 않는 이상, 몇 개의 데이터가 어떤 타입으로 전달되는지에 대해 information hiding이 가능하다.
그런데 코드에서 생성자를 만들면 super()가 생기는 이유는 무엇인가? 상속이 된 것도 아닌데?
super는 상속 관계에서 sub class의 생성자가 호출되기 전에 super class의 생성자부터 호출하기 위해 사용되는 메서드이다. 모든 JAVA 클래스의 최상위 super 클래스가 Object이기 때문에 사실 클래스 뒤에 extends Object가 생략되어 있는 것이다.
내가 만들지 않아서 어떤 것이 super 클래스인지 모를 때, 어떤 클래스 타입이 전달되어도 전부 Object로 받을 수 있다. (Object obj = new AnyClass();)
추가로, toString() 메서드를 만들면 @Override가 생기는데 그 이유가 무엇인가?
@Override는 annotation으로 해당 메서드가 부모 클래스의 메서드를 오버라이드하고 있는지 컴파일러에게 알리는 역할을 한다. 이 annotation을 명시하면 자바 컴파일러가 오버라이드 된 메서드가 부모 클래스의 메서드가 일치하는지 확인하여 일치하지 않을 경우 compile error를 띄워주기 때문에 명시하는 것이 코드의 가독성과 유지보수성를 높이는데 좋다.
'JAVA' 카테고리의 다른 글
[JAVA] Chapter 16. Collection Framework (1) (0) | 2023.07.21 |
---|---|
[JAVA] Chapter 15. Wrapper Class (0) | 2023.07.20 |
[JAVA] Chapter 13. Exception Handling (0) | 2023.07.18 |
[JAVA] Chapter 12. Abstract & Interface (2) (0) | 2023.07.17 |
[JAVA] Chapter 12. Abstract & Interface (1) (0) | 2023.07.16 |
댓글