CRUD
컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말.
소프트웨어를 개발하고 납품하는 회사에서 oracle은 사용 못 하고 mysql로 해주세요 요청하면 그 코드를 전부 mysql로 바꿔야 하는 현상이 일어난다. 그렇게 되면 코드를 2중으로 관리해야 한다. 하나는 oracle, 하나는 mysql로 관리해야 하는 비효율적인 방법으로 진행되게 된다. 만약 db가 2개가 아니라 여러 개를 사용한다면 더욱 비효율적으로 변해 버그 패치라던가 업데이트가 있으면 하나하나 일일이 전부 수정해 줘야하기 때문이다.
이때 사용할 수 있는 것이 인터페이스를 활용한 dao 구현이다.
인터페이스 dao를 만들어두고 implements 를 사용해 하위dao만 연결해 주면 되는것이다.
계층구조 만들어보기
사용자 정보 클래스
package basics13.domain.userinfo;
public class UserInfo {
private String userId;
private String passworld;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassworld() {
return passworld;
}
public void setPassworld(String passworld) {
this.passworld = passworld;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package basics13.domain.userinfo.dao;
import basics13.domain.userinfo.UserInfo;
public interface UserInfoDao {
void insertUserInfo(UserInfo userInfo);
void updateUserInfo(UserInfo userInfo);
void deleteUserInfo(UserInfo userInfo);
}
package basics13.domain.userinfo.dao.mysql;
import basics13.domain.userinfo.UserInfo;
import basics13.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 basics13.domain.userinfo.dao.oracle;
import basics13.domain.userinfo.UserInfo;
import basics13.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());
}
}
db.properties
DBTYPE=ORACLE
package basics13.web.userinfo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import basics13.domain.userinfo.UserInfo;
import basics13.domain.userinfo.dao.UserInfoDao;
import basics13.domain.userinfo.dao.mysql.UserInfoMySqlDao;
import basics13.domain.userinfo.dao.oracle.UserInfoOracleDao;
public class UserInfoClient {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("db.properties"); // db.properties 생성한 파일 읽기.
Properties prop = new Properties(); // 쌍으로 읽는 Properties => key-value 요소 읽음.
prop.load(fis); // fis를 읽고
String dbType = prop.getProperty("DBTYPE"); // db.properties에서 DBTYPE의 해당하는 value값 반환.
// 가상으로 테스트용 유저생성
UserInfo userInfo = new UserInfo();
userInfo.setUserId("123456");
userInfo.setPassworld("1111");
userInfo.setUserName("KIM");
UserInfoDao userInfoDao = null; // Dao 설정 미정상태로 시작.
if (dbType.equals("ORACLE")) {
userInfoDao = new UserInfoOracleDao(); // 만약 dbType이 ORACLE이면 new UserInfoOracleDao() 하고,
} else if (dbType.equals("MYSQL")) {
userInfoDao = new UserInfoMySqlDao(); // 또는 dbType이 MYSQL이면 new UserInfoMySqlDao() 하고,
} else {
System.out.println("db error"); // 2개만 지원하는 프로그램으로 둘중에 하나도 아니라면 에러표시
return;
}
userInfoDao.insertUserInfo(userInfo);
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
}
}
인터페이스를 활용한 다형성 구현을 하는 이유는!
각 다른 DB를 추가 또는 수정 해야한다면 통으로 또하나를 만들어 관리해야하는 효율성 문제가 생기고 만다.
이때 인터페이스를 활용한 다형성 구현 하여 추가되는 DB나 수정사항만 관리, 추가 하여 효율적인 관리를 할 수 있다.