์๋ ํ์ธ์,
https://github.com/zammad/zammad/issues/1467 ์ธ์๋ OTRS ๋ฐ์ดํฐ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ํฌ๊ธฐํ์ง ์์ต๋๋ค.
(์ค๋๋ ํฐ์ผ์ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค)
์ง๋ฌด:
zammad 2.5์์๋ OTRS ๋ฐ์ดํฐ (~ 6000 ํฐ์ผ.
๊ฒฐ๊ณผ:
1 :
WebGUI๋ฅผ ํตํ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ์ ์ ํ ๊ฐ์ ธ ์ค๊ธฐ ํ๋ก์ธ์ค๊ฐ ์ค์ง๋์์ต๋๋ค. ์๊ฐ ์ด๊ณผ์ ๊ฐ์ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น?
์๋ํด๋ณด์ญ์์ค :
์ฝ์์ ํตํ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ๋ ์ข์์ง ๋ง ๋ค์ ์ค๋ฅ (์๋ ์์ธ ์ฐธ์กฐ)์ ํจ๊ป ๊ฑฐ๋ํ ๋ณธ๋ฌธ (๋๋ ์ด๊ฒ์ด ์ฒจ๋ถ ํ์ผ์ด๋ผ๊ณ ๊ฐ์ )์ด์๋ ํฐ์ผ์์ ๊ฐ์ ธ ์ค๊ธฐ์ ์คํจํ์ต๋๋ค. ๋ค์ ๋ช
๋ น์ ์คํํ์ต๋๋ค.
๋ฒ๋ค exec ๋ ์ผ c
Setting.set ( 'import_otrs_endpoint', 'http://123.456.789.012/otrs/public.pl?Action=ZammadMigrator')
Setting.set ( 'import_otrs_endpoint_key', 'IhAvEaVeRySeCrEtKeY')
Setting.set ( 'import_mode', true)
Setting.set ( 'system_init_done', false)
Import :: OTRS.start
์ง๋ฌธ :
์น์ ํ๋
MrDigit
์์ธ ์ถ์ :
W, [2018-07-01T12:58:20.356829 #76] WARN -- : zammad-memcached:11211 failed (count: 0) RuntimeError: Already writing to socket
/opt/zammad/app/models/ticket/article.rb:301:in `check_body': body if article is to large, 3702347 chars - only 1500000 allowed (Exceptions::UnprocessableEntity)
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:413:in `block in make_lambda'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:197:in `block (2 levels) in halting'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:601:in `block (2 levels) in default_terminator'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:600:in `catch'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:600:in `block in default_terminator'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:198:in `block in halting'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:507:in `block in invoke_before'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:507:in `each'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:507:in `invoke_before'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:130:in `run_callbacks'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:827:in `_run_create_callbacks'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/callbacks.rb:340:in `_create_record'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/timestamp.rb:95:in `_create_record'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/persistence.rb:559:in `create_or_update'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/callbacks.rb:336:in `block in create_or_update'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:131:in `run_callbacks'
from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:827:in `_run_save_callbacks'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/callbacks.rb:336:in `create_or_update'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/persistence.rb:129:in `save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/validations.rb:44:in `save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/attribute_methods/dirty.rb:35:in `save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:308:in `block (2 levels) in save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:384:in `block in with_transaction_returning_status'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `block in transaction'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:194:in `block in within_new_transaction'
from /usr/local/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:191:in `within_new_transaction'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `transaction'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:210:in `transaction'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:381:in `with_transaction_returning_status'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:308:in `block in save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:323:in `rollback_active_record_state!'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/transactions.rb:307:in `save'
from /usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/suppressor.rb:42:in `save'
from /opt/zammad/lib/import/otrs/article.rb:64:in `create'
from /opt/zammad/lib/import/otrs/article.rb:49:in `create_or_update'
from /opt/zammad/lib/import/otrs/article.rb:37:in `import'
from /opt/zammad/lib/import/otrs/article.rb:31:in `initialize'
from /opt/zammad/lib/import/base_factory.rb:35:in `new'
from /opt/zammad/lib/import/base_factory.rb:35:in `create_instance'
from /opt/zammad/lib/import/base_factory.rb:11:in `block in import_action'
from /opt/zammad/lib/import/base_factory.rb:39:in `each'
from /opt/zammad/lib/import/base_factory.rb:39:in `import_loop'
from /opt/zammad/lib/import/base_factory.rb:9:in `import_action'
from /opt/zammad/lib/import/otrs/ticket.rb:40:in `import'
from /opt/zammad/lib/import/otrs/ticket.rb:30:in `initialize'
from /opt/zammad/lib/import/base_factory.rb:35:in `new'
from /opt/zammad/lib/import/base_factory.rb:35:in `create_instance'
from /opt/zammad/lib/import/base_factory.rb:11:in `block in import_action'
from /opt/zammad/lib/import/base_factory.rb:39:in `each'
from /opt/zammad/lib/import/base_factory.rb:39:in `import_loop'
from /opt/zammad/lib/import/base_factory.rb:9:in `import_action'
from /opt/zammad/lib/import/otrs.rb:147:in `import_action'
from /opt/zammad/lib/import/otrs.rb:137:in `imported?'
from /opt/zammad/lib/import/otrs.rb:101:in `block (3 levels) in threaded_import'
from /opt/zammad/lib/import/otrs.rb:95:in `loop'
from /opt/zammad/lib/import/otrs.rb:95:in `block (2 levels) in threaded_import'
from /usr/local/bundle/gems/logging-2.2.2/lib/logging/diagnostic_context.rb:474:in `block in create_with_logging_context'
์๋ ํ์ธ์ @MrDigit , ์ด๋ค DB๋ฅผ ์ฌ์ฉํ ๊น์? DB์์ ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ก๊ทธ์์ ๋ค์ ์ค์ ์ฐธ์กฐํ์ญ์์ค.
/opt/zammad/app/models/ticket/article.rb:301:in check_body': body if article is to large, 3702347 chars - only 1500000 allowed (Exceptions::UnprocessableEntity) from /usr/local/bundle/gems/activesupport-5.1.5/lib/active_support/callbacks.rb:413:inblock in make_lambda'
์๋ ํ์ธ์ @NeverMin ,
์ ํ์ด article.rb์ ํ๋ ์ฝ๋ฉ๋๊ธฐ ๋๋ฌธ์์ด ์ค๋ฅ๋ ์ ํํ DB ๋ฐฑ์๋์ ๊ด๊ณ์์ด ๋ฐ์ํฉ๋๋ค.
( ์ ํ = 1_500_000 , ์๋ ์ฐธ์กฐ)
def check_body
return true if body.blank?
limit = 1_500_000
current_length = body.length
return true if body.length <= limit
raise Exceptions::UnprocessableEntity, "body if article is to large, #{current_length} chars - only #{limit} allowed" if !ApplicationHandleInfo.postmaster?
logger.warn "WARNING: cut string because of database length #{self.class}.body(#{limit} but is #{current_length})"
self.body = body[0, limit]
end
์๋ ํ์ธ์ @MrDigit , ์, ์์ (์ : 4_000_000)ํ๊ณ ์๋ ํ ์ ์์ง๋ง Zammad์ ์ฌ์ฉํ DB๋ ๋ฌด์์ ๋๊น? MySQL ๋๋ postgresql? OTRS ๋ฒ์ ์ ๋ฌด์์ ๋๊น?
์๋ ํ์ธ์ @NeverMin ,
์ด๋ฏธ ํ๋๋ฅผ ๋ ๋์ ๊ฐ์น๋ก ์ฌ๋ ธ๊ณ ์์ ์ ๋์ค์ ์๋ํ์ต๋๋ค. ์ง๋ฌธ์ ์ ์ ํ์ด 1,5 MByte๋ก ์ค์ ๋์ด ์์ต๋๊น? ๋ ํฐ ๋ชธ์ฒด๊ฐ ์ ์ฅ๋๋ฉด zammad๊ฐ ํญ๋ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ ์ด๊ฒ์ ๋จ์ํ ์์์ ๊ฐ์ ๋๊น?
๊ทํ์ ์ง๋ฌธ์ ๊ดํด์ : ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ zammad์ docker-compose ๋ฒ์ (https://github.com/zammad/zammad-docker-compose)์ postgresql์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ฒจ๋ถ ํ์ผ์ ํ์ผ ์์คํ ์ ์ ์ฅํ๊ณ ์์ต๋๋ค. OTRS๋ ๋ฒ์ 5์ ๋๋ค.
์๋ ํ์ธ์ @MrDigit , ์ข์ ์ง๋ฌธ์ ๋๋ค. @thorsteneckel ์๊ฒ ๋ฌผ์ด
JFI : https://github.com/zammad/zammad/blob/develop/db/migrate/20120101000010_create_ticket.rb#L175
ํธ์ง :
์ด ๋ฌธ์ ๋ฅผ ์ปค๋ฎค๋ํฐ ๋ก ์ด๋ํ ์ ์์ต๋๊น?
์๋ ํ์ธ์ @MrDigit
์ง๋ฌธ์ ์ ์ ํ์ด 1,5 MByte๋ก ์ค์ ๋์ด ์์ต๋๊น?
๋๋์ด ๊ฐ์น๊ฐ ์์ ์ด๊ณ ์๋ง๋ ์ธ๋ชจ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. ๊น์ด ํ๊ณ ๋ค์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฌ๊ธฐ์์ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์์ธํ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ OTRS ๊ฐ์ ธ ์ค๊ธฐ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ฌ๋ฌ ์ง์ ์์ ๋ฐ์ํฉ๋๋ค.
์ด๋ฅผ ์ฌํํ๋ ค๊ณ ํ ๋ 15000 ์๋ผ๋ ์ค๋ฅ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค (์ฐธ๊ณ : UI๊ฐ ๋ง์์ ๋ค์ง ์์ ์ฌ๊ธฐ์์ API๋ก ์ ํํด์ผํ์ต๋๋ค).
F, [2019-07-03T16:36:15.330582 #18433-86302140] FATAL -- :
F, [2019-07-03T16:36:15.330620 #18433-86302140] FATAL -- : actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:115:in `rescue in parse_formatted_parameters'
actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:109:in `parse_formatted_parameters'
actionpack (5.1.7) lib/action_dispatch/http/request.rb:361:in `block in POST'
rack (2.0.7) lib/rack/request.rb:59:in `fetch'
rack (2.0.7) lib/rack/request.rb:59:in `fetch_header'
actionpack (5.1.7) lib/action_dispatch/http/request.rb:360:in `POST'
actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:53:in `parameters'
actionpack (5.1.7) lib/action_dispatch/http/filter_parameters.rb:41:in `filtered_parameters'
actionpack (5.1.7) lib/action_controller/metal/instrumentation.rb:21:in `process_action'
actionpack (5.1.7) lib/action_controller/metal/params_wrapper.rb:252:in `process_action'
activerecord (5.1.7) lib/active_record/railties/controller_runtime.rb:22:in `process_action'
actionpack (5.1.7) lib/abstract_controller/base.rb:124:in `process'
actionview (5.1.7) lib/action_view/rendering.rb:30:in `process'
actionpack (5.1.7) lib/action_controller/metal.rb:189:in `dispatch'
actionpack (5.1.7) lib/action_controller/metal.rb:253:in `dispatch'
actionpack (5.1.7) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack (5.1.7) lib/action_dispatch/routing/route_set.rb:31:in `serve'
actionpack (5.1.7) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (5.1.7) lib/action_dispatch/journey/router.rb:33:in `each'
actionpack (5.1.7) lib/action_dispatch/journey/router.rb:33:in `serve'
actionpack (5.1.7) lib/action_dispatch/routing/route_set.rb:844:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/strategy.rb:192:in `call!'
omniauth (1.9.0) lib/omniauth/strategy.rb:169:in `call'
omniauth (1.9.0) lib/omniauth/builder.rb:64:in `call'
rack (2.0.7) lib/rack/etag.rb:25:in `call'
rack (2.0.7) lib/rack/conditional_get.rb:38:in `call'
rack (2.0.7) lib/rack/head.rb:12:in `call'
rack (2.0.7) lib/rack/session/abstract/id.rb:232:in `context'
rack (2.0.7) lib/rack/session/abstract/id.rb:226:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/cookies.rb:613:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/callbacks.rb:26:in `block in call'
activesupport (5.1.7) lib/active_support/callbacks.rb:97:in `run_callbacks'
actionpack (5.1.7) lib/action_dispatch/middleware/callbacks.rb:24:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
railties (5.1.7) lib/rails/rack/logger.rb:36:in `call_app'
railties (5.1.7) lib/rails/rack/logger.rb:24:in `block in call'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:69:in `block in tagged'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:69:in `tagged'
railties (5.1.7) lib/rails/rack/logger.rb:24:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/request_id.rb:25:in `call'
rack (2.0.7) lib/rack/method_override.rb:22:in `call'
rack (2.0.7) lib/rack/runtime.rb:22:in `call'
activesupport (5.1.7) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/static.rb:125:in `call'
rack (2.0.7) lib/rack/sendfile.rb:111:in `call'
railties (5.1.7) lib/rails/engine.rb:522:in `call'
railties (5.1.7) lib/rails/railtie.rb:185:in `public_send'
railties (5.1.7) lib/rails/railtie.rb:185:in `method_missing'
puma (3.12.1) lib/puma/configuration.rb:227:in `call'
puma (3.12.1) lib/puma/server.rb:660:in `handle_request'
puma (3.12.1) lib/puma/server.rb:474:in `process_client'
puma (3.12.1) lib/puma/server.rb:334:in `block in run'
puma (3.12.1) lib/puma/thread_pool.rb:135:in `block in spawn_thread'
logging (2.2.2) lib/logging/diagnostic_context.rb:474:in `block in create_with_logging_context'
API ์๋ต์ด ๋น์ด ์์ต๋๋ค.
Zammad๊ฐ ๋ด ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ API๋ฅผ ์์ ์ ํ๊น์ง ๋ฐ์ด ๋ฃ์ ์๋ ์์์ต๋๋ค.
1500001
๋ฌธ์ (๋ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ ๋๋ฌด ์ข์ํ์ง ์์)๋ก ์๋ํ ํ 15000
๋ฌธ์ (์ด ๊ฐ์ Zammad ๋ด์์ ๋ถ์ฌ ๋ฃ์ ์ ์์)๋ก ์๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ฌ๊ฐ ๋๋ฌด ์ปค์ง๋ฉด ํ์ด์คํธ ๋ณต์ฉ์ด ์ค๋จ๋ฉ๋๋ค.
1500001
๋ 1.5MB๊ฐ ์๋๋ผ ์ฝ 1.14MB๋ก ์ ํ๋ ์์ต๋๋ค. ์ฝ 494320
๋ฌธ์ (์ผ๋ฐ ํ
์คํธ!)๋ฅผ ๋ถ์ฌ ๋ฃ์ ์ ์์ง๋ง ๋์ค์ ์๋ ์
๋ ฅ์ด ๊ณ์ ์๋ํฉ๋๋ค. ์ฑ๊ณตํ์ง ๋ชปํ ๊ณณ์์ ๋ ํฐ ๊ฐ์ฌ๋ฅผ๋๋ฆฝ๋๋ค.
์๋ํ๋ ๋์์ด ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. https://www.loremipsum.de/index_e.html
์๋
ํ์ธ์,
๋๋ ํ๊ณ๋ฅผ ๋น๋ ํ๊ณ ์ด ๋ฌธ์ ๊ฐ ํ๊ณ์ ์ด์ ์
๋๋ค.
https://github.com/zammad/zammad/issues/1390
๋ด ์ชฝ์์ 1.5MB๋ ๊ด์ฐฎ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ํฐ ๋ด์ฉ์ ์ด์จ๋ ๋ฌธ์ ๊ฐ์๋ ๊ณณ์ ์ฒจ๋ถ ํ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค๋ค. ํ ๊ณ ๊ฐ์ด docx๊ฐ ๋ด์ฅ ๋ otrs ๊ธฐ์ฌ ๊ฐ์ ธ ์ค๊ธฐ์ ์คํจํ์ฌ ๊ธฐ์ฌ๋ฅผ ๋ง๊ฐ ๋จ ๋ ธ์ต๋๋ค (35,000 ๊ฐ ํฐ์ผ ์ค 1 ๊ฐ). ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝํ ์ธ ๊ฐ ์์ต๋๋ค. ๋ฉ์ผ ์๋ฒ / ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ๋ ๋์ ๊นจ๋จ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
์์ ์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ณ๊ฒฝํ๋ฏ๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๊ฐ์ด 1.5MB๋ก ์๋ผ์ ์์ ํฉ๋๋ค. ๋ํ ์ ํ์ 1.14MB-> 1.5MB๋ก ์์ ํด์ผํฉ๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋ ์ํํ๊ฒ ์คํ๋๊ณ ์์ธ ๋ฐ์์ ๋ฐฉ์งํด์ผํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ธฐ์ฌ๋น 150 ๋ง ์๋ก ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. @MrGeneration์ด ์ง์ ํ๋ฏ์ด UI๋ ์ด์จ๋ (ํจ์ฌ ์ ์) ์์ ๋ฌธ์ ํ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. MB / KB ์ธก๋ฉด์์ ์ค์ ํฌ๊ธฐ๊ฐ ์๋๋ผ ๋ฌธ์ ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์๋ ๋ฌธ์ ๋ ์ด์ ์์ ๋์์ผ๋ฉฐ Zammad 3.5 ๐์์ ์ฌ์ฉํ ์ค๋น๊ฐ๋์์ต๋๋ค.