본문 바로가기
DB (DataBase) (국비)/DB 메모

용이한 유지보수 및 편의성을 위해 만든 VO의 멤버변수 개념

by Hwanii_ 2023. 6. 12.
728x90

 

1.

DB의 테이블 내부에는 없는 칼럼명 인데,

코드 작성시 편의성을 위해서 JAVA에서 어떠한 VO 클래스 내부에 멤버변수를 만들 수 있다.

 

2. 

기존에 기능을 구현할 때,

VO의 사용하지 않는 인자에 어떠한 조건값을 넣어서 (SearchCondition),

== KeyWord

Controller가 Model 에게 VO 객체를 보내서 Model이 기능을 실행하도록 했었다.

 

하지만, 만약에, 프로그램의 기능이 많으면 어떻게 될까 ?

VO 객체의 사용 가능한 인자의 수가 제한적이기 때문에,

기능 구현이 어렵게 될 수도 있다.

뿐만아니라, 어떤 인자가 비어있는지를 파악하기도 어려울 수 있게 될것이다.

== 가독성이 떨어져 코드의 의도를 파악하기 어려움.

 

3.

따라서,

VO 클래스에 SearchCondition 등으로

사용할 의도가 확실하게 파악될 수 있는 이름으로

멤버변수를 새롭게 선언 하여 위의 문제점을 해결할 수 있게 된다.

 

4.

이렇게 새롭게 편의성과 유지보수 및 높은 가독성을 위해 만든 VO의 멤버변수는

단지 인자 전달 목적으로 사용되기 때문에, VO 객체와 무관한 상황이다.

그래서, 멤버변수를 선언하더라도 생성자에서 초기화를 해줄 필요가 없는게 특징이다.

 

5.

VO 클래스 안에서 멤버변수에 private 접근 제어자를 붙혀놓는다면,

외부에서 이 멤버변수에 접근을 할 수 있도록 getter와 setter만 만들어서 사용 하면 된다.

 

6.

위와 같이 VO 클래스에 멤버변수, getter, setter을 만들었다면,

Controller에서 해당 멤버변수를 이용해 코드를 작성해 활용하면 된다.

 

7.

추가로,

View나 Model의 DAO에서는 이 멤버변수의 존재를 알필요가 없다.

그냥, 오로지 개발의 편의성을 위해서 VO 클래스에 멤버변수를 만들고,

Controller 에서만 사용하기 때문이다.

 

예시)

 

1.

Client가 비밀번호를 변경하고 싶은 상황.

 

2.

View는 Client 에게 새롭게 변경할 비밀번호를 받는다.

 

3.

View는 그 값을 Controller 에게 넘겨준다.

 

4.

Controller는 VO 객체의 인자에 비밀번호 정보를 담아서,묶음으로 M의 update() 메서드로 보낸다.

 

5.

이때,VO 객체의 인자가 2개짜리이고,

M의 update() 메서드가 2가지 이상의 기능을 수행 해야 한다고 가정해보자.

 

비밀번호를 변경하기 위해서, VO 객체의 인자에 필수적으로 들어가야하는 값은

 

1) 회원의 아이디에 대한 정보 (로그인한 아이디와 동일한지 확인해야하므로)

2) 새로 바꿀 비밀번호에 대한 정보

 

이다.

 

VO 객체의 인자가 2개짜리이고,

update() 메서드는 2개 이상의 기능을 수행 해야 해서

SearchCondition으로 구분이 되어야 하는 상황인데,

비밀번호 변경 기능을 수행하도록 하려면 반드시 KeyWord가 필요한 상황인 것이다.

 

이럴때, VO 클래스에 새로운 멤버변수를 선언한다.

 

private String changePW;  식으로 선언을 한다.

그리고, getter와 setter을 만든다.

 

다시 Controller로 와서,

VO.setChangePW("비번변경"); 과 같이 changePW 멤버변수에 값을 새롭게 set 해준다.

 

이렇게 되면, KeyWord 세팅이 되어버린것이다.

 

M의 update() 메서드로 가서,

 

if(VO.getChangePW().equals("비번변경")) {   

...

}

식으로 기능 구분을 하는 로직을 구현하면 된다.

 

[ 이클립스에서 구현 ]

 

 

파란색 네모칸은 기존에 있었던 VO의 멤버변수,빨간색 네모칸은 편의성을 위해 만든 VO 멤버변수 이다.

 

 

기존 멤버변수에 대해서는, 생성자가 존재하는것을 확인 할 수 있다.

 

뭔지는 몰라도,

인자 3개짜리랑 2개짜리 생성자가 오버로딩 되어있는것을 확인할 수 있다.

 

하지만, 새로만든 멤버변수에 대해서는 위에 말했듯이,생성자로 초기화를 하지 않는다.

 

객체와 무관한 상황이기 때문이다.

 

 

새로 만든 멤버변수 들에 접근제어자 private를 붙혀줬기 때문에,

위와같이 getter와 setter을 만들어,

외부에서 해당 멤버변수들에 접근할 수 있도록 한다.

 

 

위의 코드는 Controller 코드 이다.

사용자로부터 변경할 비밀번호를 받고,

그 정보를 MemberVO 타입의 mVO 객체의 인자로 넣는 모습을 확인 할 수 있다.

 

현재 두개짜리 인자인것으로 객체를 만든 모습을 볼 수 있고,

 

활용할 수 있는 인자가 부족하기 때문에,

 

mVO.setTmpString("비번변경"); 코드를 작성해서,

 

새롭게 만든 tmpString 멤버변수에 값을 새롭게 set 해주는 모습을 확인 할 수 있다.

 

 

위의 코드는 MemberDAO의 코드 이다.

 

update() 메서드 내부를 확인하면,

if-else if문으로 구성되어있는 모습을 볼 수 있다.

 

KeyWord로 사용된 인자를 확인하여, 어떤 기능을 수행할건지를 식별하게 해주는 모습이다.

 

[ 주의할점 ] 

 

만약의 위의 코드를 아래와 같이 작성했다고 해보자.

 

기능이 2개니까, 그냥,

 

if(mVO.getTmpString().equals("비번변경")) {

...

}

else {

...

}

 

이렇게 코드가 짜여있으면,

 

아래의 else문을 보면

어 ?

if(mVO.getTmpString().equals("비번변경")) 가 아닌 경우야 ?

그러면 다 else로 가서 else 블럭 안의 기능이 실행 되겠구나 !

라고 생각해서

 

Controller 에서 

 

참조변수 (VO 객체).setTmpString("키워드명"); 코드를 작성하지 않으면,

 

 

이렇게 NPE 가 뜨게 된다.

 

왜그럴까 ?

 

바로 키워드로 사용하려고 새로 만든 멤버변수가 따로 초기화 된게 없기 때문이다.

 

생성자로 초기화 시켜놓는것도 아니고,

 

엥 그러면 어떻게 값을 넣어줘 ?

 

setter을 이용해서 값을 대입해주는 것이다.

 

여기서는 MemberVO 타입의 객체를 가리키는 참조변수가 member 라서 member.setTmpString("키워드 명") 을 하는 모습.

 

그래서, 이 에러를 방지하기 위해서, DAO의 update() 메서드에 위와 같이 

각 기능마다 키워드가 있는 모습을 확인할 수 있다.

 

++

 

혹시라도 위의 NPE 개념이 다르면 수정 하겠음 !

 

 

반응형

'DB (DataBase) (국비) > DB 메모' 카테고리의 다른 글

Oracle 로 DBMS 변경 하기  (0) 2023.08.05
PreparedStatement (향상된 Statement)  (1) 2023.06.13
JDBC 필수 요소 4가지  (0) 2023.06.11
수업 메모  (2) 2023.06.10
next() 메서드  (0) 2023.06.09