티스토리 뷰

트랜잭션을 위한 블록


블록이 반복자에서 사용되기는 하지만 다른 용도로 사용될 때도 있다.

트랜잭션 제어 하에서 동작해야만 하는 코드를 작성해야 할 때 블록을 사용할 수 있다.

다음의 코드는 파일을 열고 그 내용으로 작업을 한 후에 마치면 이 파일이 닫히는 트랜잭션이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class File
    #open_and_process는 클래스 메서드로 생성
    def self.open_and_process(*args)
        f = File.open(*args)
        yield f
        f.close()
    end    
end
 
File.open_and_process("testfile""r"do |file|
    while line = file.gets
        puts line
    end
end
cs


실행결과:

This is line one

This is line two

This is line three

And so on


[특징]

1. open_and_process는 클래스 메서드이다. 이 메서드가 클래스 메서드인 이유특정한 파일 객체에 상관없이 호출할 수 있기 때문이다.


2. 매개변수가 *args로 가변 인자 리스트로 정의되어 있다. 이것이 뜻하는 바는 "실제로 메서드에서 넘겨받는 매개변수를 모아서 배열로 만들고 args라고 이름을 붙여라"다. 이는 배열로 다시 펼쳐서 요소 각각을 매개변수로 넘긴다.


3. 파일을 열었다면 이제 open_and_process 메서드는 yield를 호출하여 방금 연 파일 객체를 블록 객체에 넘겨준다. 이렇게 함으로써 열린 파일의 핸들을 닫아야 하는 책임이 파일 객체의 사용자로부터 파일 객체 자체로 넘어가게 된다.


결국 트랜잭션을 위한 블록으로서 위와 같이 메서드를 작성하여 메서드 자체에서 파일의 열고 닫는 일련의 모든 과정들을 진행한다.


댓글