Java 프레임워크 만들기 - JSP

자바 어노테이션으로 데이터 액세스 객체 만들기 1 - Java Annotation DAO(Data Access Object), 이클립스(Eclipse)

carrotweb 2021. 6. 2. 10:42
728x90
반응형

마리아디비(MariaDB) 설치와 JDBC 드라이버로 데이터베이스 연결해주는 매니저를 구성했으니 데이터베이스와 연동하여 쿼리를 처리하는 DAO(Data Access Object) 클래스를 생성하겠습니다.

이전 시큐리티 필터(TestSecurityFilter.java)에서 인증처리하기 위해서 로그인 서비스(TestLoginService.java)통해 사용자의 아이디와 패스워드를 하드코딩으로 검증하였습니다.

if ("testid".equals(id) && "testpwd".equals(password)) {
}

이 부분을 데이터베이스를 통해 처리되도록 DAO(Data Access Object) 클래스를 생성하고 서비스 클래스에 의존성 주입(DI)을 하여 처리되도록 하겠습니다.

1. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.home.project.test2"를 선택한 후 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Package]를 클릭하여 "Name"의 기존 패키지명에 ".dao"를 추가하고 "Finish"버튼을 클릭합니다. 추가된 "com.hom.project.test2.dao"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Interface]를 클릭하여 "ITestLoginDao.java"를 생성합니다.

 

"selectMember"메소드는 사용자 아이디로 데이터베이스의 사용자 계정 테이블(MBR_ACCOUNT_TB)에서 조회하여 사용자 객체를 리턴합니다.

/**
 * 사용자를 조회합니다.
 * @param userVO 사용자 객체
 * @return 검색된 사용자 객체
 */
public abstract UserVO selectMember(UserVO userVO);

 

2. "UserVO.java"에 필드에 사용자 패스워크와 패스워드 솔트(암호화 키)를 추가하고 "Getter/Setter"메서드를 추가합니다.

/**
 * 사용자 패스워드
 */
private String password = "";

/**
 * 사용자 패스워드 솔트
 */
private String passwordSalt = "";

/**
 * 사용자 패스워드를 가져옵니다.
 * @return 사용자 패스워드
 */
public String getPassword() {
	return password;
}

/**
 * 사용자 패스워드를 설정합니다.
 * @param password 사용자 패스워드
 */
public void setPassword(String password) {
	this.password = password;
}

/**
 * 사용자 패스워드 솔트를 가져옵니다.
 * @return 사용자 패스워드 솔트
 */
public String getPasswordSalt() {
	return passwordSalt;
}

/**
 * 사용자 패스워드 솔트를 설정합니다.
 * @param passwordSalt 사용자 패스워드 솔트
 */
public void setPasswordSalt(String passwordSalt) {
	this.passwordSalt = passwordSalt;
}

패스워드 솔트(암호화 키)는 패스워드 암호화할때 사용할 겁니다. 지금은 사용하지 않습니다.

 

3. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.dao"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Class]를 클릭합니다.

이전에는 클래스를 만든 후에 인터페이스를 적용을 하였습니다. 이번에는 순서있게 인터페이스를 만들고 구현체 클래스를 만들고 있기 때문에 클래스 생성할때 인터페이스를 적용하도록 하겠습니다.

"New Java Class"창의 "Name"에 "TestLoginDaoImpl"를 입력합니다.

클래스명 뒤에 "Impl"를 붙인 이유는 인터페이스(Interface)를 구현(implement)한 클래스임을 나타내기 위해서입니다.

인터페이스(Interface)를 구현(implement)하기 위해 "Interfaces:"의 "Add..."버튼을 클릭합니다.

"Implemented Interfaces Selection"창이 나타납니다.

"Choose interfaces:"에 위에서 생성한 인터페이스인 "ITestLoginDao"를 입력하면 매칭되는 인터페이스가 나타납니다. (인터페이스 클래스명을 다 입력하지 않아도 나타납니다.) "OK"버튼을 클릭합니다.

"Interfaces:"에 추가됩니다. "Finish"버튼을 클릭합니다.

 

"TestLoginDaoImpl.java"가 인터페이스 메소드들을 자동으로 오버라이드(Override)되어 생성됩니다.

 

DAO(Data Access Object) 클래스에 의존성 주입(Dependency Injection)을 위해 클래스 맴버 필드와 인터페이스(interface)로 구현된 클래스에 어노테이션(Annotation)를 생성하여 적용합니다.

인터페이스(interface)로 구현(implements)된 DAO(Data Access Object) 클래스를 찾아 인스턴스를 생성하고 클래스 맴버 필드에 데이터베이스를 외부 주입하기 위해 어노테이션(Annotation)을 생성합니다.

 

 

4. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭하여 "New Annotation Type"창에서 "Name"에 "TestAnnRepository"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Type"를 선택하고 "Finish"버튼을 클릭합니다.

"@TestAnnRepository"어노테이션은 "ServletContextListener"에서 스캔되고 인스턴스를 생성하기 위해서 사용됩니다.

5. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭하여 "New Annotation Type"창에서 "Name"에 "TestAnnQualifier"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Field"를 선택하고 "Finish"버튼을 클릭합니다.

데이터베이스 아이디와 연결하기 위해 문자열인 "value"를 추가합니다. 기본값으로 ""(공백)를 설정합니다.

public String value() default "";

"@Qualifier"어노테이션은 "ServletContextListener"에서 데이터베이스를 외부 주입하기 위해 데이터베이스 아이디를 찾기 위해서 사용됩니다.

6. "TestLoginDaoImpl.java"클래스 위에 "@TestAnnRepository"어노테이션을 추가가합니다.

@TestAnnRepository
public class TestLoginDaoImpl implements ITestLoginDao {

"TestDatabaseManager" 클래스 맴버 필드를 추가하고 "@TestAnnAutowired"어노테이션을 추가합니다.

@TestAnnAutowired
@TestAnnQualifier("databaseMaria")
private TestDatabaseManager testDatabaseManager;

 

사용자 계정 테이블(MBR_ACCOUNT_TB)에서 사용자 아이디로 조회하기 위해서 쿼리(Query)문을 생성하고 데이터베이스 매니저의 "executeQuery"메소드를 통해 쿼리문을 실행하여 결과값을 "UserVO"객체에 담아 리턴하게 합니다.

@Override
public UserVO selectMember(UserVO userVO) {
	UserVO selectUserVO = null;

	if (userVO != null) {
		String query = "SELECT MBR_ID, MBR_PWD, MBR_PWD_SALT, MBR_NM FROM MBR_ACCOUNT_TB WHERE MBR_ID = '" + userVO.getId() + "'";
		ResultSet resultSet = testDatabaseManager.executeQuery(query);
		try {
			if (resultSet.next()) {
				selectUserVO = new UserVO();
				String memberID = resultSet.getString("MBR_ID");
				String memberPassword = resultSet.getString("MBR_PWD");
				String memberPasswordSalt = resultSet.getString("MBR_PWD_SALT");
				String memberName = resultSet.getString("MBR_NM");
				selectUserVO.setId(memberID);
				selectUserVO.setPassword(memberPassword);
				selectUserVO.setPasswordSalt(memberPasswordSalt);
				selectUserVO.setName(memberName);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	return selectUserVO;
}

 

이어서 DAO(Data Access Object) 클래스를 사용을 위해 기존의 서비스(Service) 클래스인 "TestLoginService.java"를 수정하고 로그인 요청(Request) URL를 처리하는 컨트롤러(Controller) 클래스를 생성하겠습니다.

728x90
반응형