코딩 기록들
객체지향 프로그래밍 16. 인터페이스를 활용한 다형성 구현 본문
하나의 솔루션(소스)안에서 하나의 인터페이스를 사용하여 구현하는 방법
1. 인터페이스를 정의
2. 이걸 oracle, mysql, 다른db로 구현한 예를 replace될수있도록 구현하기

인터페이스를 활용한 dao 구현
- DB에 회원 정보를 넣는 dao(data access object)를 여러 DB 제품이 지원될 수 있게 구현함
- 환경파일(db.properties) 에서 database의 종류에 대한 정보를 읽고 그 정보에 맞게 dao 인스턴스를 생성하여 실행될 수 있게 함
source hierachy

package ch2_13.domain.userinfo.dao.mysql;
import ch2_13.domain.userinfo.UserInfo;
import ch2_13.domain.userinfo.dao.UserinfoDao;
public class UserInfoMySqlDao implements UserinfoDao {
@Override
public void insertUserInfo(UserInfo userInfo) {
System.out.println("Insert into MySQL DB userID = " + userInfo.getUserId());
}
@Override
public void updateUserInfo(UserInfo userInfo) {
System.out.println("Update into MySQL DB userID = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("Delete from MySQL DB userID = " + userInfo.getUserId());
}
}
package ch2_13.domain.userinfo.dao.oracle;
import ch2_13.domain.userinfo.UserInfo;
import ch2_13.domain.userinfo.dao.UserinfoDao;
//인터페이스!
public class UserInfoOracleDao implements UserinfoDao {
@Override
public void insertUserInfo(UserInfo userInfo) {
System.out.println("Insert into Oracle DB userID = " + userInfo.getUserId());
}
@Override
public void updateUserInfo(UserInfo userInfo) {
System.out.println("Update into Oracle DB userID = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("Delete from Oracle DB userID = " + userInfo.getUserId());
}
}
package ch2_13.domain.userinfo.dao;
import ch2_13.domain.userinfo.UserInfo;
//이 파일만 보고 다른 개발자들은 개발을 하게 됨
public interface UserinfoDao {
//유저에 대한 Db오퍼레이션할때 구현해야 하는 기능 선언
void insertUserInfo(UserInfo userInfo);
void updateUserInfo(UserInfo userInfo);
void deleteUserInfo(UserInfo userInfo);
}
package ch2_13.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;
}
}
package ch2_13.web.userinfo;
import ch2_13.domain.userinfo.UserInfo;
import ch2_13.domain.userinfo.dao.UserinfoDao;
import ch2_13.domain.userinfo.dao.mysql.UserInfoMySqlDao;
import ch2_13.domain.userinfo.dao.oracle.UserInfoOracleDao;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class UserinfoClient {
public static void main(String[] args) throws IOException {
//파일을 읽어들일때 db타입이 오라클이면 오라클버전으로~, mySQL이면 mySQL버전으로~
//읽을때 쓰는 방법
FileInputStream fis = new FileInputStream("db.properties");
Properties prop = new Properties(); //키-벨류 처럼(DBTYPE = MYSQL) 쌍으로 되어있는 것들을 쌍으로 읽어들일수 있는 기능이있는 객체
prop.load(fis);
String dbType = prop.getProperty("DBTYPE"); //이에 해당되는 value값을 반환해줌 ex)MYSQL
UserInfo userInfo = new UserInfo();
userInfo.setUserId("12345");
userInfo.setPassword("!@#$%");
userInfo.setUserName("!@#$%");
//변수선언시 UserinfoDao 인터페이스 타입으로 할것
UserinfoDao userInfoDao = null; //처음에는 멀쓸건지 안정해져있으므로
if( dbType.equals("ORACLE")) {
userInfoDao = new UserInfoOracleDao();
}
else if(dbType.equals("MYSQL")){
userInfoDao = new UserInfoMySqlDao();
}
else{
System.out.println("db error");
return;
}
//불러오기
userInfoDao.insertUserInfo(userInfo);
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
}
}
//db.properties (file로 같은 패키지 안에 생성)
DBTYPE = MYSQL
//여기서 value값을 MYSQL, ORACLE로 바꾸면 됨