본문 바로가기
Java

[Servlet-jsp] DAO(Data Access Object)에서 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate를 싱글톤 패턴으로 구현하기

by bkuk 2023. 3. 31.

매번 JdbcTemplate 인스턴스 생성하

 

컨트롤러에서 접급하는 DAO 클래스와 같이 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate는 인스턴스를 여러개 필요가 없다. 인스턴스를 하나만 구현해도 된다.

우선, 개선하기 전 아래 코드를 살펴보자.

public class JdbcTemplate {
    public void update(String sql, PreparedStatementSetter pss) throws DataAccessException {
	[생략..]
    }
    public void update(String sql, Object... parameters) {
	[생략..]
    }
    public void update(PreparedStatementCreator psc, KeyHolder holder) {
	[생략..]
    }
    public <T> T queryForObject(String sql, RowMapper<T> rm, PreparedStatementSetter pss) {
	[생략..]
    }
    public <T> T queryForObject(String sql, RowMapper<T> rm, Object... parameters) {
	[생략..]
    }
	[생략..]
}
public class AnswerDao {
    public Answer insert(Answer answer) {
    	JdbcTemplate jdbcTemplate = new JdbcTemplate();
        String sql = "INSERT INTO ANSWERS (writer, contents, createdDate, questionId) VALUES (?, ?, ?, ?)";
	[생략..]
     jdbcTemplate.update(psc, keyHolder);
    }

    public Answer findById(long answerId) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        String sql = "SELECT answerId, writer, contents, createdDate, questionId FROM ANSWERS WHERE answerId = ?";
	[생략..]
    return jdbcTemplate.queryForObject(sql, rm, answerId);
    }
}

 

DAO 클래스에서 접근 로직을 구현할 때 마다 

JdbcTemplate jdbcTemplate = new JdbcTemplate();

인스턴스를 계속 생성할 것이다.

 

싱글톤 패턴으로의 접근

매 요청마다 인스턴스를 생성하지 않아도 된다. 매번 인스턴스를 생성하지 않아도 되는 대표적인 클래스는 컨트롤러, DAO, JdbcTemplate와 같이 상태 값은 가지지 않으면서 메서드만 가지는 클래스이다.

이와 같이 매번 인스턴스를 생성하지 않고 인스턴스 하나만 생성해 재사용하도록 강제할 수 있는 디자인 패턴싱글톤(Singleton) 패턴이다.

 

어떻게 생성하는데?

아래 코드를 보자.

public class JdbcTemplate {
	private static JdbcTemplate jdbcTemplate;
    
	private JdbcTemplate() {
	}
	public static JdbcTemplate getInstance() {
		if(jdbcTemplate == null) {
			jdbcTemplate = new JdbcTemplate();
		}
		return jdbcTemplate;
	}

 

싱글톤 패턴을 구현하려면 먼저 클래스의 기본 생성자를 private 접근 제어자로 구현해 클래스 외부에서 인스턴스를 생성할 수 없도록 한다. 인스턴스에 대한 생성은 get() 메서드와 같은 static 메서드를 통해 가능하도록 허용한다.

위와 같이 싱글톤 패턴을 구현하는 경우 여러 개의 쓰레드가 동시에 getInstance() 메서드를 호출하는 경우 인스턴스가 하나 이상 생성될 수 있는 문제가 있는 코드이다. 

 

동시에 생성하는 경우는?

그렇다면, 인스턴스가 하나만 생성하도로 보장하면서 간단하게 구현할 수 있는 방법은 아래와 같다.

public class JdbcTemplate {
	private static JdbcTemplate jdbcTemplate = new JdbcTemplate();
    
	private JdbcTemplate() {}
    
	public static JdbcTemplate getInstance() {
		return jdbcTemplate;
	}

 

 

댓글