| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- GIT
- #javaStudy
- Interface
- 메가바이트스쿨
- 개발자취업부트캠프
- View
- Sts
- MegabyteSchool
- 내일배움카드
- MVC 패턴
- Spring
- github
- 클래스 class
- MVC
- 패스트캠퍼스
- Algorism study
- tomcat
- spring boot
- Java
- group study
- Entity
- AWS
- side project
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- 클래스 상속
- 국비지원교육
- array
- 게시판 리뷰 만들기
- 게시판 만들기
- crud
- Today
- Total
tuter77
Java : 다형성 구현(DAO) 본문
● 인터페이스를 활용한 다형성 구현(DAO)
▷ 인터페이스와 다형성
- 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있다.(다형성)
▷인터페이스를 활용한 다형성 구현(DAO) - 실습.
- db에 회원 정보를 넣는 dao(data access object)를 여러 db 제품이 지원될 수 있게 구현한다.
- 환경 파일(db.properties)에서 database의 종류에 대한 정보를 읽고 그 정보에 맞게 dao인스턴스를 생성하여 실행 될 수 있게 한다.
- source hierachy

- 먼저 userInfoDao 클래스를 정의한다.
여기에서는 각 dao에 필요한 정보들을 미리 정의한다.
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;
}
}
유저가 가입하게 되면 필요한 기본적인 사항인 id, 패스워드, 이름 이렇게 세가지 변수를 private로 정의하고 get,set메서드를 생성한다.
다음으로 UserInfo 인터페이스를 생성해서 각 db에 따른 dao에서 구현해야 할 것들을 정의한다.
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);
}
삽입, 갱신, 삭제 기능만 객체를 매개변수로 받게끔 정의해놓는다.
- 각 db dao
dao는 db종류에 따라 각각 만들었다.
먼저 mysql 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 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());
}
}
implements를 통해 인터페이스를 상속받고 해당 메서드들을 구현한다.
각 메서드는 콘솔창에 어떤 기능이 어디 db의 것인지만 출력되게 표기해놓았다.
마찬가지로 oracledao도 똑같이 구현한다.
package ch13.domain.userinfo.dao.oracle;
import ch13.domain.userinfo.UserInfo;
import ch13.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("Insert into Oracle DB userId = " + userInfo.getUserId());
}
@Override
public void deleteUserInfo(UserInfo userInfo) {
System.out.println("Insert into Oracle DB userId = " + userInfo.getUserId());
}
}
이제 어떤 db를 사용중인지를 나타내는 환경설정 파일을 생성한다.(db.properties)

해당 파일 내에는 db가 어떤 타입인지만 알 수 있게 해놓는다.
다른 db를 사용하게 되면 이 부분만 바꾸면된다.
최종적으로 web패키지의 userinfo 패키지를 만들어 클라이언트의 요청이 수행되는 클래스를 만든다.
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(); //한 페어로 읽어들이는 객체
prop.load(fis);
String dbType = prop.getProperty("DBTYPE"); //해당되는 밸류를 반환
UserInfo userInfo =new UserInfo();
userInfo.setUserId("12345");
userInfo.setPassword("!@#@!$");
userInfo.setUserName("Lee");
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);
}
}
FileInpitStream 이라는 객체는 환경설정 파일값을 받아오는 객체이다.
Properties 객체는 해당 환경 변수 값들을 한쌍의 페어로 읽어들이는 객체이다.
때문에 prop객체에 load라는 메서드를 이용하여 환경변수값이 저장된 fis 객체를 읽어들인다.
이를 통해 db 타입이 어떤것인지 객체에 저장한다.
그 아래의 dbType이라는 변수를 생성해 getProperty메서드로 prop에 저장된 페어에 DBTYPE에 해당하는 값을 저장한다.
그 아래는 생성자를 통해 신규 유저를 생성한 모습이고, UserInfoDao 인터페이스 객체를 null 값으로 초기화한다.
이후 앞서 db 타입 값을 저장해놓은 dbType 값에 equal메서드를 사용하여 mysql과 db oracle을 비교하고 해당하는 dao에서 메서드를 가져오도록 한다.
맨 아래는 메서드를 실행하는 구문으로 db타입만 properties파일에서 바꿔주면 다른 메서드를 사용할 수 있게 된다.
다형성이 구현된 모습이다.
위 내용은 2023.01.12에 공부한 내용입니다.
'JavaStudy' 카테고리의 다른 글
| Java : 인터페이스(2) (0) | 2023.01.29 |
|---|---|
| Java : 인터페이스 요소, 상속 (0) | 2023.01.29 |
| Java : 예외 처리 (0) | 2023.01.29 |
| Java : 다운 캐스팅, instanceOf (0) | 2023.01.29 |
| Java : 상속(4) method overriding, 가상메서드, 다형성 (0) | 2023.01.29 |