코딩 기록들

객체지향 프로그래밍 16. 인터페이스를 활용한 다형성 구현 본문

카테고리 없음

객체지향 프로그래밍 16. 인터페이스를 활용한 다형성 구현

코딩펭귄 2023. 12. 17. 02:01

하나의 솔루션(소스)안에서 하나의 인터페이스를 사용하여 구현하는 방법

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로 바꾸면 됨