JAVA

[Spring] 3장 템플릿

로춘남 2021. 6. 24. 19:32
728x90


리소스 반환과 close()

Connection이나 PreparedStatement에는 close()메소드가 있음. 이름 그대로 열린것을 닫는 역할인데 보통 리소스를 반환하는 의미로 이해하는것이 좋다. Connection과 PreparedStatement는 보통 풀(pool) 방식으로 운영. 미리 정해진 풀 안에 제한된 수의 리소스(Connection, Statement)를 만들어 두고 필요할 때 이를 할당하고, 반환하면 다시 풀에 넣는 방식으로 운영.

요청이 매우 많은 서버환경에서는 매번 새로운 리소스를 생성하는 대신 풀에 미리 만들어둔 리소스를 돌려가며 사용하는편이 훨씬 유리함. 대신 사용한 리소스는 빠르게 반환해야한다. 그렇지 않으면 풀에 있는 리소스가 고갈되고 결국 문제가 발생하게 된다. close() 메소드는 사용한 리소스를 풀로 다시 돌려주는 역할을 함.

 

아래는 JDBC예외처리를 적용한 getCount() 메소드

public int getCount() throws SQLException{
        Connection c=null;
        PreparedStatement ps=null;
        ResultSet rs=null;

        try{
        	c=dataSource.getConnection();
        	ps=c.prepareStatement("select count(*) from users");

        rs=ps.executeQuery();
        rs.next();
        return rs.getInt(1);
        	} catch (SQLException e) {
         throws e;
        	} finally {
        	if(rs!=null){
        try{
        rs.close();
        	} catach (SQLException e){
        	}
        }
        if(ps!=null){
        	try{
        	ps.close();
        	}catch(SQLException e){}
        	}
        	}
        if(c!=null){
        	try{
        		c.close();
        		}catch(SQLException e){
        }
        }
        }
        }

이러한 형식으로 코드가 try / catch / finally로 반복될경우 단순작업처럼 보여 쉬워지겠지만, 어느 특정부분을 빼먹었거나, close()를 제대로 처리를 안해주면 문제가 발생하게 된다.

 

이러한 경우를 해결하기 위해서 분리와 재사용을 위한 디자인 패턴을 적용 할 수 있다.

 

3장 템플릿 정리

- JDBC와 같은 예외가 발생할 가능성이 있으며 공유 리소스의 반환이 필요한 코드는 반드시 try/catch/finally 블록을 관리해야함.

- 일정한 작업 흐름이 반복되면서 그중 일부 기능만 바뀌는 코드가 존재한다면 전략 패턴을 적용. 바뀌지 않는 부분은 컨텍스트로, 바뀌는 부분은 전략으로 만들고 인터페이스를 통해 유연하게 전략을 변경 할 수 있도록 구성

- 같은 애플리케이션 안에서 여러 가지 종류의 전략을 다이내믹하게 구성하고 사용해야한다면 컨텍스트를 이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만듬.

- 클라이언트 메소드 안에 익명 내부 클래스를 사용해서 전략 오브젝트를 구현하면 코드도 간결해지고 메소드의 정보를 직접 사용 할 수 있어서 편리함.

- 컨텍스트가 하나 이상의 클라이언트 오브젝트에서 사용된다면 클래스를 분리해서 공유하도록 만듬.

- 컨텍스트는 별도의 빈으로 등록해서 DI 받거나 클라이언트 클래스에서 직접 생성해서 사용. 클래스 내부에서 컨텍스트를 사용 할 때 컨텍스트가 의존하는 외부의 오브젝트가 있다면 코드를 이용해서 직접 DI 해줄 수 있음.

- 단일 전략 메소드를 갖는 전략 패턴이면서 익명 내부 클래스를 사용해서 매번 전략을 새로 만들어 사용하고, 컨텍스트 호출과 동시에 전략 DI를 수행하는 방식을 템플릿/콜백 패턴이라고함.

- 콜백의 코드에도 일정한 패턴이 반복된다면 콜백을 템플릿에 넣고 재활용하는 것이 편리

- 템플릿과 콜백의 타입이 다양하게 바뀔 수 있다면 제네릭스를 이용

- 스프링은 JDBC 코드 작성을 위해 jdbcTemplate을 기반으로 하는 다양한 템플릿과 콜백을 제공

- 템플릿은 한 번에 하나 이상의 콜백을 사용 할 수도 있고, 하나의 콜백을 여러 번 호출 할 수도 있음.

- 템플릿/콜백을 설계할 때는 템플릿과 콜백 사이에 주고받은 정보에 관심을 둬야함.


토비의 스프링 Vol.1

 

728x90