Strategy Pattern
- 하나의 인터페이스를 여러 클래스가 구현하면 경우에 따라 다른 정책을 적용할 수 있다.
- 클라이언트 프로그램은 인터페이스의 메서드를 이용해서 여러 객체를 구현한다. (다형성)
인터페이스를 활용한 DAO(Data Access Object) 구현하기
- DAO가 Oracle, MySQL 등 DB에 따라 다르면 이중으로 코드를 관리해야 하고 오버헤드가 발생한다.
- 또 각 코드마다 다른 버그가 발생할 수 있으며 버그 패치를 하거나 기능을 업그레이드할 때 일일이 써주어야 한다. → 유지보수 어렵다.
- 서비스 혹은 솔루션을 하는 회사에서 버전 관리를 어떻게 할지도 굉장히 중요하다.
- 따라서 하나의 소스에서 해결 방안을 찾는 것이 좋다. → 인터페이스 활용하여 DB마다 다른 버전의 DAO를 둔다
- DAO 부분만 조건에 따라 수행되고 나머지 코드는 같다.
Source hierarchy
: package를 이용해서 소스의 계층구조를 생성할 수 있다. → 관리에 용이
UserInfo.java
package ch13.domain.userinfo;
public class UserInfo { // 사용자 정보 클래스
private String userId;
private String password;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
UserInfoDao.java
package ch13.domain.userinfo.dao;
import ch13.domain.userinfo.UserInfo;
public interface UserInfoDao { // DAO에서 제공되어야 할 메서드를 선언한 인터페이스
void insertUserInfo(UserInfo userInfo);
void updateUserInfo(UserInfo userInfo);
void deleteUserInfo(UserInfo userInfo);
}
UserInfoMySqlDao.java
Oracle DAO도 같은 방식으로 작성해주면 된다. (출력문만 다름)
package ch13.domain.userinfo.dao.mysql;
import ch13.domain.userinfo.UserInfo;
import ch13.domain.userinfo.dao.UserInfoDao;
public class UserInfoMySqlDao implements UserInfoDao{
@Override
public void insertUserInfo(UserInfo userInfo) {
System.out.println("insert into MySQL DB user ID = " + userInfo.getUserId());
}
@Override
public void updateUserInfo(UserInfo userInfo) {
System.out.println("update MySQL DB user ID = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("delete from MySQL DB user ID = " + userInfo.getUserId());
}
}
UserInfoClient.java
db.properties 파일을 읽어들여 DB 타입을 읽고 조건에 따라 다른 DAO 객체를 생성한다.
package ch13.web.userinfo;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import ch13.domain.userinfo.UserInfo;
import ch13.domain.userinfo.dao.UserInfoDao;
import ch13.domain.userinfo.dao.mysql.UserInfoMySqlDao;
import ch13.domain.userinfo.dao.oracle.UserInfoOracleDao;
public class UserInfoClient {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("db.properties"); // 파일 읽어들이는 객체 생성
Properties prop = new Properties(); // 쌍(KEY-VALUE)으로 읽어들일 수 있는 객체
prop.load(fis);
String dbType = prop.getProperty("DBTYPE"); // Key값 입력하면 Value값 반환
UserInfo userInfo = new UserInfo(); // 새로운 유저 생성
userInfo.setUserId("12345");
userInfo.setPassword("****");
userInfo.setUserName("Lee");
UserInfoDao userInfoDao = null; // 인터페이스 형 변수 초기화
if( dbType.equals("ORACLE") ) { // 조건에 따라 다른 DAO 객체 생성
userInfoDao = new UserInfoOracleDao();
}
else if ( dbType.equals("MYSQL") ) {
userInfoDao = new UserInfoMySqlDao();
}
else {
System.out.println("DB Error");
}
userInfoDao.insertUserInfo(userInfo); // DAO 객체에 따라 다른 메서드 수행 (다형성)
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
}
}
수행 결과
- db.properties MYSQL일 경우
DBTYPE=MYSQL
insert into MySQL DB userid = 12345
update MySQL DB userid = 12345
delete from MySQL DB userid = 12345
- db.properties ORACLE일 경우
DBTYPE=MYSQL
insert into Oracle DB userid = 12345
update Oracle DB userid = 12345
delete from Oracle DB userid = 12345
'Java & Kotlin' 카테고리의 다른 글
[Java 객체지향] 인터페이스의 요소 (0) | 2022.02.01 |
---|---|
[Java 객체지향] 인터페이스 (0) | 2022.02.01 |
[Java 객체지향] 추상 클래스 활용 (템플릿 메서드 패턴) (0) | 2022.02.01 |