[Java 객체지향] 인터페이스 활용 (DAO 구현 해보기)

2022. 2. 1. 17:50·Java & Kotlin

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
'Java & Kotlin' 카테고리의 다른 글
  • [Java 객체지향] 여러 개의 인터페이스 구현, 인터페이스 간 상속
  • [Java 객체지향] 인터페이스의 요소
  • [Java 객체지향] 인터페이스
  • [Java 객체지향] 추상 클래스 활용 (템플릿 메서드 패턴)
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 객체지향] 인터페이스 활용 (DAO 구현 해보기)
상단으로

티스토리툴바