OEM에 터보 시스템을 장착하는 이유

터보차저의 쉬운 이해들 (4)

' 터보를 장착하면 무엇이 달라지는가?'라는 질문을 종종 받게 된다. 다시말해 일반차량에 터보 시스템을 장착할 경우 오너가 얻게 되는 득과 실은 반드시 있기 마련이다. 하지만 유명한 스포츠카나 수입차량들이 터보 시스템을 장착한 것을 보면 알 듯이 스포티한 드라이빙을 얻기위해 최상의 조건이 터보시스템이라는 것을 알 수 있다. 이번 기사에서는 일반인들이 터보에 대해 궁금해하는 것들중 가장 일반적인 부분에 대해 알아본다.

일반적으로 가장 많이 궁금해하는 부분으로 '출력이 얼마나 많이 상승되는가'에 대해 우선적으로 알아보겠다. 터보차저를 장착했을때 출력상승은 부스트 압력과 비례하게 된다. 부스트란 지난호에서 말했듯이 흡입되는 공기의 압축압력으로 순정 엔진의 경우 0.5~0.8bar를 예상하면 된다. 만일 엔진에 특별한 튜닝 피스톤을 바꾸고 압축비를 변경하고, 그외 여러가지 튜닝을 할 겨우에는 1.0~1.4bar바정도까지 부스트를 사용할 수 있다.

이때문에 출력이 얼마나 상승하는가는 간단히 알아 볼 수 잇다. 순정 엔진이 배기량2,000cc, 100마력의 성능을 갖고 있다면 부스트를 0.5bar까지 증가한다는 것은 공기를 50% 압축시킨다는 것이므로 출력이 150마력을 예상하지만 실제로 엔진의 흡입 손실, 터보차저로 인한 흡입공기가열로 인한 열 손실등으로 인해 실제 출력은 130마력 정도를 예상할 수 있다. 즉 티뷰론의 경우 2,000cc 135마력 엔진이으로 0.5bar 터보를 사용할 경우 170마력정도까지 예상할 수 있다.

일반 소비자들의 경우 35마력 정도 출력이 상승된다고하면 아주 작다고 생각하겠지만 실제주행에서 토크와 출력이 30% 상승된다는 것은 엄청난 차이를 나타낸다. 출력에 영향을 주는 요소는 부스트외에 연료의 옥탄가, 노킹의 여부, 흡기온도가 있으며 이 요소들이 변화에 따라서 출력은 더 상승되거나 떨어질 수 있다.

출력 상승외에 가장 많이 궁금해하는 부분은 엔진의 내구성이다. 엔진의 내구성에 가장 영향을 미치는 요소는 장착된 터보 키트의 완성도이다. 불완전한 시스템을 장착하였을 경우에 엔진에 무리가 간다는 것은 당연한 사실이다. 터보 키트의 완성도가 높다고 하더라도 과도하게 출력을 상승 시킬 경우에는 엔진의 내구성이 떨어진다. 또한 0.5bar가 한계인 터보키트를 장착하여 그 이상 부스트를 이용해 사용한다면 내구성은 예상치 못할 정도로 떨어진다. 터보 키트를 장착하여 문제가 발생된 경우 대부분은 위에서 말한 두가지 경우이다.

그외에 궁금하게 생각하는 부분이 연료 소비량이다. 연료의 소비량, 즉 연비는 어떻게 운전을 하느냐에 달려 있다. 터보를 지속적으로 작동시켜 운전을 한다면 공기가 들어가는 만큼 연료를 소모하게 되어 연비가 나빠진다. 이는 터빈을 작동시키지 않고 운전을 한다면 연비는 거의 동일하거나 조금 나빠질 뿐이라는 것과 같다. 조금 나빠지는 원인은 압축비의 변화에 따른 것으로 터보를 장착하기 위해 압축비를 내렸기 때문에 연소효울이 떨어지는 것이다.

그럼 터보 키트를 장착하기 위한 방법에 대해 알아보겠다.

터보키트를 장착하기 위한 방법은 여러가지로 가장 손쉬운 방법은 터보가 장착되어 있는 차량을 구입하는 것이고 그외에 터보키트를 구입하여 장착하는 방법 자기차에 맞는 터보 키트를 구성시키는 방법이 있다.

어 떤 방식을 선택할 것인가는 사용 목적에 따라서 아래의 몇가지 사항을 알아야 한다. 즉 차량의 어떤 부분을 보완하기 위해 터보시스템을 장착하는가, 얼마나 많은 출력 상승을 원하는가, 법적인 문제에는 행당이 되지 않는가, 어디서 장착을 할 것인가를 고려한 다음 터보 키트를 선택해야 한다.

현재 가장 많이 나와있는 터보 키트는 혼다 시빅, 인테그라에 장착되는 제품으로 미국내 시장중 가장 큰 부분을 차지하고 있다. 국내에서 가장 인기가 있는 터보 키트는 티뷰론에 장착되는 것으로 일반인들이 널리 접할 수 있는 상품이다

그렇다면 터보 키트를 구성할때 어떤 터빈을 장착할 것인가 터빈의 개략도는 아래와 같다.
터 빈의 선택에 있어서 고려해야할 요소로 부스트압을 얼마나 사용할 것인가이다. 터보 레그는 어느정도 고려하는가, 저rpm에서의 토크는 어는정도 에상하는가 등이다. 위의 요소는 터빈의 크기와 관련된 요소들이 대분분이다. 즉 터빈의 크기가 크면 최고 출력은 상승하고 레그는 커지고 저rpm 토크는 떨어진다. 그렇기 때문에 터빈을 선택하는데 잇어서 신중하지 않을 경우 원하는 출력을 내지 못하는 것은 물론 경우에 따라서는 운전하기 힘든 차량이 되어 버린다.

일반적으로 국내에서 터빈의 크기에 대해 이야기할때 전체 크기만을 말하는데 실제적으로 터빈을 구성하고자할 때에는 터빈의 압축기 부분과 배기 부분을 나누어야 한다.

위에서 말했듯이 터빈의 특성에 따라 출력 특성이 틀려지므로 모든 요소를 만족시키기 위해서는 터빈의 크기르 정할때 배기 부분의 크기를 정하고 압축기 부분의 크기를 정하는 방식을 사용한다.

배 기 터빈쪽 터빈 사이즈는 엔진의 배기압력을 고려해야 하는 부분으로 배기 매니폴더의 형태 순정 엔진의 배기 압력을 고려해서 배기 터빈이 가장 원활하게 회전할 수 있는 터빈의 A/R을 찾아야한다. 또한 압축기쪽 터빈은 흡입 공기를 압축시켜서 출력을 오리는 부분으로 배기 터빈의 회전수를 고려해서 A/r의 크기를 정해야 한다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

블로우 오프 밸브 장착과 터보 레그가 나타나는 원인

터보차저의 쉬운 이해들 (3)
터보 시스템을 장착하는 튜닝카들 중 대부분이 터보 레그 때문에 고생을 한다. 하지만 터보 레그는 터보 튜닝카뿐만 아니라 NA 튜닝카에서도 발생하는 현상으로 단지 터보차량에서 쉽게 느낄 수 있기 때문이다.

제3장 터보 레그란 무엇인가?

터 보레그란 간단히 말하자면 응답성이 지연이다. 응답성이란 운전자가 가속을 하고 싶어 액셀레이터터 페달을 깊게 밟았을때 실제 출력이 상승하기까지 걸리는 시간이라할 수 있다. 가속 응답성의 지연은 터보 차량에만 있는 것이 아니라 자연 흡기차량에도 동일하게 존재한다. 그런데 굳이 터보 차량에서 가속 응답성을 터보 레그라고 부르면서 자연 흡기 차량의 가속 응답성과 구별을 하는 것일까?

그 이유는 가속 응답성이 변화되는 범위가 자연흡기 엔진에 비해 터보 차량이 월등하게 크기 때문이다. 터보 차량이 운전중에 터보 레그를 느끼는 상황은 두 가지이다. 첫번째는 100rpm정도의 저 rpm에서부터 고 rpm으로 가속할때 터빈이 작동되기까지 걸리는 시간으로 이 경우 터빈의 크기와 A/R에 가장 많은 영향을 받는데 터빈의 크기와 A/R이 클수록 터보 레그가 심해진다.

터 빈의 특성에 따른 레그의 변화는 표1을 참조하면 쉽게 이해될 것이다. 그외에도 터빈의 날개 즉 임펠러의 형태, 인터쿨러의 크기, 흡기관의 형태에 따라 터보 레그는 달라진다. 그렇다면 이 터보 레그를 줄이기 위해서는 어떤 방법이 있을까?

가장 좋은 방법은 터빈을 신중하게 선택하는 것이며 ,그외에 엔진의 압축비와 배기 매니폴드의 형상, 흡기관의 형태, 인터쿨러, 임페러등을 바꾸어도 조금의 변화를 줄 수 있지만 이 부분은 터보레그가 아니라 엔진 출력면에서 차후에 별도로 설명하기로 한다.

터보 레그를 느끼는 두번째 상황은 터보가 작동하는 rpm에서 액셀러레이터를 on-off-on 시킬때, 다시말해 부스트를 걸어서 주행을 하다가 액셀러레이터에 발을 떼어 감속, 즉 부스트가 떨어지게 한후 다시 가속 시간이 지연된다.

주 행중에 액셀러레이터를 off하여 감속하면 스로틀 밸브가 닫히게 되는데 아주 짧은 시간이지만 터빈은 계속 작동되기 때문에 터빈에서 스로틀 밸브까지의 흡기관내에는 압력이 상승하게 된다. 이렇게 압력이 상승하게 되면 터빈에 과부하가 걸려서 내구성이 떨어지는 것은 물론 다시 가속을 하기위해 부스트를 상승시키려하면 흡기 관내 압력이 높기때문에 터빈이 작동되는데 시간이 걸린다.

이런 터보 레그를 없애기 위해서는 블로우 오프 밸브를 장착하여 관내 압력을 낮추어 주면 된다. 블로우 오프 밸브는 터빈과 스로틀 밸브 사이에 장착하는 스르링 밸브로 서지 탱크냉의 압력과 인테이크 파이프내의 압력차가 밸브의 장력 이상이 되면 열리게 된다.

액셀러레이터를 off시키면 서지탱크내의 압력은 순간적으로 진공이 되는 반면 흡기관내의 압력은 비정상적으로 높아지는데 이때 밸브가 작동하여 흡기관내의 공기를 방출하여 관내의 압력을 내려서 터보 레그를 없애준다.

블 로우 오프 밸브는 여러 가지 상품이 있는데 그 성능은 거의 동일하다고 할 수 있다. 요즘은 각 회사의 블로우 오프 밸브마다 공기 방출시 특유의 소리를 내는데 이 독특한 소리가 블로우 오프 밸브를 장착하는 또 하나의 이유가 되어버릴 정도로 터보 차량을 타는 운전자의 즐거움으로 받아들여지고 있다.

블로우 오프 밸브의 장착에는 특별한 기술이 필요하지는 않다. 하지만 중요한 사항은 방출되는 공기를 어디로 내보내는가 하는 것이다.


스 로틀 밸브 앞에 추가 인젝터가 장착된 차량의 경우는 대부분 방출 공기를 대기중으로 내보내지 않고 터빈 앞의 인테이크 파이프로 연결시켜서 다시 흡입한다. 이유는 스로틀 밸브앞에 추가 인젝터가 장착된 경우 스로틀 밸브가 닫혀서 관내의 압력이 올라갈때 그 공기중에는 연료가 포함되어 있다.

이런 연료가 포함된 혼합기를 블로우 오프 밸브를 통해 대기중으로 방출시킬 경우 휘발유 냄새가 나는 것은 물론 화재의 위험이 있기 때문에 터빈 앞의 인테이크 파이프로 연결하여 재흡입한다. 흔히 블로우  오프 밸브의 타입을 일반 블로우 오프 밸브와 시퀸셜 블로우 오프 밸브로 구분하는 기준이 되기도 한다.

터보 레그는 터보 튜닝카에서 심하게 나타나는 것으로 어쩔 수 없는 현상으로 인정하고 단지 줄여주는 것까지만 노력을 해야 한다. 이런 레그가 싫다면 터보를 달지 않는것이 가장 좋은 방법이라고 하겠다.

자 연 흡기 상태로 시속200km를 넘게 달리는 차량에 터보를 장착하여 출력을 높이면 최고 속도가 얼마나 증가하게 될까? 많은 사람들이 이 부분에 대해서 궁금하게 생각하는데 이에 대한 정확한 답은 '터보만 장착해서는 속도를 얼마 늘어나지 않는다'이다.

최 고 속도를 올리기 위해서는 생각보다 많은 부분에 대해 고려해야만 한다. 흔히 엔진의 출력을 올리고 이에 맞는 기어비를 가진 트랜스미션만 있으면 최고속도가 향상되리라 예상한다. 물론 이론적으로는 정확한 이야기이다. 하지만 여기에는 몇가지 한계와 생각하지 못했던 숨은 요소가 있다.

엔진 출력의 경우 두배쯤 올린다고 가정하지만 실제 사용하기에는 조금 문제가 있다. 자연 흡기 엔진에 터보를 장착해서 출력이 두배가 되었다고 하지만 이는 순간적으로 어느정도 시간 사용하는 것이 지속적으로 최고rpm 최고 부스트를 써서 계속 주행한다면 아무도 내구성을 보장할 수 없다.

이는 터보키트를 장착하였기 때문에 키트의 완성도가 떨어져서 내구성이 떨어지는 것도 있겠지만 실제적으로 터보 엔진의 내구성에 대해서 장담할 수 있는 양산 터보차량 메이커가 몇개나 되는지는 누구도 자신있게 대답할 수는 없을 것이다.

다 시 말하자면 터보는 최고 속도를 내기 위해서 액셀러레이터 페달을 한계점까지 밟기 위해 장착하는 것이 아니라 가속하는 느낌 즉 중-고속까지의 가속감을 즐기기 위해 장착하는 것이다. 기어비의 경우 최고 속도를 위해 무조건 낮출수는 없다. 이 대문에 외국의 최고속 스포츠카들은 최하 17인치이상의 큰 사이즈 휠과 타이어를 장착한다. 즉 접지면적을 넓혀서 안정성을 높이는 목적외에 기어비에서 오는 한계를 넘기 위해서이다.

이와함께 중요한 요소가 공기 자항으로 공기 저항은 속도의 제곱에 비례하여 증가되는 요소로 시속 200km일때가 시속100km일때에 비해 4배의 공기 저항을 받는다고 생각할 수 있다. 이렇듯이 공기 저항계수를 줄이는 것이 엔진출력을 높이는 것만큼이나 최고속도를 높이기 위해서는 중요하다. 이와 함께 차체의 강성, 서스팬션 또한 중요한 요소가 된다.

                                                                                                                         

출처 : http://blog.naver.com/yousky0208

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
사용자 삽입 이미지
 
자연흡기방식에 과급기를 장착할 경우 출력상승 효과와 내구성 문제

터보차저의 쉬운 이해들 (2)

터 보를 세팅한 차량에 있어서 과급압을 0.5bar이상 사용할 경우에는 점화시기와 연료량을 비롯한 부스트 컨트롤 등이 필요한데 이에 대한 자세한 내용은 뒤에 상세히 알아보기로 하고 그 전에 먼저 자연 흡기 엔진에 과급기를 장착할 때 내구성에 크게 영향을 주지 않고 얼마나 출력을 상승시킬 수 있는지 알아보자

제2장 내구성이란?

자연 흡기 엔진에 과급기를 장착하여 출력을 올릴 경우 엔진의 내구성은 어떻게 될까? 상식적으로 생각해도 답은 간단하다. 내구성은 떨어질 수 밖에 없다. 과급기가 아닌 어떤 장치를 사용한다고 하여도 출력이 상승되면 그 만큼 내구성이 떨어지는 것은 당연하다. 즉 모든 조건이 똑같다는 가정하에서 100마력의 엔진을 150마력으로 향상시켰을 경우 어떤 방법을 사용하였건 내구성이 떨어지는 것은 똑같다고 하겠다.
과 급기를 사용하였기에 내구성이 많이 떨어지고 다른 시스템을 이용했기 때문에 조금 떨어지고 하는 차이는 절대 있을 수 없다. 단 다른 모든 조건이 똑같다는 전제 아래에서는 내구성이 떨어지는 것이 비슷하다는 의미이다. 하지만 엔진에 따라 특정 방법이 손쉽고 편리할 수 있기 때문에 여러가지 방법으로 출력을 상승시키는 것이며, 각기 장단점이 생기는 것이다.

세팅에서 내구성이 갖는 의미는 무엇인가?

그렇다면 과급기를 사용하여 출력을 상승시킬 경우 내구성은 얼마나 떨어지며, 출력은 얼마나 상승시킬 수 있을까? 이문제를 답하기 전에 내구성이 무엇인가에 대해 알아보고자 한다.

엔 진의 내구성을 향상시키기 위해서 가장 간단한 방법은 자동차 운행 안내서에 있듯이 급가속, 급정거를 하지 않고 엔진 회전수를 높게 사용하지 않으면 된다 . 좀 더 내구성을 향상시키려면 엔진을 가동하지 않고 그냥 정지시킨 상태로 구경만 하면 된다.

회전수를 적게 사용한다는 것은 100마력의 엔진을 50마력만 사용하는 것으로 내구성르 향상시키기 위해 엔진의 고출력을 사용하지 않겠다는 것인데 이러한 운전자가 과급기를 장착한다는 것은 불가능하다고 보면 된다.

적 어도 이 글을 읽거나 출력 향상에 관심을 두고 있는 사람이라면 엔진의 최고 출력, 최고 회전수를 사용하면서도 만족하지 못하는 사람이라는 생각이 든다. 이런 운전자가 원하는 내구성이란 지극히 한정적인 범위일 수 밖에 없다. 즉 고출력-고회전을 원하는 운전자가 원하는 내구성이란 주행 안전성에 크게 문제가 없으면 정상적인 주행이 가능하고 적당히 사용할 수 있는 내구성이 아닐까 한다. 만일 그렇지않다면 더 이상 출력을 올리기 위한 튜닝에 관심을 가져서는 않된다. 이는 튜닝이란 한가지를 얻기 위해서 다른 한가지를 적당히 포기하는 것이지 절대 모든 것을 만족시킬 수는 없는 측면이 없지 않기 때문이다.

그렇다면 적당한 내구성을 보장하면서 얼마나 출력을 향상시킬 수 있는지 정확한 이론적 근거가 있는지 알아보자. 과급 장치가 엔진의 기계적인 부분 즉 피스톤, 커넥팅 로드, 베어링 등에 영향을 주는 것은 크게 힘에 의한 부하와 열에 의한 부하로 나눌 수 있는데 먼저 힘에 의한 부하를 알아보자. 힘에 의한 부하란 쉽게 말하자면 출력이라고 할 수 있다.

과급기를 장착하여 출력을 상승시키면 상승된 출력에 비례하여 내부 부품들이 더 많은 힘을 받는데 만일 출력이 2배 상승될 경우 내부부품들도 2배의 부하를 받는다고 가정할때 엔진 내구성에 치명적인 영향을 미칠 것이다. 하지만 다행스럽게도 실제적으로는 그렇지 않다.


출력을 얻을 수 있는 행정은 폭발 행정

엔 진에서 출력을 얻도록 하는 부분은 4행정의 흡입, 압축, 폭발, 배기 중 폭발 행정이다. 이 폭발 행정의 경우 엔진의 출력에 의한 부하이며 그 외의 행정은 단지 엔진이 돌아가는 타력 부하이다. 타력 부하의 경우 커넥팅 로드에 가해지는 하중은 1/2스트로크를 기준으로 누름 하중과 인장 하중의 두 가지로 나눌 수 있다.

인장 하중이란 피스톤이 상사점에서 1/2스트로크까지 내려올 때, 올라갈 대 작용되며 누름 하중의 경우 1/2스트로크를 기준으로 하사점까지 내려갈 때, 올라갈 때 작용되는 힘의 방향이다. 엔진이 1/2스트로크에 멈추어 잇다고 생각하며 ,자유물체도를 그려보면 쉽게 이해가 될 것이다. 출력 부하의 경우 4행정 중 1번이며 커넥팅 로드에 가해지는 하중은 누름 하중으로 작용한다.

이 두가지 부하인 타력 부하와 출력 부하를 더해보면 실제 커넥팅 로드에 가장 많은 하중이 작용되는 가장 중요한 하중은 아니기 때문에 과급으로 어느정도 폭발압력을 상승시켜도 크게 무리가 없다는 것이다. 그렇다면 폭발업력은 어떻게 작용하는가.

그림 1은 자연 흡기 엔진과 과급 엔진의 실린더 내 압력을 크랭크각을 기준으로 나타낸 것이다. 여기서 관심 깊게 보아야 할 부분은 과급 엔진의 압력 상사점이 자연 흡기엔진에 비해 약 20% 정도 밖에 높지 않다는 것이다. 이는 실린더 내 압력이 가장 높은 지점은 혼합기가 약 20%정도 연소되고 난 후인데, 과급을 가해서 연소길 내의 혼합기 양을 배로 늘린다고 하여도 실제넉으로 연소가 되는 양은 20% 정도이며, 연소길 내의 전체 압력은 압축 압력과 연소 가스의 압력이 더해지므로 전체 연소실 최고 압력이 한가지 요인의 2배 증가로 인해 2배가 되지 않는다. 또한 출력이란 폭발행정 전체의 평균 압력이지 최고점의 압력이 아니다.

열에 의한 부하는 장기적인 내구성에 영향

평 균 압력은 압력의 최고점 보다는 스트로크의 중간이나 끝 부분의 압력과 더욱더 관계가 많다고 볼 수 있다. 표 1에서 가장 주의 깊게 보아야할 부분은 크랭크 각도가 90도 일 때의 연소실 압력이다. 이 부분의 압력은 부스트가 가해지지 않을 때의 3~4배가 되는데, 최고압력에 비해서는 낮기 때문에 엔진에 무리가 가해지지는 않는다. 이렇듯이 크랭크 각90도 지검의 연소실 압력이 자연 흡기 상태의 최고 지점을 넘지 않게 하는 것이 내구성을 치명적으로 떨어뜨리지 않는 한계라고 할 수 있다.

열에 의한 부하는 힘에 의한 부하에 비해 장기적인 내구성에 영향을 미친다. 터보 엔진이 자연 흡기 엔진에 비해 열에 약하고 내구성도 떨어진다는 것은 널리 알려진 사실이다. 이 때문에 터보 엔진을 설계할 때에는 열에 대한 내구성을 향상시키기 위해 많은 노력을 한다. 하지만 아직까지 이 부분에 대해 완벽한 대책은 없다.

져연 흡기 엔진이 원래의 터보 엔진에 비해 열에 대한 내구성이 떨어지는 것은 당연한테 이런 자연 흡기 엔진에 터보 키트를 장착한다면 열에 대한 내구성은 더욱더 떨어질 수 밖에 없다. 즉 터보 키트의 경우 과급압력을 0.5bar 정도 사용하며, 순간적인 피크점을 0.9bar정도 사용해 시간도 30초 이상 지속되지 않게 한다. 또한 전 부하시 연소실의 온도 상승을 막기 위해 연룔를 좀 더 넣어 주기도 한다. 어떤 방법이 되었건 터보 엔진의 열에 대한 내구성 향상은 앞으로 해결해야 할 문제이다.

위에서 터보를 장착하여 출력을 상승시킬 수 있는 한계에 관해 몇가지 기준을 확인해 보았다. 그렇다면 이번에는 어떤 영역의 출력을 상승시킬 수 있는가 알아보자.(표2참조) 표2에서는 토크 상승에 중점을 둔 것으로 과급압 0.5bar일때 상승 시킬 수 있는 이상적인 토크 그래프이다.

토크의 상승은 출력 상승에 비해 여러가지 면에서 이상적이다. 과급 엔진에서 토크 상승은 8:1 이상의 고압축비, 저 부스트로 운전성이 좋고  연비도 휠씬 유리하다. 터보 시스템에서 부스트가 작동되는 경계점의 시작은 전부하시 부스트가 작동되는 가장 낮은 RPM이다 이 최저 RPM은 터빈의 특성에 따라 표3처럼 달라진다.

터빈이 작으면 초기 응답성은 좋지만 고속으로 갈 수록 출력이 줄어들고 터빈이 크면 초기 응답성은 떨어지지만 고속으로 갈 쑤록 휠씬 높은 출력을 발휘한다. 최저 RPM이하에서는 부스트가 작동되지 않으므로 자연 흡기 차량과 동일하게 압축비가 엔진 출력에 많은 영향을 미친다.

초기 응답성이 느린 이유는 크게 세가지인데 부스트 압력을 높이기위해서 큰 터빈에 저 압축비로 세팅할 경우 가장 잘 나타난다. 터빈의 특성으로 인해 초기 응답성이 늦고 게다가 터보 레그(표4)가 심해지며, 낮은 압축비로 인해 터보가 작동되기 전의 토크까지 줄어든다. 이런 세팅의 경우 위에서 말한 토크 위주의 세팅과는 정반대의개념으로 최고 출력과 고속 펀치는 좋지만 운전하기에는 상당히 까다로운 튜닝카가 된다.
 (표 와 그림이 없어 죄송합니당^^:;)                                                                                              


출처 : http://blog.naver.com/yousky0208

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
사용자 삽입 이미지
 

터보시스템을 통해 알아본

터보차저의 쉬운 이해들(1)

글 은 이해하기 쉽도록 총 7개장으로 구성되어 있다. 제 1장은 과급 시스템의 기본적인 윈리와 터보차저가 장착된 차량에 대해 소개하고, 제2장은 터보차저의 특성을, 제 3장은 흡입 공기 냉각장치인 인터쿨러에 대해 알아보기로 한다. 또한 제 4장은 연료량 컨트롤에 대해 전자 제어를 중심으로 소개하고, 제 5장에서는 점화와 관련되 부분, 제 6장에서는 배기와 관련된 부분을 제시한다. 제 7장은 과급압 조절, 제 8장은 압축비와 피스톤의 관계를, 마지막으로 9장에서는 터보 엔진의 고장과 진단, 관리에 대해 사용자의 입장에서 알아본다.


제1장 터보란 무엇인가?
이해하고 살펴보면 아주 간단한

터보의 원리

터 보란 엔진의 배기가스 에너지를 이용하여 공기를 압축하는 펌프라고 할 수 있다. 엔진에서 연료가 연소, 발생하는 에너지는 크랭크 축에 힘을 가해서 출력을 발생시키도옥 사용되지만 그 중 30%정도는 배기관을 통해 배기가스의 형태로 없어진다. 다시말해 터보란 이렇게 손실되는 30%의 배기가스 에너지를 이용하는 것으로 에너지 효율측면에서 출력상승이 얼마인가는 예상이 가능하다. 즉 터보를 장착하여 과급을 할 경우 최하 30%에서 최고 100%까지의 출력 상승이 가능하다.

터보의 원리는 이렇게 간단한 반면 실제 엔진에 적용되는 것은 그렇게 간단하지는 않다. 과급에 의 파생되는 여러가지 문제점들 때문에 많은 부분에서 보완이 필요하며, 원활한 터보 엔진의 작동을 위해서는 자연 흡기 엔진과는 달리 세심한 주의를 요한다.


터보차저 시스템의 최고 수준은 77년에서 88년까지 F1에서 볼 수 있었다. 실제 F1차량에 사용되었던 터보차저 엔진은 회고출력이 1,000마역을 휠씬 넘는 고출력 엔진이었다. 그렇다면 어떻게 F1에 사용된 터보차저 시스템이 다른 시스템에 비해 많은 출력을 낼 수 있었는가? 이는 과급 시스템에 의해 출력을 향상시키기 위해서 가장 중요한 요소는 얼마나 많은 공기가 엔진으로 공급되는가에 따라 정해진다고 하겠다.

과급에 의해 공기의 공급량을 늘린다는 것은 자연 흡기찰량에서 공기 흡입을 늘리기 위해 흡기관의 설계를 변경하여 공기 흐름을 원활하게 하는 것과는 다른 개념으로 공급되는 공기의 압력이라고 말 할 수 있다. 여기서 말하는 압력이란 자연 흡기 엔진의 경우 풀 스로틀시 엔진에 공급되는 공기의 압력인 대기압을 말하며, 과급 엔진의 경우 얼마나 높은 압력으로 과급해 공기를 밀어 넣는냐를 말하는 것이다.

그렇다면 다른 과급 시스템에 비해 터보 시스템이 널리 쓰이는 이유는 무엇일까? 터보 시스템에서 과급시키는 에너지원은 배기가스의 배기압력으로 여기에서 발생하는 열과 압력으로 인해 터빈이 작동되며 여기서 발생되는 에너지로 흡입 공기에 압력을 가하게 되는 것이다. 다시 말해 배기가스(배기압력)란 원래 소멸될 에너지원으로 이를 재활용하여 압축시키는 터보 시스템이 다른 과급시스템에 비해 효율이 높다고 하겠다.

배기압력과 터보(터빈)의 크기와는 어떤 관계가 있을까? 이의 해답은 터보의 크기가 작아지면 배기압력이 늘어나므로 터보 크기가 작아지는 것만큼 엔진 실제출력의 손실은 늘어난다고 볼 수 있다. 즉 터보의 크기가 커져서 배기압력이 줄어들면 출력 손실 또한 줄어드는 것이다.

공기 과급시 온도 상승은 관심을 두어야할 중요한 사항이다. 동일한 압력, 흐름조건에서도 과급 시스템의 종류에 따라 온도 상승은 각기 다르다. 이런 온도 상승의 차이점은 과급 시스템의 효율에 따른 것으로 일반적인 루트(Roots)형의 수퍼차저 시스템을 장착하면 효율성이 약 50%정도 된다고 알고 있다. 열에 관련된 효율성이 좋다는 것은 실제 알마만큼의 출력을 낼 수 있느냐에 중요한 요소이기도 하다. 온도가 효율성에 영향을 미친다는 것은 출력에 영향을 준다는 의미로 동일한 압력하에서 흡입공기의 온도가 높으면 실제 흡입공기의 질량은 작아지기 때문에 출력이 줄어든다. 또한 엔진 출력에 영향을 미치는 또 하나의 중요한 요소인 점화시기를 설정하는데 있어서도 흡입공기의 온도가 많은 영향을 준다. 이는 온도상승으로 인해 질량이 줄어드는 것만큼 엔진 출력에 밀접한 영향을 주는 요소이다. 이외에 흡입 공기의 온도가 높으면 연료량을 설정하는데 있어서도 공연비가 최고 출력영역보다 더 많게 설정되므로 출력이 떨어지고 연비도 떨어진다. 이처럼 열은 엔진 출력에 세가지면에서 영향을 미치는 만큼 흡입 공기의 냉각에 많은 신경을 써야한다.

터보가 장착된 차량은 크게 양산단계에서부터 터보가 장착되어 출고된 차량과 자연 흡기 찰량에 별도의 터보 키트를 구성하여 장착한 차량으로 나눌 수 있다. 양산단계에서 터보가 장착되어진 차량은 어려움 없이 업그레이드를 하는 개념에서 튜닝을 할 수 있다. 별도의 터보키트를 장착하는 자연 흡기 엔진은 키트로 구성된 터보 시스템을 구입하는 경우와 자기 차량에 맞는 터보 키트를 새롭게 구성하는 방법으로 나눌 수 있다.

여 기서 주의해야할 사항은 터보를 장착하려는 차량중 종류와 목적에 대해서 먼저 정해야하고, 그 목적대로 장착했을 경우 법적인 문제가 없는지에 대해 생각해야 한다. 또한 얼마나 많은 출력을 원하는지, 터보 튜닝시 문제가 발생할 때 해결할 수 있는 기술자가 있는지, 직접 장착할 경우에는 얼마만큼의 노력이 들어가는지에 애해 깊게 생각해야 한다.

양산 단계의 터보 차량은 국산 차량은 현대 스쿠프 터보가 유일한 가솔린 터보 차량이며, 외국산 차량의 경우 닛산 실비아, 스카이라인 GTR, 미쓰비시 이클립스 등의 일본차량과 포르쉐 터보, 뷰익 GNX, 로터스 에스프리 등이 있다. 양산 터보 차량은 터보kit 장착차량과는 달리 내구성 부분이나 법적인 부분에 대해 신경을 쓸 필요가 없기 때문에 가장 바람직한 방향이라 할 수 있겠다.

양산 터보 차량을 업그레이드 하는 방법으로 가장 간단한 것은 부스트 압력을 상승시키는 것이다. 부스트 압력의 상승이란 공기의 압축 압력을 상승시키는 것으로 더 많은 공기를 밀어 넣는다고 생각하면 된다. 부스트 압력을 상승시키는 것은 터빈의 용량에 한계가 있기 때문에 그 이상의 출력 상승을 원할 경우에는 터빈을 좀 더 큰 것으로 교환해야 한다.

대부분의 경우 터빈을 교환하고 부스트압력을 상승시킬때에는 연료량이 부족해 연료공급량을 조절하는데 신경을 써야하며 또한 점화시기를 조절해야만 엔진의 내구성을 보장할 수 있다. 양산 터보 차량의 경우 위와 같이 조절하는 것이 터보 키트를 장착한 차량에 비해서는 휠씬 간단하다. 그 이유는 전체적으로 기계 및 전자적 시스템이 터보 시스템에 적합하게끔 설계되어 있기 때문에 크게 변경할 필요가 없다.


하 지만 터보 키트를 장착한 차량의 경우 어떤 시스템으로 어떤 기술자가 장착하였는가에 따라 출력 및 내구성의 차이가 엄청나다고 할 수 있다. 자연 흡기 차량에 장착하는 터보 키트의 경우 시스템을 하나도 변경하지 않고 터빈만을 장착하여 과급을 할 경우에는 0.2bar 이하의 낮은 압력하에서는 자동적으로 보정해 줄 수 있기 때문이다. 엔진의 하드웨어적인 부분과 전자제어적인 부분의 오차 보정범위가 위와 비슷하기 때문에 큰 문제점도 발생되지 않는다. 일반적으로 널리 알려진 터보키트인 혼다 시빅 터보키트나 BMW에 장착되는 일반적인 터보 키트의 경우는 0.4bar정도의 압력을 가하는 시스템으로 과급 압력이 가해질때 연료량을 더 공급하기 위해서 연료 압력 레귤레이터를 장착하는 간단한 방법을 사용한다. 좀 더 많은 출력을 얻기 위해서는 과급압력을 0.5bar이상 사용해야하는데 이때에는 위의 두 경우와는 달리 많은 주의를 요한다.

출처 : http://blog.naver.com/yousky0208

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

* 이 기사는 ZDNet Korea의 자매지인 마이크로소프트웨어에 게재된 내용입니다.

스프링 프레임워크 개요

스프링은 그 이름 자체로도 많은 의미를 내포하고 있다. 봄! 이 얼마나 설레는 단어인가? 봄이라는 이름만으로도 무거운 J2EE의 사용으로 지친 개발자들에게 이제 겨울이 끝나고 새로운 계절이 돌아오고 있음을 함축적으로 표현해내고 있다. 스프링은 로드 존슨이 쓴 「Expert one-on-one J2EE Design and Development」란 책에서 소개된 소스코드를 기반으로 2003년 2월 오픈소스로 시작된 프로젝트이다. 스프링이 추구하는 바는 크게 두 가지이다.

[1] 복잡하고 무거운 J2EE 기술의 사용을 쉽고 가볍게 만들어주고, 자연스럽게 검증된 최상의 실천 사례들을 구현하도록 함으로써 좋은 프로그램이 작성될 수 있도록 유도한다.

[2] 기존의 잘 알려진 기술들을 프레임워크 내에서 일관된 방법으로 쉽게 사용할 수 있도록 돕는다.

이를 위해 스프링은 다른 프레임워크와는 차별화된 다음과 같은 특징을 가진다.

◆ 스프링은 EJB를 사용하건 하지 않건 관계없이 비즈니스 객체들을 효과적으로 구성하고, 관리하는 방법을 제공하는 데 초점을 맞춘다.

◆ 스프링은 계층화된 아키텍처를 갖고 있으며, 그 중 어떤 부분도 독립적으로 사용될 수 있도록 모듈화되어 있다. 뿐만 아니라 각각의 모듈은 일관된 방법으로 사용할 수 있기 때문에 한번 익숙해지고 나면 사용이 무척 쉽다.

◆ 스프링은 전체 프로젝트의 설정을 관리할 수 있는 일관된 방법을 제공함으로써, 개발자들이 각종 프로퍼티 파일을 작성하지 않도록 유도한다. 이것은 IoC라는 스프링의 특징 때문인데, 객체들간의 의존성이 따로 관리됨으로써 비즈니스 로직이 EJB로 개발되었건 일반 자바 객체로 개발되었건 동일한 방법으로 해당 로직을 이용할 수 있는 이점도 추가된다.

◆ 스프링 기반으로 작성된 애플리케이션은 스프링의 API에 의존하지 않는다. 이것은 어떤 애플리케이션 서버와도 쉽게 연동되도록 하며, 심지어 스프링을 사용하지 않았을 때조차도 비즈니스 로직의 재사용이 가능해지는 요인이 된다.

◆ 스프링은 AOP 지원을 통해 주요 비즈니스 로직과 시스템 전반에 걸친 기능 모듈을 완벽히 분리해내도록 도와준다.

◆ 스프링은 작성된 코드에 대한 유닛 테스트를 쉽게 할 수 있도록 도와준다.

스프링의 기능과 사용 시나리오
현재 스프링은 1.0 버전이 출시된 상태이다. 스프링 홈페이지(www.springframework.org)에서 spring-framework-1.0.2-with-dependencies.zip 파일을 다운받기 바란다. 이 파일은 의존성 있는 관련 라이브러리가 모두 포함된 버전이다. 스프링의 전체 기능은 크게 7개의 모듈로 구성된다(<표 1>).

<그림 2> 스프링의 기능 요소



<표 1> 스프링의 기능 요소


스프링 배포 파일의 압축을 풀면 dist란 디렉토리가 나타난다. 그 안에 있는 spring.jar가 앞에서 언급한 스프링의 모든 기능을 포함하는 파일이다. 각각의 기능 중 필요한 부분을 따로 사용할 경우를 위해 패키지별로 묶은 별도의 JAR 파일이 함께 제공된다.

스프링을 이용한 일반적인 형태의 웹 애플리케이션은 <그림 3>과 같은 구조를 가진다. 톰캣, 웹로직, 웹스피어, JBoss를 포함한 어떤 웹 애플리케이션 서버에서도 동작된다. IoC 컨테이너의 핵심인 Core 패키지와 AOP 지원을 위한 AOP 패키지, 기능을 구현한 빈 객체에 대한 접근을 제공하는 Context 패키지는 반드시 포함되어야 한다. 대부분 데이터베이스 처리를 수행하기 때문에 DAO 패키지도 일반적으로 포함된다.

스프링 애플리케이션은 일반적으로 ORM 솔루션을 채택하고, 특히 하이버네이트와 궁합이 잘 맞기 때문에 하이버네이트를 설치하고 ORM 패키지를 이용하는 경우가 일반적이다. 그 위에서 Web 패키지를 기반으로 Web MVC 패키지를 이용해서 애플리케이션을 개발한다.

<그림 3> 시나리오 1. 완전한 형태의 스프링 웹 애플리케이션


만일 스프링의 Web MVC 패키지를 이용하지 않고, 스트럿츠나 웹워크를 제어 계층에 사용하고 싶다면 Web MVC를 스트럿츠가 대체하는 <그림 4> 외에 같은 구조로 웹 애플리케이션이 개발될 것이다.

<그림 4> 시나리오 2. 서드파티 WAF와 ORM을 연계한 웹 애플리케이션


이 밖에도 EJB를 사용하는 경우 AbstractEnterpriseBean이라는 POJO를 이용해서 EJB를 스프링에서 관리하도록 하고, SlsbInvoker를 이용해서 EJB에 대한 접근 경로를 제공하는 EJB 사용 유형이 있다. 또한 웹 서비스를 포함한 다른 애플리케이션과 연동하는 경우를 위해 Remote 패키지가 제공되기도 한다.

스프링은 그 자체로도 한 권의 책을 쓸 수 있을 만큼 방대한 기술이다. 그 모두를 짧은 연재를 통해 소개한다는 것은 불가능하다. 그러한 이유로 스프링에 대한 소개는 이쯤에서 마무리하고, 스프링을 이해하기 위해 반드시 알아야 하는 IoC(Inversion of Control) 컨테이너의 개념과 AOP(Aspect Oriented Programming)를 간단히 설명하고, 2개의 작은 예제를 소개하는 것으로 이번 글을 마무리하겠다. 부족한 설명은 필자들이 운영하는 VSSH 포럼이나, 스프링 관련 기사 및 자료들을 정리한 리소스 맵을 통해 여러분 스스로 익혀나가기를 바란다.

IoC 컨테이너와 AOP
스프링은 다른 프로젝트에서 개발된 컴포넌트를 조립해서 응집력 있는 애플리케이션의 개발이 가능하도록 도와주는 IoC 컨테이너이며, 다른 말로 경량급 컨테이너(Lightweight Container)라고도 한다. IoC 컨테이너의 또 다른 종류로는 PicoContainer와 아파치의 아발론, 그리고 HiveMind 등이 있다.

그 중에서 현재 가장 널리 사용되고 있는 것은 스프링과 PicoContainer이다. IoC 컨테이너는 다른 컨테이너와 달리 애플리케이션 코드와 컨테이너간의 의존성을 최소화하는 것이 특징이다.

IoC 컨테이너가 컨테이너에 대한 의존성을 최소화하면서 컴포넌트를 엮어주는 일을 수행하는 밑바탕에는 제어 역행화(Inversion of Control)라는 개념이 깔려 있다. 제어 역행화는 리팩토링의 저자이기도 한 마틴 파울러의 홈페이지에 잘 정의되어 있다.

제어 역행화라는 용어는 직관적이지 못하기 때문에, 또 다른 말로 연관성 삽입(Dependency Injection)이라고도 불려진다. 연관성 삽입 패턴은 컴포넌트의 설정을 그것의 사용에서 분리해야 한다는 원칙(The principle of separating configuration from use)에서 출발한다. 그러한 원칙을 위한 또 다른 사례는 J2EE 패턴 중 서비스 로케이터(Service Locator) 패턴이다.

의존성 삽입 패턴을 이해하기 위해 간단한 예를 하나 살펴보도록 하자. 어느 특정 감독이 만든 영화를 검색해서 그 결과를 전달해주는 컴포넌트를 사용하는 것이다. 코드에서 보여지는 findAll()이라는 메쏘드를 가지는 finder 객체가 필요하단 사실을 알 수 있다.

일반적으로 이럴 때 기능 확장을 위해 MovieFinder와 같은 인터페이스를 작성하게 된다.


public interface MovieFinder {
    List findAll();
}


영화 정보가 콜론으로 구분된 CSV 파일에 기록되어 있다면, MovieFinder 인터페이스를 구현한 ColonDelimitedMovieFinder 클래스가 필요할 것이다. 또한 그 정보는 MovieLister에 생성자를 이용해서 초기화될 것이다.


class MovieLister...
    private MovieFinder finder;
    public MovieLister() {
        finder = new ColonDelimitedMovieFinder("movies1.txt");
    }


전체적인 시스템 구조는 <그림 5>와 같은 형태이다. MovieLister 클래스는 MovieFinder 인터페이스 정보만을 이용해서 기능을 구현할 수 있지만, 해당 기능을 사용하기 위해 MovieFinderImpl 클래스 중에서 ColonDelimitedMovieFinder를 이용한다는 구체적인 설정 정보가 클래스의 코드에 포함되어 있다. 이것은 데이터가 DB나 XML로 변경되어 RDBMovieFinder나 XMLMovieFinder로 교체될 경우 코드를 수정해서 다시 빌드해야 한다는 사실을 의미한다.

<그림 5> 일반적인 제어 흐름을 통한 의존성 표현


사실 MovieLister는 정보가 CSV 파일에 기록되어 있건, DB에 기록되건, XML에 기록되건 영향을 받지 않아야 정상이라고 할 수 있다. 어떻게 하면 이처럼 불필요한 의존 관계를 없앨 수 있는 것일까?

<그림 6> 제어역행화 패턴을 통한 의존성 삽입


그 해답은 설정 정보에 따라 어떤 구현 객체를 사용할 것인지를 결정하는 어셈블러를 이용해서 <그림 6>에서 보여지는 구조로 애플리케이션을 개발하는 것이다.

MovieLister 클래스에서 선언된 MovieFinder 타입의 finder를 초기화하는 방법은 크게 2가지가 있다. 첫 번째는 생성자를 통해 속성을 초기화하는 것이고, 두 번째는 setMovieFinder()와 같은 Setter 메쏘드를 이용하는 것이다. 이러한 설정을 자동화하는 어셈블러를 구현해 놓은 것이 바로 IoC 컨테이너이다.

연관성 삽입은 크게 Constructor Injection, Setter Injection, Interface Injection의 3가지 유형을 가진다. Constructor Injection이 생성자를 이용해서 의존성을 설정해주는 방법이고, Setter Injection이 Setter 메쏘드를 이용해서 의존성을 설정해주는 방법이다. Pico Container는 Constructor Injection을 주로 사용하고, 스프링은 자바 빈 규칙을 이용한 Setter Injection을 주로 사용한다.

스프링의 IoC적인 특징은 AOP를 구현하는 핵심적인 원리가 되기도 한다. AOP는 아직 국내에는 생소한 분야이다. 김대곤님이 작성한 간단한 소개글을 통해 AOP의 개념을 잡아보도록 하자.

자금 이체를 하는 프로그램을 작성한다고 가정해 보자. 출금 계좌와 입금 계좌 그리고 이체 금액을 입력받아 SQL 문장 또는 함수 한 번 돌리는 것으로 모든 프로그래밍이 끝나는가? 그렇지 않다. 해킹을 방지하기 위해 사용자가 적절한 보안 프로그램을 설치했는지 점검하는 코드도 있어야 하고, 사용자가 인증되었는지 점검하는 코드도 써야 하고, 상대방 은행에서 적절하게 처리되었는지도 점점해야 하고, 혹시 사용자가 이체 버튼을 두 번 누른 것은 아닌가 체크해야 하고, 시스템 로그도 남겨야 한다.

즉, 구현하려고 하는 기능 뿐 아니라 보안, 인증, 로그, 성능과 같은 다른 기능들도 녹아 있어야 한다는 뜻이다. 어쩌면 이체를 위한 코드보다 잡다한 다른 측면의 문제들을 다루는 코드가 더 길어질 수 있다. 이런 코드들은 입금이나 출금 같은 다른 곳에서도 공통적으로 사용되는 것이다.

<그림 7> AOP의 개념


구현하려고 하는 비즈니스 기능들을 AOP에서는 Primary(Core) Concern이라는 용어로 표현한다. 보안, 로그, 인증과 같이 시스템 전반적으로 산재된 기능들은 Cross-cutting concern이라고 부른다. AOP는 Cross-cutting concern을 어떻게 다룰 것인가에 대한 새로운 패러다임이라고 할 수 있다.

그럼 AOP가 등장하기 이전에 우리는 어떻게 Cross-cutting Concern을 처리해왔을까? 매우 간단하다. Primary Concern를 구현한 프로그램에 함께 포함시켰다. Primary concern, Cross-cutting concern이 하나의 프로그램 안에 들어가게 되면, 프로그램을 이해하기가 힘들고, Cross-cutting concern 코드가 여기저기에 산재되어 수정하기 힘들게 된다. 당연히 생산성 떨어지고, 품질 떨어지고, 유지보수 비용은 많이 들게 된다.

그럼 AOP는 Cross-cutting concern를 어떻게 처리하는가? AOP에서는 Primary Concern 구현하는 코드 따로, Cross-cutting concern 구현하는 코드도 따로 작성한다. 나중에 2개를 조합한 완벽한 애플리케이션이 만들어지는 것이다.

AOP에서는 Cross-cutting concern 구현한 코드를 Advice라고 하며, Primary concern 구현한 코드를 Code라고 부른다. Code와 Advice를 연결해주는 설정 정보를 Point-cut이라고 하며, 둘을 조합해서 애플리케이션으로 완성하는 과정을 Weaving(조합)이라고 부른다.

기술적 용어로서의 ‘Aspect’는 Advice와 Point-cut을 함께 지칭하는 단어이다. Point-cut은 어떤 Advice를 Code 어느 위치에 둘 것인가 하는 것이다. 스프링의 AOP 패키지는 이러한 AOP 개념을 구현한 것으로, 그 기반에는 설정을 이용으로부터 분리하는 의존성 삽입 패턴이 녹아 있다.

예제 1. 스프링의 WebMVC를 이해하자
이제 스프링을 이해하기 위해 2가지 예제를 살펴볼 것이다. 첫 번째 예제는 스프링 공식 홈페이지에 소개된 것으로 순수하게 스프링이 제공하는 기능만을 이용해서 개발된 예제이다.

국내에는 스프링과 관련한 자료가 전혀 없는 관계로 초보자들을 위해 이 예제를 편역하고 몇 가지 설명을 추가해 총 4부 8개의 강좌로 재구성해서 VSSH 포럼에 등록해 두었다. 자세한 설명을 원하는 독자는 관련 자료를 참고하기 바란다.

여기서 소개하는 예제는 앞에서 소개한 강좌 중 2부까지 구현된 샘플이다. 예제를 실행해보기 위해서는 톰캣과 Ant, JDK 등이 설치되어 있어야 한다. 예제(springapp.zip)를 다운로드한 다음, 작업 디렉토리에서 압축을 풀면 build.properties 파일이 보일 것이다.

해당 파일을 열어 배포될 경로와 톰캣 홈, 그리고 톰캣 관리자의 URL/아이디/패스워드 정보를 자신의 환경에 맞게 변경한다. 그런 다음 build와 deploy 타겟을 ant를 이용해서 순서대로 실행한다. 웹 브라우저를 이용해서 http://localhost:8080/springapp로 접속하면 아래와 같은 결과 화면을 볼 수 있을 것이다.

<그림 8> 스프링 WebMVC 예제화면


우선 예제의 web.xml 설정부터 살펴보도록 하자. DispatcherServlet이 springapp란 이름으로 등록되어 있고, htm으로 끝나는 모든 URL 패턴이 해당 서블릿으로 매핑되어 있다. DispatcherServlet은 스트럿츠의 ActionServlet의 기능과 유사한 일종의 FrontController 서블릿이다.


<web-app>
  <servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
</web-app>


그렇다면 DispatcherServlet이 처리하는 제어 행위를 위한 struts-config.xml과 같은 설정 파일이 필요할 것이다. 스프링 MVC 패키지에서는 그 파일을 해당 서블릿 이름에 "-servlet.xml"을 붙여 작성하도록 권장하고 있다. 앞의 경우 서블릿의 이름을 springapp로 주었기 때문에 springapp-servlet.xml이 설정 파일이 되는 것이다.

설정 파일을 보면, <beans>라는 루트 엘리먼트 밑에 <bean>이라는 설정이 반복되어 적용되고 있다. 이것이 스프링에서 BeanFactory를 이용해서 제공하고 있는 Setter Injection을 통해 설정과 그 사용을 분리하는 방법이다.


<beans>
    <bean id="springappController" class="web.SpringappController">
        <property name="productManager">
            <ref bean="prodMan"/>
        </property>
    </bean>
    <bean id="prodMan" class="bus.ProductManager">
        <property name="products">
            <list>
                <ref bean="product1"/>
                <ref bean="product2"/>
                <ref bean="product3"/>
            </list>
        </property>
    </bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.htm">springappController</prop>
            </props>
        </property>
    </bean>
    ... (생략) ...
</beans>


전체 애플리케이션의 동작 과정을 한번 살펴보자.

<그림 9> 스프링 WebMVC 예제동작 원리


웰컴 파일인 index.jsp에는 hello.htm에 대한 링크가 걸려있다. hello.htm에 대한 요청은 web.xml의 설정에 의해 springapp로 이름지어진 스프링의 web 패키지의 DispatcherServlet으로 전달된다. DispatcherServlet은 스프링의 core 패키지에 있는 BeanFactory를 이용해 IoC 컨테이너의 기본 원리에 따라 동작된다. 설정 파일인 springapp-servlet.xml을 통해 모든 의존성이 결정되어 제어가 반전되는 현상을 볼 수 있다.

<그림 10> VSSH 고객등록 예제화면


우선 <prop key="/hello.htm">springappController</prop>에 의해 hello.htm 요청을 SpringappController 클래스가 처리하게 되는데 그 사실을 DispatcherServlet은 전혀 모른다. SpringappController는 요청을 처리하는 과정에서 ProductManager의 구현을 필요로 하는데, 그게 어떤 클래스의 인스턴스인지를 본인은 모른다. 설정에 의해 자동적으로 bus.ProductManager가 결정되고, 해당 인스턴스가 거꾸로 SpringappController에 찾아와 연결된다. 이러한 제어의 반전이 스프링을 IoC(Inversion of Control) 컨테이너라고 부르게 하는 이유다.

다음 코드는 스트럿츠의 액션과 유사한 역할을 수행하는 Controller 구현 샘플이다. ProductManager를 사용하고 있는데 신기하게도 setProductManager() 메쏘드만 있을 뿐, 인스턴스를 초기화하는 호출이 이루어지지 않는다. 스프링이 빈 설정을 참고해서 자동화하기 때문이다. handleRequest()의 결과로 ModelAndView가 리턴되어 넘어가는데, 이것은 스트럿츠의 ActionForward와 컨텍스트 정보를 합친 것으로 이해하면 되겠다.


public class SpringappController implements Controller {
protected final Log logger = LogFactory.getLog(getClass());
    private ProductManager prodMan;
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String now = (new java.util.Date()).toString();
        logger.info("returning hello view with " + now);
        Map myModel = new HashMap();
        myModel.put("now", now);
        myModel.put("products", getProductManager().getProducts());
        return new ModelAndView("hello", "model", myModel);
    }
    public void setProductManager(ProductManager pm) {
        prodMan = pm;
    }
    public ProductManager getProductManager() {
        return prodMan;
    }
}


예제 2. 스프링과 스트럿츠, 하이버네이트를 통합한 예제
그럼 스프링을 기존의 스트럿츠 환경과 어떻게 연동할 수 있을까? 대표적인 ORM인 하이버네이트와는 어떻게 연동할 수 있을까? 이를 소개하기 위해 간단한 회원 관리 샘플을 개발했다. 이 예제는 벨로시티와 스트럿츠, 스프링, 하이버네이트를 통합하고자 하는 VSSH의 최종적인 모습을 보여주며, DBMS는 HSQLDB를 사용했다.

예제 파일(vssh.zip)을 다운받아 자신의 작업 디렉토리에 압축을 풀고, was.properties 파일을 열어 자신의 운영 환경에 맞게 경로를 수정한다. 그런 다음, ant를 이용해서 makeDist, war-deploy 태스크를 순서대로 실행하면 빌드 및 배포 과정이 끝난다. 웹 브라우저를 이용해서 http://localhost:8080/vssh-b01에 접속하면 아래와 같은 결과 화면을 볼 수 있을 것이다.

이 예제는 다음 강좌에서 다시 자세히 설명할 예정인데, 미리 상세한 내용을 알고 싶은 분은 LoveLazur의 홈페이지를 참고하기 바란다. 이번 예제부터는 복잡하기 때문에 이클립스와 같은 오픈소스 IDE를 이용하는 것이 좋다.

스트럿츠와 스프링의 연동 방법은 각각을 이해하고 있다면 아주 간단히 처리된다. WEB-INF/lib 디렉토리에 각각의 라이브러리 JAR 파일을 추가한 다음, 스트럿츠 설정 파일인 struts-config.xml에 플러그인 설정만 하나 추가하면 되는 것이다. 플러그인으로 설정한 ContextLoader는 전달된 설정 파일을 이용해서 전체 애플리케이션 구성에 사용될 ApplicationContext를 구성하는 역할을 수행한다.


<struts-config>
<form-beans> ... </form-beans>
<action-mappings> ... </action-mappings>
<message-resources parameter="messages"/>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
     <set-property property="contextConfigLocation"
            value="/WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml"/>
</plug-in>
</struts-config>


applicationContext.xml에는 애플리케이션 로직과 관련된 객체들을 앞서 설명한 빈 설정 방식으로 연동해서, 제어 역행화가 이루어지도록 하면 된다.


<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>org.hsqldb.jdbcDriver</value>
</property>
<property name="url"><value>jdbc:hsqldb:data/vsshdb</value></property>
<property name="username"><value>sa</value></property>
<property name="password"><value></value></property>
</bean>
  <!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list><value>model/Customer.hbm.xml</value></list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<!-- Transaction manager , can replace class Attribute ex.Transaction-->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="customerDAO" class="dao.CustomerDAOImpl">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>    
</beans>


주의할 점은 모든 클래스에서 사용되는 객체 참조에서 항상 자바 빈 규칙에 따르는 setter()를 만들고, 직접 인스턴스를 초기화하지 않고 객체들의 의존성을 설정 파일에 적어줌으로써 스프링이 자동으로 의존성 관계를 삽입하도록 해야 한다는 것이다.

다음의 CustomerAction을 살펴보면 ICustomerBizManager 타입의 cmgr이라는 인스턴스를 갖고 있는데, setCustomermanager()란 메쏘드만 있을 뿐 어디에도 초기화하는 루틴이 포함되어 있지 않다. 그런데도 cmgr.createCustomer()를 사용하고 있는 것을 볼 수 있다.


public class CustomerAction extends BaseAction {
private ICustomerBizManager cmgr = null;
public void setCustomerManager(ICustomerBizManager cmgr) { //def.
this.cmgr = cmgr;
}
public ActionForward list(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
request.setAttribute("custlist", cmgr.getCustomers());
return mapping.findForward("list");
}
public ActionForward create(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
DynaActionForm custForm = (DynaActionForm) form;
cmgr.createCustomer((Customer) custForm.get("cust"));
ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
                "cust.saved"));
return list(mapping, form, request, response);
}
}


이것은 action-servlet.xml과 applicationContext.xml에서 다음과 같은 설정이 되어 있으므로 그 정보에 따라 적절한 customerManager가 결정되기 때문에 가능해진다.


<beans>
<bean name="/cust" class="control.CustomerAction" singleton="false">
<property name="customerManager">
<ref bean="customerBizManager"/>
</property>
</bean>
<bean id="customerBizManager"
        class="org.springframework.transaction.interceptor.
TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="customerBizManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>    
</beans>


대안 기술에 대해 관심을 갖자
지금까지 스프링 프레임워크의 필요성을 설명하고, 기본 개념이라 할 수 있는 연관성 삽입 패턴과 AOP에 대해 간단히 살펴보았다. 또한 스프링의 특징과 스프링을 활용한 예제를 소개했다. 스프링이 아직 국내에 소개된 적이 없다보니 외국의 문서와 예제, 서적들을 뒤적거리면서 관련 자료를 정리하는데 한달이 넘는 시간이 소요되었다.

하지만 아쉽게도 그동안 정리한 내용을 모두 소개하기에는 할당된 지면이 너무 부족해 꼭 필요한 부분만을 알려주는데 그친 듯하다. 설명이 미흡한 부분은 필자들의 VSSH 포럼을 활용하고, 궁금한 점이 있으면 언제든 질문해 주기 바란다.

솔직히 말해 이 글을 쓰고 있는 필자도 여러분보다 몇 달 먼저 스프링을 공부한 정도의 수준밖에 되지 않는다. 미국, 일본, 중국, 독일 어디서나 스프링 관련 자료를 쉽게 구할 수 있었지만, 안타깝게도 국내에는 전혀 자료가 없었다.

해외에서는 크게 주목을 받고 있는 스프링과 IoC 컨테이너에 대한 내용들이 왜 국내에서는 전혀 다루어지지 않고 있는지를 곰곰이 생각해본다. 우리네 개발자들은 촉박한 개발 일정에 쫓겨 신기술이나 대안 기술들을 공부할 만큼 다들 여유가 없는 것일까? 아니면 그러한 기술을 이미 익히고 있는 개발자들이 자신의 머리 속에 그 지식을 꼭꼭 숨겨두고 공개하지 않는 것일까?

지금 자바 커뮤니티는 주류 기술의 버전 향상과 신기술의 출현 그리고 오픈소스 기반의 다양한 대안 기술의 등장으로 어느 때보다 급격한 기술 변화를 눈앞에 두고 있다. 아직 그러한 변화를 느끼지 못하고 있는 개발자라면 지금이 바로 그러한 변화에 대한 대비를 시작해야 할 때임을 깨달아야 한다. 또한, 그 과정에서 얻어진 노하우를 공유함으로써 더 큰 이익이 자신에게 돌아온다는 사실도 잊지 말기 바란다. @

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이