[JDBC] 회원관리 Program STEP2

jy9922·2022년 7월 22일
0

Java

목록 보기
11/13
post-thumbnail

✔ 회원관리 Program STEP2

Refactoring → method extraction 기법을 이용해서 우리 코드를 재구성 해보아요!💛

  • 유지보수성이 높은 코드로 작성시킨다.
private Connection getConnection() throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.cj.jdbc.Driver");
		String jdbc_url = "jdbc:mysql://localhost:3306/sqldb?charEncoding=UTF-8&serverTimezone=UTC&userSSL=false";
		Connection con = DriverManager.getConnection(jdbc_url,"root","test1234");
		return con;
	}
	public void insert(User user) throws ClassNotFoundException, SQLException {
		// try - catch를 사용하지 않아요! (다른 곳에서 에러 처리)
		Connection con = getConnection();
        ...(생략)...

재사용성이 있는 Class인가요? 🤷‍♀️

  • 우리가 만든 DAO를 Naver, Kakao에 판매한다는 가정을 해본다.
  • 우리가 만든 DAO는 데이터베이스와 연결방식이 고정되어 있다.
  • 하지만 naver와 kakao 입장에선 나름대로의 데이터베이스와 연결방식을 이용할 것이다.

그럼 해결방법은 무엇이 있을까?

  1. 소스코드 제공 ( 거의 발생하지 않음 )
  2. 상속을 이용해서 해결
    → 변경이 필요한 부분만 추상 메소드로 만든다.

상속을 이용한 해결코드 (클래스의 확장)

/* 재사용성을 위해 추상 메서드 활용 */
/* UserDAO.java */
public abstract class UserDAO {
	protected abstract Connection getConnection() throws ClassNotFoundException, SQLException;
    ... 고급 소스 코드 (생략) ...
package lecture0722.step2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// naver쪽 개발자가 해당 UserDAO를 이용하기 위해
// subclass를 작성
public class NUserDAO extends UserDAO{
	@Override
	protected Connection getConnection() throws ClassNotFoundException, SQLException {
		// naver 나름대로의 connection 연결방법에 대한 구현이 나오면 된다.
		Class.forName("com.mysql.cj.jdbc.Driver");
		String jdbc_url = "jdbc:mysql://localhost:3306/sqldb?charEncoding=UTF-8&serverTimezone=UTC&userSSL=false";
		Connection con = DriverManager.getConnection(jdbc_url,"root","test1234");
		return con;
	}
}
/* Main.java */
public class Main {
	public static void main(String[] args) throws ClassNotFoundException, SQLException{
		// Service없이 main에서 직접 로직처리를 해보아요!
        // Naver 입장에서의 Main
		UserDAO dao = new NUserDAO();
		User user = new User();
		user.setId("1");
		user.setName("홍길동");
		user.setPassword("1234");
		
		dao.insert(user);
		
		System.out.println("새로운 사용자 등록");
		User user2 = dao.select("1");
		System.out.println(user2.getName()+" "+user2.getPassword());;
	}
}
  • 위 코드를 보면 상위 class (UserDAO)에 기본적인 logic의 흐름이 구현되어 있고
  • 이 안에 protected method, abstract method가 있다.
  • 하위 class (NUserDAO)에서 추상 메서드를 오버라이딩해서 하위 class에 맞도록 기능을 완성시키고 있다.
  • 이를 design pattern에서 Template method pattern이라고 한다.

Template Method Pattern 🐾

  • class를 상속해서 확장하는 가장 기본적인 방식이다.
  • 변경되지 않는 기능(logic)은 상위 class, 변경되어야 하는 부분은 하위 class에서 구현되어야 한다.

조금 다른 관점에서 살펴보면..

  • UserDAO에는 getConnection 이라는 추상 메서드가 있다.

그렇다면 객체 관점에서 이를 살펴보자~

  • 객체를 실제로 만들어 내는 것은 하위 class에서 만들고 있다.
  • NUserDAO에서 구체적으로 객체를 어떻게 생성할 것인지를 기술하고 있다.
  • 하위 클래스에서 객체의 구체적인 생성 방법을 결정해서 사용하는 디자인 패턴을 factory method pattern이라고 한다.

🙆‍♀️ 즉, 위의 코드는 Template Method Pattern과 Factory Method Pattern을 가지고 있다!


STEP3으로 넘어가기 전에..

객체를 재사용한다는 측면에서 좋은데 상속은 제한이 발생할 수 있다.
클래스가 강하게 결집( tightly coupled )되어 있기 때문에 문제가 생길 여지가 있다.
따라서 상속으로 인한 재사용성은 양날의 검을 가지고 있다.

상속은 나름대로의 제약이 있기 때문에 다른 방식으로 구현해보자!

0개의 댓글