Spring Framework

템플릿 메서드 패턴 & 콜백 패턴

coga 2024. 4. 8. 23:25

템플릿 메서드 패턴 (Template Method Pattern)
템플릿 메서드 패턴은 객체 지향 디자인 패턴으로, 알고리즘의 구조를 정의하고 중간 단계를 서브클래스에서 구현할 수 있도록 하는 패턴입니다. 알고리즘의 전체적인 구조는 부모 클래스에서 미리 정의되지만, 중간 단계의 구체적인 구현은 서브클래스에서 이루어집니다. 이를 통해 알고리즘의 구조와 개별 단계를 분리하여 코드의 재사용성과 유지보수성을 높일 수 있습니다.

구성 요소
Abstract Class (추상 클래스): 알고리즘의 뼈대를 정의하는 클래스로서, 추상 메서드와 일반 메서드를 포함합니다. 추상 메서드는 서브클래스에서 반드시 구현해야 합니다. 일반 메서드들은 템플릿 메서드에서 사용되며, 알고리즘의 구조를 정의합니다.
Concrete Class (구체 클래스): 추상 클래스를 상속받은 클래스로서, 추상 메서드를 구현하는 역할을 합니다. 이들은 템플릿 메서드에 의해 호출되어 알고리즘의 특정 단계를 구현합니다.
템플릿 메서드 패턴 예시

// Abstract Class
abstract class AbstractClass {
	public void templateMethod() {
    	step1(); step2(); step3();
    }
    
    public abstract void step1();
    public abstract void step2();
    public abstract void step3();
}

// Concrete Class
class ConcreteClass extends AbstractClass {
    @Override public void step1() {
    	System.out.println("Step 1");
    }
    
    @Override public void step2() {
    	System.out.println("Step 2");
    }
    
    @Override public void step3() {
    	System.out.println("Step 3");
    }
}


위의 예시에서 AbstractClass는 알고리즘의 뼈대를 정의하는 추상 클래스이며, templateMethod() 메서드는 알고리즘의 구조를 정의하고 중간 단계인 step1(), step2(), step3() 메서드를 호출합니다. ConcreteClass는 AbstractClass를 상속받은 구체 클래스로서, step1(), step2(), step3() 메서드를 구현합니다. 이들 메서드들은 템플릿 메서드에 의해 호출되어 전체 알고리즘을 완성합니다.

템플릿 메서드 패턴은 Spring의 JdbcTemplate에서 데이터베이스 작업의 뼈대를 정의하고, 중간 단계를 서브클래스로 위임함으로써 코드의 재사용성과 확장성을 높이는데 사용됩니다.

콜백 패턴 (Callback Pattern)
콜백 패턴은 비동기 프로그래밍에서 많이 사용되는 디자인 패턴으로, 한 개체가 작업을 수행한 후 다른 개체의 콜백 메서드를 호출하여 작업이 완료되었음을 알리는 방식입니다. 즉, 콜백 패턴은 한 객체가 다른 객체에 대한 콜백(함수)을 제공하는 패턴으로, 이를 통해 비동기 작업이나 이벤트 핸들링 등에서 작업 완료 시점을 효과적으로 처리할 수 있습니다.

구성 요소
콜백 인터페이스 (Callback Interface): 작업이 완료되었을 때 호출될 메서드를 정의하는 인터페이스입니다. 보통 단 하나의 메서드만 정의됩니다.
콜백을 받아들이는 클래스 (Class with Callback): 작업을 수행하는 클래스로서, 콜백 인터페이스를 매개변수로 받아 작업이 완료되면 해당 콜백을 호출합니다.
콜백을 구현하는 클래스 (Class implementing Callback): 콜백 인터페이스를 구현하는 클래스로서, 작업이 완료되면 호출될 실제 콜백 메서드를 구현합니다.
콜백 패턴 예시 (JdbcTemplate 사용)
javaCopy code

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

// 사용자 정보를 담는 User 클래스 
class User {
	private Long id;
    private String username;
    private String email;
    // Getters, Setters, 생성자 등은 생략 
}
// 콜백 인터페이스
interface UserRowMapper extends RowMapper<User>{
	@Override User mapRow(ResultSet rs, int rowNum) throws SQLException;
}

// JdbcTemplate 사용하여 데이터베이스와 상호작용
class UserRepository {

    private final JdbcTemplate jdbcTemplate;
    
    public UserRepository(DataSource dataSource) {
    	this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    // 콜백을 구현한 RowMapper 콜백 객체
    private final UserRowMapper rowMapper = (rs, rowNum) -> {
    	User user = new User();
        user.setId(rs.getLong("id"));
        user.setUsername(rs.getString("username"));
        user.setEmail(rs.getString("email"));
        return user;
    };
    
    // 콜백을 활용하여 사용자 목록 조회
    public List<User> getAllUsers() {
    	String query = "SELECT * FROM users";
        return jdbcTemplate.query(query, rowMapper);
    }
    
    // 기타 다른 데이터베이스 관련 작업들...
 }

 

위의 예시에서 UserRepository 클래스는 JdbcTemplate을 사용하여 데이터베이스와 상호작용합니다. RowMapper 인터페이스를 구현한 UserRowMapper를 콜백으로 사용하여 데이터베이스 쿼리의 결과를 User 객체로 매핑합니다. 콜백 패턴을 이용하여 데이터베이스 작업의 결과 처리를 분리함으로써 코드의 유연성과 재사용성을 높이는데 도움이 됩니다.

템플릿 메서드 패턴과 콜백 패턴은 Spring의 JdbcTemplate에서 데이터베이스 작업을 효율적으로 처리하는데 중요한 역할을 합니다. 템플릿 메서드 패턴은 데이터베이스 작업의 뼈대를 정의하고 중간 단계를 서브클래스로 위임하여 코드의 재사용성과 확장성을 높여주며, 콜백 패턴은 비동기 프로그래밍과 데이터베이스 결과 매핑에 유용하게 사용됩니다. 이러한 디자인 패턴들을 활용하여 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. Spring의 JdbcTemplate은 이러한 디자인 패턴들을 내부적으로 활용하여 개발자에게 더욱 편리한 데이터베이스 작업 환경을 제공합니다.