인터페이스를 활용한 다형성 구현(dao)

0

Java 공부

목록 보기
13/18

dao란

  • 데이터 사용기능 담당 클래스다.
  • DB 데이터 조회나 수정, 입력, 삭제와 같은 로직을 처리하기 위해 사용한다.
  • CRUD의 기능을 한다.

    CRUD

    컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말.

인터페이스를 활용한 dao 구현하기

소프트웨어를 개발하고 납품하는 회사에서 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;
	}
}
  • db를 구현할때 각 db에 맞게 구성하도록 구성
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);
}
  • mysql
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());
	}
}
  • 같은 방식으로 OracleDao도 작성
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값을 가지고 있는 파일을 페키지 밖에 생성 db.properties
    DBTYPE을 오라클이나 mysql로 변경하면 변경되도록 하는 목적을 가지고 있다.

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.properties에서 DBTYPE=ORACLE 일때
  • db.properties에서 DBTYPE=MYSQL 일때

결론

인터페이스를 활용한 다형성 구현을 하는 이유는!
각 다른 DB를 추가 또는 수정 해야한다면 통으로 또하나를 만들어 관리해야하는 효율성 문제가 생기고 만다.
이때 인터페이스를 활용한 다형성 구현 하여 추가되는 DB나 수정사항만 관리, 추가 하여 효율적인 관리를 할 수 있다.

0개의 댓글