SPRING/Spring Basic

[스프링] 관심사의 분리 ( 클래스의 분리 )

IT록흐 2021. 7. 22. 16:33
반응형
 

[ 스프링 ] 관심사의 확장 ( 추상클래스 )

[ 스프링 ] 관심사의 분리 ( DAO ) 스프링 프레임워크를 사용하기 위한 기본 개념을 하나씩 정리해볼까 한다. ▷ 분리와 확장 분리와 확장을 고려한 설계는 미래를 대비한다. 프로그램을 만들 때는

lordofkangs.tistory.com

 

 

지난 포스팅에서 추상클래스를 이용하여 관심사를 확장시켰다. 그러나 상속이라는 특성상 자식클래스는 부모클래스의 1가지 관심사만 상속할 수 없다. 확장성을 고려하여 추상클래스를 사용했지만 완벽한 분리가 이루어지지 않은 것이다.

 

그래서 이번에는 완벽한 분리를 위해,

하나의 관심사를 다른 클래스로 '분리'시킬 것이다.

 

 

추상클래스 코드

 

public abstract class UserDao {
	
	public abstract Connection getConnection(); // 추상 메소드
	
	public int add(User user) throws SQLException {
    
			Connection c = getConnection();
			//생략....
	}
	
	public User get(String UserId) throws SQLException {
		
			Connection c = getConnection();
			//생략....
	}

}

 

 

UserDao 추상클래스 안에 확장을 원하는 메소드를 추상메소드로 선언하였다. 그러나 상속은 단점이 있으므로 추상메소드의 관심사를 또 다른 클래스로 독립시킬 것이다. 

 

SimpleConnectionMaker 클래스

 

public class SimpleConnectionMaker {

	public Connection makeNewConnection() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			
			String url = "jdbc:mysql://localhost:3306/SpringProject";
			String id = "root";
			String pw = "11111";
			
			Connection c = DriverManager.getConnection(url, id, pw);
			System.out.println("커넥션 접근 객체 생성");
			return c;
			
		} catch (ClassNotFoundException e) {
			System.out.println("클래스 발견 못함");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패");
		}
		return null;
	}
	
}

 

 

이와 같이, 커넥션 객체를 생성하는 클래스를 새로 생성한다. 이제부터, DB 커넥션을 생성할 클래스는 SimpleConnectionMaker 클래스와 관계를 설정해야만 가능하다. 관계 설정이란, 한 클래스가 다른 클래스를 '인터페이스 없이' 직접 사용한다는 뜻이다. 

 

아래 코드는 UserDao 클래스가 DB에 레코드를 삽입하고 추출할 때 필요한 DB 커넥션 객체를 생성하기 위해, 생성자로 SimpleConnectionMaker 클래스와 관계를 설정하는 코드를 보여준다.

 

 

UserDao 클래스

 

public class UserDao {
	
	SimpleConnectionMaker simpleConnectionMaker = null;  // 커넥션 객체 생성 클래스
	
	public UserDao(SimpleConnectionMaker simpleConnectionMaker) {
		this.simpleConnectionMaker = simpleConnectionMaker; // 관계 설정 : 커넥션 객체 주입
	}
	
	public int add(User user) throws SQLException {
			
			Connection c = simpleConnectionMaker.makeNewConnection(); // 커넥션 객체 생성 메소드 호출
			// 생략....
	}
	
	public User get(String UserId) throws SQLException {
			
			Connection c = simpleConnectionMaker.makeNewConnection();
			// 생략....
    }
}

 

 

이와 같이, 관심사를 클래스로 분리하여 변화에 대응하는 코드를 만들어 보았다. 그러나 아직 완벽하지 않다. 이전 포스팅에서 말했듯, DB는 다양한 DBMS를 갖는다. 그러므로 한 가지에만 '종속'되면 안 된다. 만약 위에 코드처럼, 직접 한 가지 클래스와 관계를 설정해버리면 서로 '종속'되어버려 확장성을 잃게된다. 이는 유지보수성에 좋은 영향을 주지 못한다. 

 

다음 포스팅에서는 관심사를 클래스로 분리하면서 확장성까지 고려할 수 있는 방법에 대해서 포스팅하겠다.

 

 

 

 

반응형