#444 19개의 스레드 ✕ 해제
이온디
이온디 1개월 전
시리즈 ← 이전 편 바이브코딩의 위험성 ③ — 사람은 잊지만 코드는 잊지 않는다 사고는 위험한 자유의 부산물이 아니라, 안전망 부재의 결과다. — 시리즈 3편 / 회고와 안전망 설계 바이브코딩의 양면성 "바이브코딩(vibe coding)"이라는 말이 유행어가 되었다. AI에게 분위기와 의도만 던져주면 코드가 술술 나오는, 자연어로 개발하는 시대. 코드 한 줄 모르는 사람도 며칠이면 자기 사이트를 만든다. 우리는 더 이상 if-else나 for-loop을 외울 필요가 없다. 그 자리에 들… 시리즈 ← 이전 편 바이브코딩의 위험성 ③ — 사람은 잊지만 코드는 잊지 않는다 사고는 위험한 자유의 부산물이 아니라, 안전망 부재의 결과다. — 시리즈 3편 / 회고와 안전망 설계 바이브코딩의 양면성 "바이브코딩(vibe coding)"이라는 말이 유행어가 되었다. AI에게 분위기와 의도만 던져주면 코드가 술술 나오는, 자연어로 개발하는 시대. 코드 한 줄 모르는 사람도 며칠이면 자기 사이트를 만든다. 우리는 더 이상 if-else나 for-loop을 외울 필요가 없다. 그 자리에 들어선 건 기획·아이디어·도메인 이해다. 좋은 시대가 온 게 맞다. 그런데 좋은 시대는 새로운 종류의 사고도 함께 들고 온다. 이번 사고가 바로 그 예시였다. 평범한 모델 파일 하나를 추가하면서, alembic env.py에 import 한 줄을 추가하지 않았다. 그것 하나로 1091줄짜리 폭탄 마이그레이션이 만들어졌다. 사람은 한 줄을 잊었을 뿐인데, 자동화 도구는 그 망각을 30개 테이블의 DROP 문으로 증폭시켰다. AI 도구든 alembic 같은 자동화 스크립트든, 자동화는 인간의 실수를 대신 봐주지 않는다. 오히려 증폭시킨다. "조심하자"는 답이 아니다 가장 흔한 사후 대처는 "다음부터 조심하자"다. 그리고 가장 자주 실패하는 대처도 "다음부터 조심하자"다. env.py에 import를 빠뜨렸을 때 누구도 일부러 그런 게 아니다. 새 모델 추가하느라 정신없는 와중에, env.py라는 한참 떨어진 파일을 동시에 떠올리는 게 어려웠을 뿐이다. 인간은 작업 중에 컨텍스트를 좁힌다. 그게 결함이 아니라 본성이다. 그래서 답은 사람의 주의력에 의존하지 않는 구조다. 인간이 잊을 수 있는 자리를 자동화로 채우는 것. 이번 사고에서 우리가 한 일은 사실 그 한 가지였다. for _info in pkgutil.iter_modules(_models_pkg.__path__): if _info.name.startswith("_") or _info.name == "base": continue importlib.import_module(f"app.models.{_info.name}") 이 6줄이 의미하는 바는 단순하다. 누구도 더 이상 import를 까먹을 수 없다. 모델 파일이 디렉터리에 있으면 자동으로 잡힌다. 잊을 수 있는 자리 자체를 없앤 것이다. 3중 방어 — 사고를 몇 단계에서 막을 것인가 좋은 시스템은 한 군데에서 막는 게 아니라, 여러 군데에서 같은 사고를 잡는다. 첫 번째 방어선이 뚫려도 두 번째가 있고, 두 번째가 뚫려도 세 번째가 있어야 한다. 이번 일을 계기로 마이그레이션 사고에 대한 3중 방어를 설계했다. 1차 방어 — 모델 메타데이터 자동 등록 방금 본 그것. 누락 자체가 일어나지 않도록 구조를 바꾼다. 2차 방어 — Pre-commit gate 혹시라도 1차가 뚫려서 위험한 마이그레이션이 만들어졌다면, commit 단계에서 차단한다. 신규 마이그레이션 파일에 drop_table이나 drop_index가 일정 개수 이상이면 git이 commit을 거부하도록 한다. # .git/hooks/pre-commit NEW_MIGRATIONS=$(git diff --cached --name-only --diff-filter=A | grep '^alembic/versions/.*\.py$') for f in $NEW_MIGRATIONS; do DROPS=$(grep -cE "drop_table|drop_index" "$f") if [ "$DROPS" -ge 3 ]; then echo "❌ $f 에 drop 작업이 $DROPS 건 있습니다. 의도된 변경인지 확인하고 --no-verify로 우회하세요." exit 1 fi done 3차 방어 — Pre-deploy gate 다른 사람이 다른 환경에서 commit한 게 production까지 흘러왔다고 해도, 배포 직전에 한 번 더 막는다. 배포 스크립트(server.sh)에서 alembic upgrade를 돌리기 전에 dry-run을 먼저 시킨다. SQL=$(alembic upgrade --sql current:head) if echo "$SQL" | grep -qE "DROP TABLE|TRUNCATE"; then echo "❌ 배포 중단 — 위험한 SQL 감지" exit 1 fi alembic upgrade head 이 세 단계 중 어느 한 곳도 사람의 주의력에 의존하지 않는다. 자고 있어도, 출근길에 정신없어도, 이미 쳤던 명령을 의식 없이 다시 쳐도 — 안 터진다. 백업 자동화와 binlog 이번 사고에서 가장 손발이 묶였던 순간은 binlog가 OFF라는 걸 확인했을 때였다. 점-시간 복구라는, 데이터베이스의 마지막 안전망이 처음부터 없었던 것이다. binlog는 MySQL의 변경 이력을 별도 파일에 기록하는 기능이다. 이게 켜져 있으면 "어제 14:50:59 시점으로 복구해줘"가 가능하다. 꺼져 있으면 그냥 마지막 백업 시점까지밖에 못 돌아간다. 켜는 건 한 줄이다. /etc/mysql/mysql.conf.d/mysqld.cnf에: log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 7 expire_logs_days = 7이 중요하다. 안 적으면 binlog가 무한히 쌓여서 디스크가 꽉 찬다. 7일이면 보통의 사고 추적엔 충분하고, 디스크 부담도 적다. 그리고 binlog가 있어도 풀 백업은 따로 필요하다. 복구는 "풀 백업 + 그 이후의 binlog" 조합으로 이뤄지기 때문이다. 풀 백업은 cron으로 자동화한다. # 매일 새벽 3시 백업 0 3 * * * /home/.../scripts/db_backup.sh >> /home/.../private/backup.log 2>&1 # 매일 새벽 3시 30분, 14일 이전 백업 자동 삭제 30 3 * * * find /home/.../private/ -name '*-*.sql.gz' -mtime +14 -delete 이 두 줄이면 매일 새벽 백업이 만들어지고, 14일 이전 백업이 자동 정리된다. 한 번 설정하면 잊고 살아도 된다. 디테일이 안전을 만든다 이번 작업에서 사소해 보이지만 중요했던 디테일들을 적어둔다. set -euo pipefail — 백업 스크립트 첫 줄. 한 줄이라도 실패하면 즉시 멈춘다. 이게 없으면 mysqldump가 중간에 실패해도 gzip은 부분 데이터를 압축하면서 "성공" 종료 코드를 반환할 수 있다. 부분 백업은 백업이 아니다. 이 한 줄이 그 차이를 만든다. --single-transaction — InnoDB에서 락 없이 일관된 스냅샷을 떠준다. production 트래픽에 영향을 거의 안 주면서 데이터 일관성을 보장. --routines --triggers --events — 이걸 빼먹으면 트리거·뷰·저장 프로시저가 백업에 안 들어간다. 복원 후에 알 수 없는 동작이 사라진 채로 운영되는 상황이 생긴다. OUT_DIR="$HOME/web/.../private" — 절대 경로 대신 $HOME을 쓰면 다른 서버나 다른 계정에서도 그대로 동작한다. 그리고 백업 위치가 웹에서 노출되지 않는 디렉터리인지 반드시 확인한다. chmod +x를 로컬에서 미리 — rsync는 파일 권한을 그대로 복사한다. 로컬에서 +x를 안 했으면 production에서 또 chmod를 해야 한다. 작은 일이지만, 매번 잊는 종류의 일이다. ~/.ssh/config 별칭 등록 — 매번 풀 도메인 치는 대신 ssh mars 한 단어로 접속. 작은 편의지만, 이런 작은 마찰이 쌓이면 보안 작업도 귀찮아진다. (NEUTRALIZED) 같은 명시적 표시 — 비운 마이그레이션의 docstring 첫 줄에 이렇게 넣어두면, dry-run 출력에도 그대로 떠서 "지금 처리되는 게 무력화된 파일이 맞다"는 즉각적인 시각 확인이 된다. 6개월 뒤의 자기 자신을 위한 친절. 이런 디테일들은 하나하나는 사소하지만, 사고 한가운데에서 마음을 가라앉히는 건 결국 이런 작은 확실성들이다. 다 끝난 뒤에 남은 것 이번 사고로 잃은 데이터는 단순 로그 정도였고 다시 채울 수 있는 수준이었다. 하지만 만약 폭탄이 발견되지 않은 채 다음 배포 때 터졌다면? 그땐 30개 테이블이 진짜로 사라졌을 것이다. 그중에는 단순 로그만 있는 게 아니었다 — 고객 관리, 마케팅 캠페인, 뉴스레터 구독자, 게시판 SEO 설정 같은, 다시 채우려면 외부 자료 없이는 불가능한 데이터들이 섞여 있었다. 운이 좋았다. 그런데 운이 좋았다는 건 시스템이 안전했다는 게 아니라, 단지 이번엔 누군가 일찍 알아챘다는 뜻일 뿐이다. 다음 사고는 늦게 발견될 수도 있다. 자동화의 시대에는, 사고가 너무 빨리 너무 광범위하게 퍼진다. 알아챈 시점엔 이미 늦은 경우가 많다. 그래서 우리는 안전망을 코드에 박아둔다. env.py의 자동 import, pre-commit hook, pre-deploy gate, 매일 백업, binlog. 사람은 잊지만 코드는 잊지 않으니까. 바이브코딩이 위험한 게 아니다. 안전망 없는 자동화가 위험한 것이다. 자연어로 개발하는 시대에, 우리가 새로 배워야 할 건 아마 코드 그 자체가 아니라 — 자동화의 사각지대를 미리 메우는 감각일 것이다. 당신의 바이브코딩은 안전한가요? AI에게 코드를 맡겼다면, 안전망도 같이 맡겼는지 한 번 점검해보세요. 7가지 항목으로 끝나는 무료 자가 진단. 바이브코딩 안전 체크리스트 받기 → 시리즈 끝. 다음에는 더 안전한 코드로 만나길.
이온디
이온디 1개월 전
시리즈 ← 이전 편 · 다음 편 → 바이브코딩의 위험성 ② — 범인은 autogenerate였다 1091줄짜리 시한폭탄을 만든 건 사람이 아니라 자동화 도구 자신이었다. — 시리즈 2편 / 진짜 원인 발견과 해체 작업 Alembic autogenerate가 그러는 이유 Alembic은 SQLAlchemy 기반 프로젝트의 마이그레이션 도구다. alembic revision --autogenerate라는 명령을 치면, 현재 모델 정의(SQLAlchemy Base.metadata)와 실제… 시리즈 ← 이전 편 · 다음 편 → 바이브코딩의 위험성 ② — 범인은 autogenerate였다 1091줄짜리 시한폭탄을 만든 건 사람이 아니라 자동화 도구 자신이었다. — 시리즈 2편 / 진짜 원인 발견과 해체 작업 Alembic autogenerate가 그러는 이유 Alembic은 SQLAlchemy 기반 프로젝트의 마이그레이션 도구다. alembic revision --autogenerate라는 명령을 치면, 현재 모델 정의(SQLAlchemy Base.metadata)와 실제 DB 스키마를 비교해서 그 차이를 마이그레이션 파일로 자동 생성해준다. 컬럼 추가, 인덱스 추가, 테이블 추가 같은 변경을 사람이 손으로 SQL을 적지 않아도 되게 해주는 편리한 도구다. 문제는 이 비교의 방향성이다. Alembic은 "모델에는 있는데 DB에 없는 것"을 추가 작업으로 인식하고, 동시에 "DB에는 있는데 모델에 없는 것"을 삭제 작업으로 인식한다. 후자가 함정이다. Base.metadata에 어떤 모델이 등록되지 않은 상태에서 autogenerate를 돌리면, 실제로는 코드 어딘가에 살아 있는 모델이라도 alembic 입장에선 "사라진 테이블"이 된다. 그러면 친절하게 op.drop_table('...')을 자동으로 만들어준다. alembic/env.py를 열어봤다. from app.models import document, member, comment, file, module, site_config, site from app.models import hosting_site, hosting_subscription, project, inquiry, member_profile from app.models import sale_product, order, revenue, settlement from app.models import project_issue, kakao_chat, project_billing, project_file, project_comment 손으로 적은 import가 21개. 그런데 app/models/ 디렉터리에는 모델 파일이 57개. 빠진 36개의 정체: audit_log.py bank_transaction.py blog_post.py client.py hosting_setup_log.py marketing.py notification_log.py spam.py wiki.py analytics_report.py module_group.py newsletter.py ... 폭탄 마이그레이션이 DROP하려던 그 테이블들이, 정확히 env.py에서 import 누락된 모델 파일들과 일치했다. .title { font-size: 22px; font-weight: 700; fill: #111; } .subtitle { font-size: 14px; fill: #666; } .label { font-size: 14px; fill: #222; font-weight: 500; } .num { font-size: 28px; font-weight: 700; } .small { font-size: 12px; fill: #555; } .bad { fill: #c83737; } .good { fill: #1f7a3f; } .arrow { stroke: #777; stroke-width: 1.6; fill: none; } .arrow-bad { stroke: #c83737; stroke-width: 1.8; fill: none; stroke-dasharray: 4 3; } .arrow-good { stroke: #1f7a3f; stroke-width: 1.8; fill: none; } .box { stroke: #ccc; stroke-width: 1; fill: #fff; rx: 8; } .box-bad { stroke: #e0a8a8; stroke-width: 1; fill: #fff5f5; rx: 8; } .box-good { stroke: #a8d4b8; stroke-width: 1; fill: #f3faf5; rx: 8; } .row-label{ font-size: 13px; fill: #888; font-weight: 600; letter-spacing: 1px; } env.py의 침묵하는 누락 손으로 적은 import 21개 vs 디렉터리에 실재하는 모델 57개 BEFORE — 사고 시점 app/models/ 57 실재 모델 파일 env.py 21 손으로 적은 import Base.metadata 21 등록된 테이블 autogenerate −36 DROP TABLE 자동 생성 metadata에 없는 36개 모델은 alembic 입장에서 "사라진 테이블"로 보임 → 1091줄짜리 폭탄 마이그레이션 파일이 자동 생성됨 AFTER — env.py 자동 import 적용 app/models/ 57 실재 모델 파일 env.py auto pkgutil.iter_modules Base.metadata 78 전체 자동 등록 autogenerate 0 false-DROP 차단 새 모델 파일을 추가해도 env.py에 손대지 않아도 됨 — 잊을 수 있는 자리 자체가 사라짐 env.py에 손으로 적은 21개 import vs 디렉터리에 실재하는 57개 모델 — 그 격차가 폭탄을 만든다. 원인 확정. 사람의 게으름이 아니라, 시스템 설계의 문제였다. 새 모델을 추가할 때마다 env.py에 한 줄을 손으로 더 적어야 하는 구조 자체가, 언젠가 누락이 생길 시한폭탄이었다. 백업이 가장 먼저 원인을 알았다고 해서 바로 수정 작업에 들어가면 안 된다. binlog가 꺼진 상태에서, 잘못된 한 줄이 더 큰 사고를 만들 수도 있다. 이번 작업의 모든 안전성은 현재 시점 백업 한 장에 달려 있었다. 백업 스크립트를 짜기 전에 한 가지 고려사항이 있었다 — eondcms는 트래픽이 꽤 있는 사이트라 카운터·통계·API 호출 로그 테이블 3개가 매우 크다. 이걸 그대로 풀 덤프하면 시간도 오래 걸리고 용량도 부담스럽다. 이 3개는 데이터는 빼고 스키마만 보존하기로 했다. 복원 후에도 빈 테이블 껍데기는 만들어져야 ORM이 INSERT를 시도할 때 에러가 나지 않으니까. 핵심 패턴은 단순하다. mysqldump를 두 번 호출해서 stdout을 이어붙인 뒤 한 번에 gzip으로 압축한다. 결과물은 단일 파일. { mysqldump --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 --hex-blob \ --ignore-table=$DB.xe_counter_log \ --ignore-table=$DB.xe_api_call_logs \ --ignore-table=$DB.xe_stats_log \ "$DB" mysqldump --no-data --default-character-set=utf8mb4 \ "$DB" xe_counter_log xe_api_call_logs xe_stats_log } | gzip > "$OUT_FILE" 스크립트 첫 줄에 set -euo pipefail을 박아두는 게 중요하다. 한 줄이라도 실패하면 즉시 멈추도록. 백업이 도중에 깨졌는데 "성공"이라고 착각하는 사고가 가장 흔하니까. 결과물은 압축 후 37MB. 압축 전 원본 기준 약 300~450MB 추정. 이걸 웹에서 절대 보이지 않는 디렉터리에 저장하는 것도 중요했다. 백업 파일에는 비밀번호 해시·세션 토큰·이메일 같은 민감정보가 그대로 들어 있어서, "private"이라는 이름의 디렉터리에 둔다고 해도 실제로 웹서버 설정이 막아주지 않으면 누구나 다운로드 가능하다. env.py 자동화 — 사람의 주의력에 의존하지 않기 이제 진짜 수정. env.py를 손으로 import 목록을 유지하는 방식이 사고의 근본 원인이라면, 답은 자동 import다. 새 모델 파일이 추가될 때마다 자동으로 등록되도록 바꾸면, 누구도 손으로 적는 걸 까먹을 수 없다. import importlib import pkgutil import app.models as _models_pkg for _info in pkgutil.iter_modules(_models_pkg.__path__): if _info.name.startswith("_") or _info.name == "base": continue importlib.import_module(f"app.models.{_info.name}") pkgutil.iter_modules는 패키지 안의 모든 모듈을 순회해주는 표준 라이브러리. 베이스 모듈만 제외하고 전부 import한다. 검증 결과 55개 모듈이 자동 로드되어 78개 테이블이 metadata에 등록되었다. 이전 21개 import로 잡지 못했던 36개 모델이 이번에 모두 합류했다. 이 변경 한 줄이 의미하는 바는 명확하다. 앞으로 누가 새 모델 파일을 만들어도 env.py를 손대지 않아도 된다. autogenerate가 잘못된 DROP을 만들 가능성이 구조적으로 차단된다. 폭탄 마이그레이션 무력화 남은 일은 1091줄짜리 폭탄을 어떻게 처리할 것인가였다. 선택지는 두 개: A. 파일 자체를 삭제 — 깔끔해 보이지만, alembic 입장에선 chain의 한 노드가 사라지는 것이라 후속 마이그레이션이 깨진다. B. 내용만 비우기 — revision과 down_revision 필드는 그대로 두고, upgrade()와 downgrade() 함수 본문을 pass로 교체한다. chain은 그대로, 동작만 무력화. B를 골랐다. 사고 경위와 신원 보존이 되는 주석을 헤더에 적어두고: """add_random_order_to_board_config (NEUTRALIZED) ⚠️ 이 마이그레이션은 의도적으로 비워졌습니다 (2026-04-28). 사고 경위: alembic env.py가 app/models/ 아래 일부 모델만 import하던 상태에서 --autogenerate 가 실행되어, 누락된 36개 모델이 "사라진 테이블"로 인식 → 30+ 테이블 DROP을 자동 생성한 1091줄짜리 폭탄 마이그레이션이 됨. """ def upgrade() -> None: pass def downgrade() -> None: pass 이 주석은 미래의 누군가가 — 6개월 뒤의 자기 자신을 포함해서 — "왜 이 파일이 비어있지?" 라고 물었을 때, 짧은 단서가 되어줄 것이다. 코드 자체가 자기 역사를 설명할 수 있어야 한다. 안전한 적용 절차 수정한 파일들을 production에 보내기 전, 한 가지 더 확인할 게 있었다. dry-run. alembic upgrade --sql은 offline 모드로 동작해서, DB에 연결조차 하지 않고 실행될 SQL을 텍스트로만 출력한다. 진짜 실행 전에 무엇이 production에서 일어날지 미리 보여주는 안전 기능이다. alembic upgrade --sql c3d4e5f6a1b2:head | grep -E "DROP TABLE|TRUNCATE" \ && echo "❌ 아직 위험" \ || echo "✅ no destructive ops" grep이 무언가 잡히면 → 위험. 아무것도 안 나오면 → 안전. 아주 단순하지만 마음 편한 검증이다. 처음 production에서 dry-run을 돌렸을 때는 DROP 문이 좌라락 출력되었다. 잠깐 가슴이 철렁했지만, 곧 이유를 알았다 — 우리가 로컬에서 비운 두 파일이 production에는 아직 안 갔던 것. rsync로 동기화 후 재실행: Running upgrade c3d4e5f6a1b2 -> a6ae466f8b07, add_random_order_to_board_config (NEUTRALIZED) ✅ no destructive ops (NEUTRALIZED) 표시가 떠 있는 게 결정적 증거였다. production이 우리가 비운 새 파일을 정상적으로 읽고 있다는 뜻. 이제 진짜로 적용해도 안전하다. $ alembic upgrade head INFO Running upgrade c3d4e5f6a1b2 -> a6ae466f8b07, add_random_order_to_board_config (NEUTRALIZED) $ alembic current a6ae466f8b07 (head) DB 변경 0건, 데이터 손실 0건, 다운타임 0초. alembic_version 테이블의 한 행만 갱신되었다. 폭탄 해체 완료. 다음 편 — ③ 바이브코딩의 위험과 안전망 — 사람은 잊지만 코드는 잊지 않는다
이온디
이온디 1개월 전
시리즈 다음 편 → 바이브코딩의 위험성 ① — 어제는 분명히 괜찮았다 AI에게 코드를 맡기는 시대, 우리는 어떤 안전망을 가지고 있을까? 한 번의 자동화가 30개 테이블을 날릴 뻔한 이야기. — 시리즈 1편 / 사건 발견과 추적 평범한 아침, 작은 위화감 오늘 아침 관리자 화면에 접속했더니 몇몇 메뉴가 비어 있었다. SEO 설정, 재무 거래내역, 호스팅 생성 로그. 그리고 발송 로그도. 처음에는 단순히 "아직 데이터를 안 채워서 그런가 보다" 싶었다. 신규 기능 위주의 메뉴들이라서 그럴… 시리즈 다음 편 → 바이브코딩의 위험성 ① — 어제는 분명히 괜찮았다 AI에게 코드를 맡기는 시대, 우리는 어떤 안전망을 가지고 있을까? 한 번의 자동화가 30개 테이블을 날릴 뻔한 이야기. — 시리즈 1편 / 사건 발견과 추적 평범한 아침, 작은 위화감 오늘 아침 관리자 화면에 접속했더니 몇몇 메뉴가 비어 있었다. SEO 설정, 재무 거래내역, 호스팅 생성 로그. 그리고 발송 로그도. 처음에는 단순히 "아직 데이터를 안 채워서 그런가 보다" 싶었다. 신규 기능 위주의 메뉴들이라서 그럴 만도 했다. 그런데 이상했다. 며칠 전 분명히 본 적이 있는 데이터들이었다. 이게 왜 비어 있지? 처음 떠올린 가설은 단순했다. eondcms는 Rhymix(xe_* 테이블)를 그대로 쓰면서 신규 기능은 eond_* 테이블에 적재하는 구조다. 신규 테이블이 새로 만들어진 거라, 이전 데이터가 없는 게 자연스럽다. 깔끔한 설명이었다. 그런데 깔끔한 설명일수록 의심해야 한다는 걸, 8년 프리랜서 생활이 가르쳐준 본능이 있었다. "원래 있었다"는 증언 테이블 행 수를 직접 세어 봤다. eond_site — 4개 행. SEO는 사이트별로 채우면 되는 정상 상태. eond_bank_transactions — 0개. 이전엔 있었다. eond_hosting_setup_log — 0개. 이것도 있었다. "원래 있었다"는 기억이 옳다면, 신규 테이블 가설은 무너진다. 데이터가 사라진 것이다. 이쯤에서 가장 먼저 점검하는 건 MySQL의 binlog. 점-시간 복구(point-in-time recovery)가 가능한 유일한 안전망이다. SHOW VARIABLES LIKE 'log_bin'; OFF. 이 한 줄로 모든 복구 옵션이 사라졌다. 백업 디렉터리도 비어 있었다. 추적할 수 있는 흔적이 통째로 사라진 셈이다. 어제는 정상이었다 다행인지 불행인지, 사라진 건 "단순 로그 정도"였다. 글, 회원, 댓글, 파일 같은 핵심 데이터는 멀쩡했다. 다시 채워 넣으면 되는 수준. 그렇다고 그냥 넘어갈 일은 아니었다. 이런 사고는 다음에도 일어날 수 있고, 다음엔 운이 안 좋을 수도 있으니까. 추적의 단서를 찾기 위해 시점부터 좁혔다. 어제는 괜찮았던 걸로 기억함 이 한 줄이 결정적이었다. 어제까지 정상이었고, 오늘 사라졌다. 그렇다면 그 사이에 누군가 무엇을 했다. git log를 펼쳤다. efd252f 2026-04-28 14:51:03 feat: major update — inquiry-to-project flow, notification logging, market price, xe_ table integration 오늘 오후 2시 51분에 거대한 커밋이 하나 들어가 있었다. "major update"라는 말이 이미 의심스러웠지만, 그보다 눈에 띈 건 변경된 파일 수였다. 모델 추가, 라우터 추가, 서비스 추가, 마이그레이션 파일들 — 그중에서 한 줄이 유독 튀었다. 1091 +++ alembic/versions/a6ae466f8b07_add_random_order_to_board_config.py 마이그레이션 파일 하나가 1091줄. 게다가 이름은 "board_config에 random_order 추가". 컬럼 하나 추가하는 데 1091줄? 이름과 다른 내용 파일을 열어봤다. """add_random_order_to_board_config Revision ID: a6ae466f8b07 Create Date: 2026-04-27 16:36:16.654089 """ def upgrade() -> None: op.create_table('eond_hosting_plan', ...) op.drop_table('eond_project_quote_items') op.drop_table('eond_outreach_template') op.drop_table('eond_notification_log') op.drop_table('eond_marketing_activity') ... 이름은 컬럼 추가인데, 내용은 30개가 넘는 테이블을 DROP하는 코드였다. 사라진 테이블 목록을 훑어보니 정확히 오늘 사라진 데이터들이 거기에 있었다. eond_bank_transactions (재무 거래내역) ✓ eond_hosting_setup_log (호스팅 생성 로그) ✓ eond_clients (고객 관리) ✓ eond_audit_log, eond_blog_posts, eond_member_login_log eond_marketing_* 시리즈 거의 전부 eond_newsletter_*, eond_post_seo, eond_board_seo eond_publish_queue, eond_writing_material, eond_wiki_pages ... 범인을 찾았다고 생각했다. 어제(4/27 16:36) 만들어진 이 파일이, 오늘 배포(4/28 14:51) 시점에 production에서 실행되며 데이터를 다 날려버렸다고. 시간 순서도 완벽하게 맞아떨어졌다. 그런데 정말 그랬을까? 결정적 한 줄 확신을 굳히기 전에 production에서 alembic 상태를 확인했다. $ alembic current c3d4e5f6a1b2 이 한 줄이 모든 추리를 뒤집었다. c3d4e5f6a1b2는 폭탄 마이그레이션(a6ae466f8b07)의 바로 직전 단계였다. 즉 production은 아직 폭탄을 실행하지 않은 상태였다. 1091줄의 DROP 문은 production DB에 한 줄도 닿지 않았다. 그렇다면 오늘 비어버린 데이터는 누가 지웠나? 솔직히 말하자면 — 모른다. binlog가 꺼져 있어서 추적할 흔적이 없다. 어쩌면 어떤 수동 작업, 어쩌면 다른 환경과의 혼동, 어쩌면 우리가 모르는 어떤 reset 스크립트의 흔적. 영원히 미궁이다. 하지만 진짜 무서운 건 그게 아니다. 폭탄은 아직 안 터졌을 뿐, 신관은 빠져 있는 상태로 차에 실려 있다는 것. 다음 배포 때 누가 무심코 alembic upgrade head를 누르는 순간, 그제서야 30개 테이블이 진짜로 사라진다. 이번엔 운 좋게 발견했지만, 발견하지 못했다면? 이 시점부터 작업의 성격이 바뀌었다. 사고 조사가 아니라 사고 예방으로. 다음 편 — ② 범인은 autogenerate였다 — 폭탄 마이그레이션 해체
이온디
이온디 1개월 전
2025. 06. 17 초고 작성 개발자들을 위한 나라는 없다 누구나 개발자가 될 수 있는 시대, 진짜 개발자의 가치를 찾아서 PDF 다운로드 온라인으로 읽기 새벽 3시, 모니터 앞에서 에너지드링크를 마시며 버그와 씨름하던 그 시절이 있었다. ChatGPT가 내가 3일간 짠 코드를 5분 만에 뚝딱 만들어내는 걸 보고 나서, 문득 이런 생각이 들었다. "개발자들을 위한 나라… 2025. 06. 17 초고 작성 개발자들을 위한 나라는 없다 누구나 개발자가 될 수 있는 시대, 진짜 개발자의 가치를 찾아서 PDF 다운로드 온라인으로 읽기 새벽 3시, 모니터 앞에서 에너지드링크를 마시며 버그와 씨름하던 그 시절이 있었다. ChatGPT가 내가 3일간 짠 코드를 5분 만에 뚝딱 만들어내는 걸 보고 나서, 문득 이런 생각이 들었다. "개발자들을 위한 나라는 정말 없는 건 아닐까?" 하지만 몇 달 후, 완전히 다른 결론에 도달했다. 이 책은 그 과정의 기록이다. AI 시대에 개발자의 가치가 사라지는 게 아니라, 모든 사람이 개발자가 되는 시대가 오고 있다는 이야기. 목차 프롤로그 개발자라는 직업의 종말과 시작 1장 10년 차 개발자가 ChatGPT에게 밀린 날 2장 AI가 5분 만에 해치운 나의 3일짜리 작업 3장 "코딩 몰라도 앱 만든다"는 거짓말과 진실 4장 카페 사장이 만든 POS 시스템 5장 AI 개발 도구 완전 정복 가이드 6장 코딩을 몰라도 되는 것 vs 반드시 알아야 하는 것 7장 일반인 개발자의 현실적 한계와 극복법 8장 전문 개발자의 생존 전략 9장 모든 직업이 개발자를 포함하는 시대 10장 사이드프로젝트의 종말, 개인프로젝트의 시작 에필로그 개발자로 살아남는다는 것의 새로운 의미 작성 시점 안내 이 책은 2025년 6월의 AI 기술 환경을 기준으로 작성되었습니다. AI의 발전 속도는 상상을 초월하기 때문에, 일부 내용은 현재 시점과 다를 수 있습니다. 당시의 기록으로 읽어주세요. 브라우저가 PDF 뷰어를 지원하지 않습니다. PDF를 다운로드하세요.
이온디
이온디 4년 전
구현내용 : 신고하기를 새창이 아닌 모달레이어로 구현 작업방법 : 기존 신고하기 새창의 소스를 그대로 복사해서, 게시판 스킨 내부 글보기 페이지, 코멘트 페이지에 삽입함. url만 XE 코드에 맞게 삽입함. 수정한 코드 경로 modules/board/skins/assets/css/report.scss modules/board/skins/assets/js/board.js modules/board/skins/eden_feed/components/article/article.html modules… 구현내용 : 신고하기를 새창이 아닌 모달레이어로 구현 작업방법 : 기존 신고하기 새창의 소스를 그대로 복사해서, 게시판 스킨 내부 글보기 페이지, 코멘트 페이지에 삽입함. url만 XE 코드에 맞게 삽입함. 수정한 코드 경로 modules/board/skins/assets/css/report.scss modules/board/skins/assets/js/board.js modules/board/skins/eden_feed/components/article/article.html modules/board/skins/eden_feed/components/comment/comment.html modules/board/skins/eden_feed/_header.html board.js jQuery(function($) { const btnReportDocument = $(".btn-report-document"); const btnReportComment = $(".btn-report-comment"); const modalWinDocument = $(".modal-wrap-document"); const modalWinComment = $(".modal-wrap-comment"); const btnClose = $(".btn-close"); btnReportDocument.on('click', function(){ modalWinDocument.addClass('active'); }); btnReportComment.on('click', function(){ console.log("코멘트열기"); $(this).next(".modal-wrap-comment").addClass('active'); // modalWinComment.addClass('active'); }); btnClose.on('click', function(){ modalWinDocument.removeClass('active'); modalWinComment.removeClass('active'); }); // $(".modal-wrap.active").not(".modal.modal-view").on("click", function(){ // $(this).removeClass('active'); // }) $('html').on('click', function(e){ //모달창 개수 // var modal = $(e.target).parents('.mark').length; //켜짐여부 var hasClass = $(e.target).hasClass('active'); // console.log($(e.target)) // console.log(modal) // var modal = $(e.target).length; if(hasClass){ // console.log('외부이프문') if(!$(e.target).hasClass('.modal-view')){ // console.log('내부이프문') // console.log($(e.target).parent('.mark').hasClass('on')) $('.modal-wrap-document').removeClass('active'); $('.modal-wrap-comment').removeClass('active'); $('body').css('overflow',''); }else{ // console.log('내부이프문2') } // console.log('켜짐'); // console.log(e.target); }else { // console.log('맞음'); // console.log(e.target); } }); }); article.html <div class="modal-wrap-document"> <div class="modal modal-view"> <div class="modal-header"> <div class="title">신고하기</div> <div class="btn-close"><i class="ion ion-md-close"></i></div> </div> <div class="modal-body"> <load target="../../ruleset/insertDeclare.xml" /> <form action="./" method="post" id="for_document"> <input type="hidden" name="error_return_url" value="{getUrl('','document_srl',$document_srl,'status','error')}"> <input type="hidden" name="mid" value=""> <input type="hidden" name="ruleset" value="insertDeclare"> <input type="hidden" name="module" value="document"> <input type="hidden" name="act" value="procDocumentDeclare"> <input type="hidden" name="target_srl" value="{$document_srl}"> <input type="hidden" name="success_return_url" value="{getUrl('','document_srl', $document_srl,'status','success')}"> <input type="hidden" name="xe_validator_id" value="modules/document/tpl/1"> <div class="x_modal-body x_form-horizontal" style="max-height:none"> <blockquote> <section class="target_article"> <div class="item"> <div class="label">작성자</div> <div class="text">{$oDocument->getNickName()}</div> </div> <div class="item"> <div class="label">제목</div> <div class="text">{$oDocument->getTitle()}</div> </div> </section> </blockquote> <div class="x_control-group"> <label class="x_control-label" for="message_option">사유선택</label> <div class="x_controls"> <select name="message_option" id="message_option"> <option loop="$lang->improper_document_reasons => $key,$text" value="{$key}">{$text}</option> <textarea name="declare_message" id="declare_message"></textarea> <p>{$lang->about_improper_document_declare}</p></div> </div> </div> <div class="x_modal-footer"> <span class="x_btn-group x_pull-right"> <button type="submit" class="x_btn x_btn-primary">{$lang->cmd_submit}</button> </span> </div> </form> <script cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/document/tpl/1'"> alert("{$XE_VALIDATOR_MESSAGE}"); // window.close(); </script> <script cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/comment/tpl/1'"> alert("{$XE_VALIDATOR_MESSAGE}"); // window.close(); </script> </div> </div> </div> comment.html <div class="btn-report-comment">신고</div> <div class="modal-wrap-comment"> <div class="modal modal-view"> <div class="modal-header"> <div class="title">신고하기</div> <div class="btn-close"><i class="ion ion-md-close"></i></div> </div> <div class="modal-body"> <load target="../../ruleset/insertDeclare.xml" /> <form action="./" method="post" id="for_comment"> <input type="hidden" name="error_return_url" value="{getUrl('','document_srl',$comment->get('document_srl'),'comment_srl',$comment->comment_srl,'status','error')}"> <input type="hidden" name="mid" value="index"> <input type="hidden" name="ruleset" value="insertDeclare"> <input type="hidden" name="module" value="comment"> <input type="hidden" name="act" value="procCommentDeclare"> <input type="hidden" name="target_srl" value="{$comment->comment_srl}"> <input type="hidden" name="success_return_url" value="{getUrl('','document_srl',$comment->get('document_srl'),'comment_srl',$comment->comment_srl,'status','success')}"> <input type="hidden" name="xe_validator_id" value="modules/comment/tpl/1"> <!-- <div class="x_modal-header">--> <!-- <h1>불량 댓글 신고 </h1>--> <!-- </div>--> <div class="x_modal-body x_form-horizontal" style="max-height:none"> <blockquote> <section class="target_article"> <div class="item"> <div class="label">댓글내용</div> <div class="text">{$comment->getContent(false)}</div> </div> </section> </blockquote> <div class="x_control-group"> <label class="x_control-label" for="message_option">신고 이유</label> <div class="x_controls"> <select name="message_option" id="message_option"> <option value="advertisement">본문 주제나 흐름에 맞지 않는 광고 글입니다.</option> <option value="theme">주제에 맞지 않는 글입니다.</option> <option value="bad_word">과도한 욕설을 담고 있습니다.</option> <option value="violence">폭력적인 내용을 담고 있습니다.</option> <option value="racism">인종차별적인 내용을 담고 있습니다.</option> <option value="pornography">음란물을 포함하고 있습니다.</option> <option value="privacy">민감한 개인정보가 노출 되어있습니다.</option> <option value="others">기타(직접작성)</option> </select> <textarea name="declare_message" id="declare_message"></textarea> <p>댓글을 신고하신 이유를 간단히 적어서 제출해주시면 관리자 검토 후 조치하겠습니다.</p><p> </p></div> </div> <div class="x_modal-footer"> <span class="x_btn-group x_pull-right"> <button type="submit" class="x_btn x_btn-primary">등록</button> </span> </div> </div> </form> </div> </div> </div> header.html <load target="../assets/css/report.min.css" /> report.scss $line-color:#eee; .btn-report-document,.btn-report-comment{ display:inline-block; margin-right: 10px; font-size: 13px !important; line-height: 1.2em !important; color: #999; cursor: pointer; } .modal-wrap-document, .modal-wrap-comment{ background: rgba(0,0,0,.5); //display: flex; align-items: center; justify-content: center; width: 100vw; height: 100vh; position: fixed; left: 0; right: 0; top: 0; z-index: 999; bottom: 0; display: none; &.active{ display: flex; } } // 신고하기 .modal.modal-view{ display:block !important; width: 21rem; height: 25rem; background:#fff; position: initial; border: 1px solid #444; box-shadow: 4px 4px 8px rgba(0,0,0,0.1); .modal-header{ border-bottom: 1px solid $line-color; .title{ } .btn-close{ cursor: pointer; i{ font-size: 24px; } } } .modal-body{ padding: 0; select, textarea{ margin-top: 2px; width: 100%; } .target_article{ display: flex; flex-direction: column; gap: .5rem; padding: .5rem; border-bottom: 1px solid $line-color; .item{ display: flex; .label{ color: #aaa; border-right: 1px solid #ddd; width: 6rem; } .text{ padding-left: 1rem; } } font-size: 13px; } .x_control-group{ padding: .5rem; .x_controls{ p{ font-size: 12px; color: #aaa; } } } .x_modal-footer{ padding: 0 .5rem; .x_btn-group{ .x_btn{ width: 100%; background: #ff5d6b; border: 0; height: 40px; color: #fff; border-radius: 3px; } } } } }
이온디
이온디 7년 전
/home/eond/www/common/css/admin.css @charset "utf-8"; body{ background: #25282f;} body .x>.header{ background: #25282f;border-bottom:0;} body .x>.header:before{box-shadow:none;} body .x>.header>h1>a{color:#fff;} body .message.update{display:none;} body .x .x_page-header{bor… /home/eond/www/common/css/admin.css @charset "utf-8"; body{ background: #25282f;} body .x>.header{ background: #25282f;border-bottom:0;} body .x>.header:before{box-shadow:none;} body .x>.header>h1>a{color:#fff;} body .message.update{display:none;} body .x .x_page-header{border-bottom:1px solid #434857} body .x .x_page-header>h1{color:#434857;} section{background:#fff} body .x>.body>.gnb>ul{box-shadow:none;border:0;} body .x>.body>.gnb>ul>li{border-top:0;} body .x>.body>.content{ background:#fff; padding-left: 15px; padding-right: 15px; margin-right: -15px; margin-top: 15px; border-radius: 4px; } /*메뉴*/ body .x>.body>.gnb>ul>li{background:#444856;} body .x>.body>.gnb>ul>li.open>a{background:#444856;} /*body .x>.body>.gnb>ul>li.open, .x>.body>.gnb>ul>li.active{padding-bottom:0;}*/ 기본 xe.css 에서 admin.css 파일을 임포트해줍니다. @import 'admin.css';
이온디
이온디 10년 전
한국의 전통 색상표 출처 : http://study4you.kr/xe/pds/752 무채색계(無彩色界) - 10색 흑백 1D1E23 93,89,83,52 백색 FFFFFF 0,0,0,0 회색 A4AAA7 38,27,31,… 한국의 전통 색상표 출처 : http://study4you.kr/xe/pds/752 무채색계(無彩色界) - 10색 흑백 1D1E23 93,89,83,52 백색 FFFFFF 0,0,0,0 회색 A4AAA7 38,27,31,0 구색 959EA2 45,32,32,0 치색 616264 72,64,62,4 연지회색 6F606E 55,58,40,20 설백색 DDE7E7 12,4,7,0 유배색 E7E6D2 9,5,18,0 지배색 E3DDCB 6,6,17,4 소색 D8C8B2 10,15,26,5 적색계(赤色界) - 21색 적색 B82647 21,98,68,8 홍색 F15B5B 0,80,60,0 적토색 9F494C 29,80,64,17 휴색 683235 40,80,66,44 갈색 966147 31,61,73,21 호박색 BD7F41 21,51,84,8 추향색 C38866 19,48,61,6 육색 D77964 11,62,59,2 주색 CA5E59 15,75,62,4 주홍색 C23352 18,94,60,5 담주색 EA8474 4,59,50,0 진홍색 BF2F7B 20,94,17,4 선홍색 CE5A9E 16,79,2,0 연지색 BE577B 19,77,28,7 훈색 D97793 9,64,20,2 진분홍색 DB4E9C 9,84,0,0 분홍색 E2A6B4 7,39,14,1 연분홍색 E0709B 6,69,11,1 장단색 E16350 6,75,70,1 석간주색 8A4C44 30,71,65,30 흑홍색 8E6F80 40,54,31,15 청록색계(靑綠色界) - 32색 청색 0B6DB7 89,56,0,0 벽색 00B5E3 73,5,4,0 천청색 5AC6D0 59,0,20,0 담청색 00A6A9 96,4,40,0 취람색 5DC19B 62,0,51,0 양람색 6C71B5 64,58,0,0 벽청색 448CCB 72,36,0,0 청현색 006494 99,59,22,3 감색 026892 93,57,26,2 남색 6A5BA8 68,73,0,0 연람색 7963AB 60,69,0,0 벽람색 6979BB 64,52,0,0 숙람색 45436C 86,84,40,9 군청색 4F599F 80,73,6,0 녹색 417141 82,44,95,9 명록색 16AA52 81,5,94,0 유록색 6AB048 64,8,97,0 유청색 569A49 72,20,96,1 연두색 C0D84D 29,0,87,0 춘유록색 CBDD61 24,0,78,0 청록색 009770 97,15,74,0 진초록색 0A8D5E 87,26,82,1 초록색 1C9249 85,20,98,2 흑록색 2E674E 89,52,83,9 비색 72C6A5 55,0,45,0 옥색 9ED6C0 38,0,30,0 삼청색 5C6EB4 71,59,0,0 뇌록색 397664 74,27,59,6 양록색 31B675 74,0,74,0 하염색 245441 83,43,75,39 흑청색 1583AF 84,39,17,0 청벽색 18B4E9 69,8,0,0 황색계(黃色界) - 16색 황색 F9D537 3,13,89,0 유황색 EBBC6B 6,25,67,1 명황색 FEE134 2,7,89,0 담황색 F5F0C5 4,2,27,0 송화색 F8E77F 4,4,62,0 자황색 F7B938 2,29,89,0 행황색 F1A55A 3,40,73,0 두록색 E5B98F 8,27,45,1 적황색 ED9149 4,51,80,0 토황색 C8852C 18,50,97,5 지황색 D6B038 14,26,91,3 토색 9A6B31 30,54,91,20 치자색 F6CF7A 3,18,61,0 홍황색 DDA28F 9,39,38,2 자황색 BB9E8B 22,33,40,7 금색 코드값이 없습니다. 자색계(紫色界) - 11색 자색 6D1B43 41,95,45,40 자주색 89236A 40,96,18,20 보라색 9C4998 42,85,1,1 홍람색 733E7F 58,85,10,15 포도색 5D3462 70,90,35,20 청자색 403F95 90,90,1,1 벽자색 84A7D3 47,25,1,1 회보라색 B3A7CD 28,32,1,1 담자색 BEA3C9 23,36,1,1 다자색 47302E 75,86,85,35 적자색 BA4160 15,86,42,13
이온디
이온디 10년 전
Nate와 싸이월드가 가장 잘나가던 당시 시절 SK 그룹 내에서 인터넷을 총괄하는 SK컴즈는 그래도 특별한 경쟁 없이 자신들의 우위를 만들어 갈 수 있었다. 싸이월드 이후를 고민하며 싸이 Home 2를 론칭 할 당시 그들이 쏟아 부었던 마케팅 비용을 생각한다면 그룹 내에서도 일정 부분 발언권을 가진 기업으로 볼 수 있었다. (그래봐야 그룹내에서 명함도 내밀기 힘든 자회사 였지만 말이다) 우선 좀 더 원론적인 이야기를 하기 이전에 싸이홈 론칭 당시를 생각해보면 … Nate와 싸이월드가 가장 잘나가던 당시 시절 SK 그룹 내에서 인터넷을 총괄하는 SK컴즈는 그래도 특별한 경쟁 없이 자신들의 우위를 만들어 갈 수 있었다. 싸이월드 이후를 고민하며 싸이 Home 2를 론칭 할 당시 그들이 쏟아 부었던 마케팅 비용을 생각한다면 그룹 내에서도 일정 부분 발언권을 가진 기업으로 볼 수 있었다. (그래봐야 그룹내에서 명함도 내밀기 힘든 자회사 였지만 말이다) 우선 좀 더 원론적인 이야기를 하기 이전에 싸이홈 론칭 당시를 생각해보면 싸이월드가 끝물시점이라고 결과적으론 판단해야 겠지만, 가장 좋은 성과를 보여주던 시기가 확실하다. 기자들이 싸이월드 홍보 담당자와 전화 통화등에서 도토리 좀 달라고 때썼다는 이야기를 들을 정도면 그때까지만해도 싸이월드가 대한민국에서 가장 핫한 서비스 였던 것은 확실했다. 또, 싸이월드의 미니홈의 한계와 블로그 시장의 급성장을 지켜보는 그들에겐 어떻게든 새로운 전환점이 필요했을 것이다. 그들이 꺼내든 것은 싸이월드의 또다른 버전으로 블로그 버전으로 볼 수 있는 싸이홈은 그런 전환기에 그들이 꺼내든 카드였다. 업계에서 듣기로 당시 이를 홍보하기 위해서 들인 돈이 어마어마 하다고 들었던 것 같다. 유명 광고 회사들이 붙었고, 싸이월드의 성공 시점이란 점과 이 회사들의 돈벌기 위한 뻥튀기가 더해져 규모가 커졌는지는 모르겠지만, 길거리 패스티벌과 다양한 광고 및 온오프라인 프로모션을 진행한 것치곤 성과가 전혀 없었다. 차라리 돈안 들이고 자체 사이트 광고를 진행하는 것보도 못했는지도 모르겠다. 결국 쫄딱 망했고.. 블로그에 치이며 조금씩 시장을 잃더니 2010년 모바일 시장이 만개하면서 본격적으로 모바일 소셜과 서구형 소셜 네트워크 서비스가 쏟아져 들어오면서 급격시 시장에서 밀리게 되는데, SK 이야기를 하기 위해 이 상황을 몇가지 진단해 보려고 한다. SK 컴즈의 도태의 이유? 아무래도 외부적인 시작으로 볼 수 밖에 없다. 첫번째 이유는 성공에 도취됬다는 점일 거다. 처음으로 소셜 네트워크 서비스로 수익모델을 만들었고 나름 해외에 소개 될 정도로 인기가 있었다. 문제는 이 과정에서 스스로 최고라는 망각에 빠졌다는 점이다. 그들 스스로 인정하듯, 해외 진출시 싸이월드는 각각의 별도 서비스로 해외 시장에 진출했다. 미국 시장의 싸이 유저가 대만 시장의 싸이 유저와 교류하기 위해선 대만 시장의 싸이월드에 별도로 가입해야 했던 것이다. 현재의 페이스북, 트위터 같은 서비스들은 전세계 시장의 이용자가 동일한 환경과 조건에서 교류 할 수 있는데 반해 치명적인 약점이었고, 최근 해외 시장 진출을 이야기하며 그들도 이 접근이 큰 패착을 가져왔다고 스스로 인정했다. 결국 이 사례에서 볼 수 있는 것은 자만심 + 비전 제시가 불가능한 오너쉽 + 구조화되고 상향식 조직화 된 SK컴즈의 조직 문화를 엿볼 수 있다. 실패는 하나의 큰 요인이 크게 작용하지만 그 요인이 이렇게 잘나가던 서비스를 몰락 시킬땐 조직 및 모든 구성원이 문제를 앉고 있다는 것을 의미하는 것이기도 하다. 두번째는 새로운 것에 도전하지 않고 남이 잘하는 것을 따라하거나 현재 잘나가는 것을 쫒았다는 점이다. 네이트와 싸이월드 서비스중 어떤 서비스가 신선함을 가져다 줄까? 최근 론칭한 모바일 싸이월드 조차도 특색이 없다. 네이트온의 성공은 무료 문자 제공을 감행한 SKT를 가진 SK의 힘이지 결고 기획이나 아이디어의 힘이 아니다. 그것도 실력이라고 포장한다면 어쩔 수 없지만, 근본적인 성공의 이유가 아니다. 그나마 SK 컴즈가 잘했다고 생각하는게 앱스토어인데, 해킹 사태로 여론의 뭇매를 맞으며, 급격히 추락한 것이 아쉽지만, 자신들이 가진 모바일 플랫폼의 장점과 태생적 생리를 잘 활용하지 못했던 점은 분명 짚고 넘어가야 할 문제란 생각이다. 경영의 문제인지는 모르겠지만, 모바일 시대가 도래 했을 당시 네이트온의 모바일화가 늦어진점, 추후 론칭한 네이트온이 2개 버전으로 만들어져 사용자 혼란을 부추긴점.. 등 여러면에서 다양한 실패 요인들이 지금의 sk 컴즈를 만들었다. SK컴즈는 왜? 버려진 카드가 됬나? 최근 SK 그룹에서는 모바일 관련 사업에 있어서 SK 플랫폼을 밀어주는 분위기다. SK 컴즈는 자금난으로 자신들의 사옥을 SK 플랫폼에 매각한다는 발표가 있었던 것을 생각하면 한마디로 버려지는 카드로 보는게 맞다. 문제는 SK 플랫폼 역시 SK 컴즈와 같이 될 수 있다는 점을 그들 스스로 망각하고 있는 듯하다. 인터넷 및 모바일 전문 회사들의 특징은 수평 구조화되고 특정한 조직 없이 프로젝트 단위로 움직이도록 만들기 위해 노력한다. 그래야 빠르게 새로운 것에 대응할 수 있기 때문이다. 물론 이런 형태의조직에도 문제점은 있다. 하지만, SK 같은 조직들은 수직 구조화 된 조직이며.. 임원 인사도 능력이나 실력이 아니라 SK 그룹 차원에 코드 인사가 대부분이다. (지인들을 통해 그렇게 스터디하고 있음) 싸이월드를 인수했다고 치자? SK 출신의 임원은 보텅 SKT 출신들이 많은데 이들이 하는 짓은 비전, 목표 이런건 없는듯 하다. 그저 성과와 결과다. 당장 투자한 돈 대비해서 유저, 트래픽, 수익 측면에서 어떤 성과를 만들지를 생각한다. 멀리 볼 것도 없고 최대한 성과를 만드는게 그들의 지상과제다. SK 컴즈가 급격히 추락하는 시점을 보면 SK 그룹 출신의 임원들이 본격적으로 SK컴즈를 장악하기 시작한 시점이다. 실적 중심으로 조직이 만들어지기 때문에 엠파스와 싸이월드를 인수하며 내부에 쌓아둔 창의적 인재들이 점차 관료화되어가고 있다고 볼 수 있다. 어쩌면 소니, 노키아가 걸었던 그런 지독한 관료화의 그림자를 SK컴즈가 만들었는지 모른다. SK 그룹도 최고 임원진 고나점에서 보면 SK 컴즈는 워낙 비중이 없는 회사라 망하면 다른 새로운 조직을 만들면 된다는 마인드가 있는 것으로 알고 있다. SK컴즈가 버려진 것은 모바일 대응의 실패로 적자를 기록했고, 시장 점유율은 계속 하락하는 상황 여기에 Nate 조직의 일부는 SKT, 온라인 조직은 SK컴즈가 갖는 구조적 모순등으로 새로운 모바일 전담 조직의 필요성이 대두되 SK 플랫폼을 만들어 그들에 힘을 실어주는 분위기가 된것이다. 한마디로 더이상 존속 가능성이 없기에 버려진 것이다. SK플랫폼은 괜찮을까? 틱톡을 인수하고, 다양한 기업들을 인수합병하고 있다. 규모와 기술력을 확충하고 있지만, 문제는 SK 플랫폼도 구조적으론 SK컴즈와 별반 다르지 않기 때문에 같은 길을 걸을 수 있다는 점이다. 한창 잘나가던 틱톡의 이름은 지금 사라졌다. 성장 가능성 높은 서비스를 인수하고 방치한 결과인데, 앞으로도 이런 상황이 고착화 될 수 있다고 보여진다. SK 플랫폼이 SK컴즈 같은 전철을 밟지 않으면 계열 분리를 통해서 스스로 자생력을 갖춘 회사가 되어야 할 뿐만 아니라.. 내부적으로 다양한 아이디어와 실험들이 가능한 인재들을 임원으로 승진 시켜야 한다. SKT 출신의 임원들 처럼 돈 얼마 들어가면 얼마가 나와? 돈 얼마 들어가면 회원이나 트래픽이 얼마나 생겨와 같은 실적 중심 임원은 이런 사업에 맞지 않기 때문이다. 사람을 뽑을땐 기업의 혁신성을 보여주는 다양한 이야기로 사람을 현혹하지만, 막상 회사에서 일을 해보면, 경쟁사는 이거 만드는데 너희는 못만들어.. 우리가 100억 투자했는데.. 왜? 제들처럼 못해라는 말도 안되는 놀리를 펼치고 있다. 검색을 예로보자? 네이버는 검색 기술이 많이 떨어진다고 욕먹지만, 내부적으로 검색 인력만 1000면이 넘는다. 여기에 다양한 지원과 교육등은 물론 시스템 개발에 투자하는 비용을 생각하면 어마어마 할 것이다. 네이트의 검색 엔진을 담당하는 조직에 대입해 보면.. 네이버와 비교도 안된것이다. 같은 비용을 투자해도 선행 기술과 노하우를 쌓아간 네이버를 따라가기 힘들텐데.. 임원이 투자한 만큼 성과를 만들라는 내부 압박을 한다면 어떨까? 100원 투자해서 1000원 이득을 남기라는 봉이 김선달식 논리를 SK 자회사에 들이대고 있는 것은 아닐까? SK 플랫폼이 성공적이길 원한다면, 각 조직에 일정한 비용과 인원을 자유롭게 구성하고 계획할 수 있는 권한과 이를 통해 비전을 잘 버무려 갈 수 있는 관리자와 임원 인사가 먼저 선행되어야 한다. SK 자회사들의 실패는 계속 될 것 같다? SK 자회사.. 특히 온라인과 밀접한 연관이 있는 조직들의 조직원들과 이야기해 보면 답답하다는 이야기를 많이 듣게 된다. 위에서도 잠시 언급한 것처럼 성과와 실적만으로 모든 결정이 이루어지는 환경, 전문성 떨어지는 임원들의 전진배치는 마치 벽과 대화하고 있다는 착각을 들게하고 진취적인 직원들의 기마저 저하시키는 요인으로 작용하고 있다. SK 컴즈 같은 인터넷 서비스 자회사에 SKT나 SK 브로드밴드 출신의 임원이 오면 항상 가입자당 매출등을 이야기하게 된다. 좀 더 좋은 서비스를 만들기 위해서 오픈소스 전담 팀을 만들어야 한다고 이야기하면, 그건 얼마나 들어? 그거 하면 가입자는 얼마나 늘릴 수 있어? 이런식으로 이야기된다고 한다. 설사 이런 내용을 잘 설득해 프로젝트를 진행해도.. 왜? 개발 시간이 오래걸리냐느니? 개발 인력이 왜? 많이 들어간다느니 하는 답답한 이야기만 늘어놓는다는 이야기들이 심심치 않게 흘러나온다. 이런 상황이 되는 것은 임원들의 전문성이 떨어지는 근본적 이유와 함께.. 임원들이 모두 단기 성과와 실적에 압박 받고 있다는 것을 반증하기도 한다. 이는 어떻게 보면 SK 그룹 전체의 문제일 수 있는데, SK 자회사들의 몰락을 끊어내기 위해서는 임원 인사에 있어서 코드 인사를 배제하고 전문 인사를 해야 하는 것과 함께, 임원으로 성장하는 과정에서 장기과제와 단기 과제를 성공 시키는 자신들만의 노하우를 만드는 교육이 병행되어야 한다는 생각이다. 관리자로 있을때의 조직 운영론과 임원으로 있을때의 조직 운영론은 분명 차이가 있다. 이런 점을 먼저 인식하고 내부 인재 교육에 1차적인 투자가 선행되고, 조직 특성을 그룹 문화나 특성이 아니라 서비스 성격에 맞게 규정하고 각 조직에 맞는 경영적 접근이 선행되지 않고선 SK 자회사들은 어쩌면 SK컴즈 몰락의 사례를 앞으로 지속적으로 경험할지 모른다.
이온디
이온디 10년 전
인스타그램의 창업스토리는 너무나 명백하다. 3명의 개발자가 시작했고 운영적 부담을 최소화하기 위해서 모든 기능을 기술적으로 컨트롤 할 수 있도록 시스템을 개발했다는 일화는 이제 너무 많이 들어서 귀딱지가 않을 정도다. 그런데 오늘 우연히 Quora에 올라온 질문 하나를 통해서 우리가 그들의 성공스토리보다 더 궁금한 하나의 이야기에 대해 썰을 풀어보려고 한다. [이미지 출처: 인스타그램] Quora에 올라온 내용은 전반적으로 그들이 인스타그램이… 인스타그램의 창업스토리는 너무나 명백하다. 3명의 개발자가 시작했고 운영적 부담을 최소화하기 위해서 모든 기능을 기술적으로 컨트롤 할 수 있도록 시스템을 개발했다는 일화는 이제 너무 많이 들어서 귀딱지가 않을 정도다. 그런데 오늘 우연히 Quora에 올라온 질문 하나를 통해서 우리가 그들의 성공스토리보다 더 궁금한 하나의 이야기에 대해 썰을 풀어보려고 한다. [이미지 출처: 인스타그램] Quora에 올라온 내용은 전반적으로 그들이 인스타그램이란 서비스를 시작하면서 어떻게 그것을 실제 프로젝트로 만들어 냈는지를 이야기하고 있다. 또, 커뮤니티화 되어가는 원론적인 이야기를 전개하고 있는데, 종합해 보면 하나의 관심에서 시작된 것이 모바일 붐을 등에 업고 사람들에게 알려지며 상호작용을 통해 자연스럽게 커뮤니티를 만들었다는 내용이다. 이 내용들 속에는 매우 큰 의미가 담겨져 있지만, 사실 의미를 떠나서 그럼 어떻게 그것을 만들었는가란 실증적 부분에 대해서는 언급되어 있지 않기에 답답함이 담겨져 있는 내용이다. 사실 이들의 성공은 우리가 IT에서 흔히 언급하는 인문학적 소양에서 출발했다고 볼 수 있다. 본 필자는 이 인문학이란 것을 언급하는 것을 매우 싫어 하지만, 그것을 IT의 발전 조건에서 제외하고 생각해서는 안된다는 다소 논리적 오류를 가진 생각을 갖고 있다. IT 발전의 역사를 역추적하면 결국 인간을 이해하는 것에서 출발하고 그것이 다양한 학문적 기술적 토대가되 기술을 이끌어 왔지만, 인문학이란 개념적 테두리로 모든 것을 그안에 집어 넣는 것은 반대하고 싶기 때문에 이런 논리적 모순점을 스스로 인정하고 있다고 보면 될 것이다. 너무 말이 길어졌는데, 거두절미하고 인문학 즉 인간을 이해하는 학문의 기초적 소양을 생각하면 그들이 커뮤니티를 만들어 가는 것을 쉽게 이해할 수 있다. 인문학과 커뮤니티의 연관성? 우리가 흔히들 소셜 네트워크에서 말하는 인간 관계를 정의해 보자. 부모 관계가 아닌 이상 사회에서 만나는 사람은 모두 특정한 구조에 의해서 인위적으로 또는 자발적 참여에 의해 새로운 관계가 생성된다. 구조화된 특성은 서클 개념으로 관심, 특징, 지역, 관계등에 의해서 다양한 사회적 유발 요인이 기초가되 관계가 시작된다. 관심이란 요소를 예를들어보면 사진을 찍고 싶은데, 혼자서 공부해나가기 어렵다. 그래서 책을사고, 검색을 통해 자료를 찾는다. 그 과정에서 커뮤니티를 알게 되고, 가입하게 되고.. 커뮤니티에서 다양한 정보를 얻는다. 처음엔 눈팅만 하게되지만, 일정 시간이 지나고 커뮤니티의 분위기를 익히게되면 질문을 던지기도 하고 다양한 주제들에 댓글이나 직접 컨텐츠를 만들어 참여한다. 그리고 더 나아가 오프라인 모임을 갖게 되면서 아무런 연관성도 없었던 사람 관계에서 사진이란 요소를 바탕으로 끈끈한 유대 관계를 형성해 가는 일반적인 매커니즘을 이해한다면, 인스타그램의 커뮤니티화도 쉽게 이해할 수 있게된다. 이런 구조화 되어가는 관계 형성의 모든 요소가 인문학적 소양에 해당하고 결국 사람사이에 다양한 기본적 소양과 토대를 바탕으로 커뮤니티화 되어 가는 것이기 때문에, 인문학은 사람을 만나고 다양한 지식 체계를 경험해가는 하나의 본질로 이해해 볼 수 있다. 그래서 인간에 대한 탐구적 학문인 철학적 소양이나 생각이 없는 사람은 인문학적 흐름을 이해하기도 또, 소셜 매커니즘을 만들어내기도 어려운 것이다. 인문학은 사람을 이해해야 하는 학문이기 때문이다. 인스타그램의 커뮤니티 구축의 과정 이 분석은 어디까지나 개인적인 분석에 기초했다는 점을 먼저 염두해 두길 바라는 바이다. 단순하게 인스타그램의 성공은 관계의 형성 과정에 따라 성공한 케이스는 아니다. 시대가 요구하는 요구 조건을 서비스가 충족 시켰을뿐만 아니라, 모바일 시대가 개화되면서 운이 작용하기도 했다. 물론, 이 모든 것들이 완벽하게 갖춰줘야 운도 크게 작용하는 것이기에 운으로 성공했다고는 볼 수 없지만, 분명한 것은 성공의 조건 + 트랜드 전환에 따른 운도 크게 작용했다는 것을 인지해야 한다. 필자가 이야기해보고 싶은 것은 하나의 포인트다. 커뮤니티화의 시발점이 그것인데, 인스타그램이 처음 아이디어를 바탕으로 시제품을 만들었을때, 그들은 어떻게 행동을 했겠는가? 아마 주변 지인들에게 자신들의 시제품을 알리고, 피드백 받는 일을 했을 것이다. 중요한 것은 우리가 흔히들 놓치고 있는데 바로 이것이 커뮤니티화의 시발점이란 점을 명심해야 한다. 어떤 서비스든 첫 성공을 불특정 다수에게 시작하는 경우는 흔치 않고 성공하기도 쉽지 않다. 광고/홍보를 통해서 불특정 다수에게 서비스를 노출후 돈들여 끌어들여 성공했다고 생각하는 경우도 있지만, 어떤 프로젝트든 이런 광고/홍보 이전에 초기 유저가 되는 집단에 대한 마케팅 시작에서 커뮤니티 구축이 시작된다는 점을 인식해야 한다. 정말, 모든 유저들이 몰입될만한 서비스라면 그 초기 유저가 빠르게 버즈를 만들어 피라미드식 확산 과정으로 성공에 다다르겠지만, 보통은 꽤 오랜시간 유저 하나하나를 매개로해 확산의 과정을 거친다. 트위터는 4년, 페이스북 5년, 인스타그램 1년이 소요됬다. 성공의 과정은 서비스마다 모두 다르기에 이점을 인식해야 하며, 기본적으론 처음 시제품을 전달하는 유저부터가 커뮤니티 구축의 과정이 됨을 이해해야 한다. 커뮤니티 구축 2단계 관계를 위한 상호 작용 유도 2단계 부터는 단순하게 관심 요소만 자극하지 않는다. 그 서비스를 개발하는 이야기를 블로그나 웹사이트에 올리고, 서비스를 사용해본 사람들에게 피드백을 받기 시작한다. 이 과정에 개인적으론 매우 중요하고 심도있는 과정이라고 생각하는데, 유저의 호기심을 불러일으키기 위한 빠른 피드백과 서비스 반영이 선행되야 한다. 예를들면 이런 것이다. 초기 시제품을 주변 사람에게 전달하면 이에 대한 반응이 있을텐데 그것에 대한 지속적인 관심을 어필해야 한다. 제품에 대한 불만이나 개선을 요구하면 바로 반영하고 지속적으로 피드백해야 하며, 이렇게 관계를 만들어 가는 과정에서 얻은 정보를 어딘가에 기록해 알려야 한다. 블로그에 첫 제품에 대한 주변 사람들의 반응을 적어 올리고, 개선사항을 업데이트하는 것.. 커뮤니티 구축의 첫 시발점이다. 하지만 안타깝게도 이 돈은 안들지만 매우 고되고 힘든 과정을 많은 집단은 개을이하고 있다. 심지어 이걸 너무나 잘알고 있는 본 필자도 아이엠데이에 대해서 그런 민감한 대응을 못하고 있는 것을 보면 정말 쉬운일은 아니다. 그래도 그 과정을 거쳐야 한다. 우리가 알고 있는 디씨 인사이드, 클리앙, 루리웹 같은 서비스는 커뮤니티로서 10여년 가까운 세월속에 타 서비스의 도움없이도 독자 생존하는 사이트가 됬는데, 상당한 사람들은 그들이 시작한 초기의 상황이 아니라 잘 운영되는 현 시점의 상황을 분석하는 경우가 있다. 인스타그램이 이런 과정을 100% 거쳤다고 확답 할 수는 없지만, 우연히 사람들에게 알려지고, 우연히 사람들이 좋은 제품이라고 소개했다고 여기는 것은 정말 바보 같은 상상이라고 꼭 짚어 말할 수 있겠다. 온, 오프라인의 어떠한 관계든, 관계 형성에는 상호작용이 존재한다. 마케팅을 잘해서 제품을 잘파는 집단은 이 상호작용을 잘 이해하고 소비자에게 제품을 어필해 이윤을 얻는 것이란걸 알아야 한다. 커뮤니티 구축에 대한 이론은 개념이 아니라 실체다? 막연하게 초기 커뮤니티 구축을 어떤 특별한 노하우를 통해 얻어질 것으로 생각하는 사람은 없기를 바란다. 단언컨데 운이 조금 작용 했을수는 있지만, 특별한 노하우에 의해서 만들어지는 커뮤니티는 없다. 아무리 인기 없는 커뮤니티라도 운영자 혼자서 고독과 싸우고 외로움에 취하더라도 끊임 없지, 커뮤니티 주제와 관련한 이야기나 자료를 발굴해 올린다면, 언젠가는 그 자료가 필요한 누군가가 방문하게 되고, 그 수가 증가하고 방문 회수가 증가하면서 충성도가 생겨 활성화의 길을 걷게 된다. 보통은 이 과정이 너무 어렵고 힘들기 때문에 포기하게 된다. 실제 회원이 생기면 한명이든, 두명이든.. 서비스 업데이트 정보가 됬든 무었이 됬든 그 회원이 관심을 갖을 만한 행동을 취해야 한다. 주기적으로 뉴스레터를 발행하던지, 이벤트를 걸어 인위적인 반응을 유도하던지 해야하는 것이다. 이게 바로 상호작용 이론이다. 상호작용을 만들어내기 위해선 서로의 행동을 유발하는 무언가의 계기가 필요한데, 서비스 활성화에는 이것이 서비스를 제공하는 주체에 의해서 발생한다. 이론은 실체화 하기 어렵다고 생각하지만, 실제론 실체화 할 수 있는데.. 그것에 고민을 하지 않기에 실체화되지 않는 이론으로 치부된다는 점을 인식해야 한다. 인스타그램도 이런 과정에 의해 성공을 얻었을테니 말이다. 커뮤니티를 만들려는 거대한 계획은 버려라.. 커뮤니티는 일종의 공동체다. 공동체는 특정한 주체와 이유가 있어야 형성되는 조직인데, 인위적으로 만들기가 쉽지 않다. 자발성을 띄어야 하고 그것을 위해선 주체가 될 사람들이 끊임 없이 노력해야 한다. 인스타그램을 수백억의 투자를 받은 뒤에도, 유저가 수백만명이 된 뒤에도 이런 노력을 개을리 하지 않았다. 자신들의 서비스 운영 노하우를 블로그를 통해 소개하고, 다양한 메일과 댓글을 통해 받은 피드백을 서비스에 반영하고 이것을 알리고 이해시키는 노력을 끊임 없이 해왔다. 지속적인 노력속에서 점차 유저의 입과 손을 통해 그것이 온라인에 확산됬고, 그런 과정중에 모바일 붐과 아이폰의 폭발적인 성장에 힘입어 지금에 이르게 된 것이다. 아이엠데이를 만들어가면서도 느끼는 것이지만, 의외로 사용자는 아주 작은 것에서 반응이 나오는데, 문제는 운영 주최가 되는 사람들은 그 작은 반응을 캐치하지 못할때가 많다는 것이다. 페이스북에 공지를 날려 좋아요를 얻은 것도 하나의 반응이고 댓글도 하나의 반응이다. 이런 것들에 대해서 반응을 보인 유저는 자신을 알아달라는 기대를 표하고 있을텐데.. 우리는 그러지 못한다. 이유도 있다. 일손이 딸려서, 우선 순위에 밀려서, 자신의 일이 아니라서.. 등등이다. 근데 그것은 결국 핑계라는 것을 스스로 알고 있을 것이다. 다시 말하지만 커뮤니티는 결코 거저 얻어지지 않는다. 노력하고 호흡하고 상호 작용하려는 노력이 뒤따라야 얻어지는 것이고, 인스타그램도 그런 과정을 거쳤다는 점을 인식하길 바라며 이번글 마무리 하는 바이다. 출처: http://www.quora.com/Instagram/How-did-Instagram-build-up-its-community-in-its-early-days
이온디
이온디 10년 전
트위터를 서칭하다. 팔로워들이 소개해준 프로젝트중 눈에 띄는 프로젝트가 있어서 소개해 볼까한다? 일명 "은전한닢 프로젝트"로 검색 환경에서 쓸만한 오픈 소스 기반의 한국어 형태소 분석기를 만들자는 프로젝트이다. 해당 프로젝트는 형태소 분석 엔진인 MeCab(메카브)와 연계 되는 프로젝트로, 이미 야후 출신의 유명한 개발자인 더그 커팅이 시작한 "루씬 (Lucene)" 프로젝트에도 활용 할 수 있는 프로젝트라고 한다. [이미지출처: 내 엽전(葉錢)의 가치는? 복(福) 금… 트위터를 서칭하다. 팔로워들이 소개해준 프로젝트중 눈에 띄는 프로젝트가 있어서 소개해 볼까한다? 일명 "은전한닢 프로젝트"로 검색 환경에서 쓸만한 오픈 소스 기반의 한국어 형태소 분석기를 만들자는 프로젝트이다. 해당 프로젝트는 형태소 분석 엔진인 MeCab(메카브)와 연계 되는 프로젝트로, 이미 야후 출신의 유명한 개발자인 더그 커팅이 시작한 "루씬 (Lucene)" 프로젝트에도 활용 할 수 있는 프로젝트라고 한다. [이미지출처: 내 엽전(葉錢)의 가치는? 복(福) 금섬(金蟾)이란? ] 이 프로젝트는 이용훈, 유영호 기여자에 의해서 진행되고 있는 프로젝트로, 검색 엔진 색인기에서 쓸 수 있는 적당한 품질과 속도의 공개 라이센스로 공개 된 프로젝트의 목적에서 출발했다고 한다. 이미 이 프로젝트 이외에 한나눔이나 꼬꼬마(kkma) 분석기 프로젝트등이 진행되고 있긴하지만, 형태소 분석기임에도 띄어씌기 구분의 오류나 공개 소스를 구하기 어렵다는 문제등의 문제들이 있어 이런 문제에 어떤 기여를 할 수 있을 것인지 고민하는 차원에서 이 프로젝트가 시작된 것이다. 실제 21세기 세종 계획의 일환으로 국민의 세금을 들여서 국가에서 만든 지능형 형태소 분석기도 있지만, 소스 공개는 물론, 가장 중요한 형태소 사전 파일등이 암호화 되어 공개되 있다는 점도 "은전한닢" 프로젝트를 시작하는 중요한 동기를 제공한 것으로 보인다. 해외의 경우 각 대학이나 연구 기관에서 개발한 다양한 형태소 엔진과 자료들이 오픈소스로 공개되 활용되는데 반해서 한국은 그런 해외 사례와는 대비되는 모습을 보여왔던게 사실이다. 이런 해외의 오픈 프로젝트 사례의 연장 선상에서 이 프로젝트를 볼 수 있지 않을까 생각된다. 은전한닢 프로젝트와 MeCab(메카브) 이 프로젝트 시작하면서 이 두 기여자가 주목 한 것은 오픈 소스 일본어 형태소 분석기로 공개 된 MeCab(메카브)라는 엔진이었다. MeCab 설명서 분석하는 과정에서 일본어 뿐만이 아니라 한국어 형태소 분석도 가능하다고 보았고, 실제 테스트 과정에서도 이를 확인해 이 오픈 소스를 활용한 한국형 형태소 분석기 프로젝트를 시작한 것이다. [MeCab의 특징] 언어, 사전 코퍼스에 의존하지 않는 범용적인 설계 품사 독립적 설계 CRF 채용하여 HMM 보다 성능 향상 CRF 값 추정 가능 Double-Array TRIE 각종 스크립트 언어 바인딩 (perl / ruby​​ / python / java / C#) MeCab(메카브)의 장점은 여러 장점이 있지만, 다양한 언어에 대응이 가능한 시스템일 것이다. 또, 일본어와 한국어의 유사점이 있기 때문에 품사 독립적 설계 같은 장점들을 활용 할 수 있다는 점도 매력적이었을 것으로 보인다. 이들은 실제 "나는 밥을 먹었다"를 분석했는데, 정상적인 분석이 가능했다고 한다. 다른 형태소 분석 프로젝트는 없나? 은전한닢 이외에도 루씬 기반으로 한국의 형태소 분석의 권위자인 강승식 교수가 제안한 논문을 기반으로 만든, "Lucene KoreanAnalyzer"프로젝트도 있는데, 서울대 출신의 개발자가 만든 프로젝트도 있다. 오픈소스 검색 엔진인 Nutch나 Solr 등을 이용해 이 분석기를 연동해 사용하는 기업도 있는 것을 생각하면, 이 프로젝트도 눈여겨 볼 필요가 있다. 물론, 직접적인 테스팅이 진행된 것은 아니라서 어떤 프로젝트가 더 우위에 있는 것인가 하는 의문은 남지만, 두 프로젝트 모두 각각의 가치에 따라 발전하고 있고, MeCab(메카브)는 일본쪽 엔진을 활용하고 있다는 점에서 이 두 프로젝트가 한국형 오픈 소스 형태소 분석기 개발 상당한 기여를 할 수 있다는 생각도 해볼 수 있을 것이다. 문제는, 형태소 분석기라기 보다는 형태소 분석기가 제대로 동작하기 위한 말뭉치 사전이 매우 중요한데, 이에 대한 공론화등이 꽤 필요하지 않을까 생각된다. 개인이나 기업등이 만든 말뭉치야 저작권 문제등에 의해서 사용에 제약이 따를 수 밖에 없지만, 세종 계획등으로 만든 국가 프로젝트는 최소한 더 많은 개발 프로젝트에 활용 될 수 있게 GPL, LGPL 등으로 공개하면 어떨까 싶ㅈ다. 향후 은전한닢 프로젝트의 발전 방향은? 이 프로젝트는 크게 형태소 분석기, 루씬/Solr용 Toknizer, 온라인 형태소사전 관리 시스템 등르로 구분해 개발하고 있는데, 엔진 자체나 분석기의 고도화도 중요하겠지만, 온라인 형태소 사전 관리 시스템의 개발 방향이 어떤 가치를 만들지 궁금해지는 대목이다. 꼬꼬마 프로젝트도 온라인 형태소 사전을 지원하는데, 데이터 활용등에 상당한 제약이 있는듯 보이는데, 바로 이런 점들이 향후 좀 더 오픈화되고 참여형으로 개발될 수 있게끔 현재의 방향성을 잘 지켜가주길 바라는 마음이다. 실제 서비스를 개발하고 만들다 보면, 자체 검색 엔진 구축고 검색 품질 향상등에도 상당한 시간과 개발을 투자하게 되는데, 품질 좋은 형태소 분석기가 오픈소스로 풀린다면, 한국 IT 산업 자체가 좀 더 다양한 가능성을 만들어 낼 수 있지 않을까 싶으며, 이번 글을 마무리 짓는 바이다. [이미지 출처: 은전한닢 프로젝트 마인드맵]
이온디
이온디 11년 전
해당 폰트가 뭔지 궁금해서 소스를 보니 lora 라는 폰트가 있네요. 영문 폰트인데, 한글 폰트로 한글 웹폰트를 차용해서 사용하는 것 같긴 한데, 일단 웹폰트 주소입니다. 소스를 첫줄만 봤을 땐 lora 만 보였는데 두번째 줄까지 보니깐 렉시새봄체라고 보이네요. ^^ http://www.cmsfactory.net/node/10036 소스 @import url(http://fonts.googleapis.com/earlyaccess/nanumgothic.css);@i… 해당 폰트가 뭔지 궁금해서 소스를 보니 lora 라는 폰트가 있네요. 영문 폰트인데, 한글 폰트로 한글 웹폰트를 차용해서 사용하는 것 같긴 한데, 일단 웹폰트 주소입니다. 소스를 첫줄만 봤을 땐 lora 만 보였는데 두번째 줄까지 보니깐 렉시새봄체라고 보이네요. ^^ http://www.cmsfactory.net/node/10036 소스 @import url(http://fonts.googleapis.com/earlyaccess/nanumgothic.css);@import url(http://fonts.googleapis.com/earlyaccess/nanumgothiccoding.css);@import url(http://fonts.googleapis.com/css?family=Lora);@font-face{font-family:ls;src:url(/sites/all/themes/JB01/fonts/LexiSaebomR.eot);src:url(/sites/all/themes/JB01/fonts/LexiSaebomR.eot?#iefix) format('embedded-opentype'),url(/sites/all/themes/JB01/fonts/LexiSaebomR.woff) format('woff'),url(/sites/all/themes/JB01/fonts/LexiSaebomR.ttf) format('truetype'),url(/sites/all/themes/JB01/fonts/LexiSaebomR.svg) format('svg');}*{background-image:url(/sites/all/themes/JB01/images/jb_blank.png);}body{margin:0px;}#jb_header_bg{background-color:#222222;}#jb_header_area{width:940px;margin:auto;padding:20px 20px 20px 20px;}#jb_header{}#jb_header:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_site_name{float:left;}#jb_header_menu{float:right;}#jb_top_menu_bg{background-color:#333333;border-top:1px solid #444444;border-bottom:1px solid #333333;}#jb_top_menu_area{width:940px;margin:auto;padding:10px 20px 10px 20px;}#jb_top_menu_area:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_top_menu_1{width:460px;float:left;}#jb_top_menu_2{width:460px;float:right;}#jb_main_bg{}#jb_main_area{width:940px;margin:auto;padding:20px 20px 20px 20px;}#jb_main_area:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_main_content{width:620px;float:left;}#jb_front_row_1{}#jb_front_row_1:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_front_1{width:300px;float:left;}#jb_front_2{width:300px;float:right;}#jb_front_row_2{}#jb_front_row_2:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_front_3{width:300px;float:left;}#jb_front_4{width:300px;float:right;}#jb_sidebar_right{width:300px;float:right;}#jb_footer_bg{background-color:#333333;border-top:1px solid #333333;border-bottom:1px solid #333333;}#jb_footer_area{width:940px;margin:auto;padding:0px 20px 0px 20px;}#jb_footer_area:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_footer_1{width:300px;float:left;margin-right:20px}#jb_footer_2{width:300px;float:left;margin-right:20px}#jb_footer_3{width:300px;float:right;}#jb_copyright_bg{background-color:#222222;border-top:1px solid #444444;border-bottom:1px solid #222222;}#jb_copyright_area{width:940px;margin:auto;padding:0px 20px 0px 20px;}#jb_copyright{}body{font-family: "Lora",ls,"Nanum Gothic";font-size:14px;line-height:200%;color:#666666;}h1{font-size:1.5em;line-height:200%;}h2{font-size:1.4em;line-height:200%;}h3{font-size:1.3em;line-height:200%;}h4{font-size:1.2em;line-height:200%;}h5{font-size:1.1em;line-height:200%;}h6{font-size:1.0em;line-height:200%;}img{max-width:100%;height:auto;}a{color:#2d5c88;text-decoration:none;}a:hover{color:red;}pre{font-family:Menlo,Monaco,Consolas,"Courier New","Nanum Gothic Coding",monospace;background-color:#f5f5f5;border:1px solid #bcbcbc;padding:10px;word-break:break-all;word-wrap:break-word;font-size:0.9em;line-height:180%;}input.form-text{font-family:"Lora",ls,"Nanum Gothic";font-size:1.0em;padding:5px 8px;margin:0px;border:1px solid #bcbcbc;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;color:#666666;border-radius:3px;}input.form-submit{font-family:"Lora",ls,"Nanum Gothic";font-size:1.0em;padding:5px 8px;margin:0px;border:1px solid #333333;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;color:#ffffff;cursor:pointer;background-color:#333333;border-radius:3px;}select{font-family:"Lora",ls,"Nanum Gothic";font-size:1.0em;border:1px solid #bcbcbc;padding:5px;}#block-user-login div.form-item{margin:0px;}#block-user-login div.form-item-name{float:left;}#block-user-login div.form-item-pass{float:right;}#block-user-login .form-item-name input{width:146px;height:36px;margin-bottom:10px;}#block-user-login .form-item-pass input{width:146px;height:36px;margin-bottom:10px;}#block-user-login div.item-list{clear:both;}#block-user-login input.form-submit{width:80px;height:36px;}#block-search-form input.form-text{float:left;width:220px;height:36px;border-radius:3px 0px 0px 3px;}#block-search-form input.form-submit{width:80px;height:36px;border-radius:0px 3px 3px 0px;}#search-form input.form-text{width:300px;height:36px;}#search-form input.form-submit{width:80px;height:36px;}form.comment-form input.form-submit{margin-right:5px;width:80px;height:36px;}input#edit-title{width:100%;font-size:1.2em;height:40px;}html.js input.form-autocomplete{background-position:100% 8px;}form.node-form input.form-submit{margin-right:5px;}textarea.form-textarea{font-family:ls;font-size:1em;line-height:200%;}#jb_header #jb_site_name h1 a{font-size:30px;color:#eeeeee;}#jb_header #jb_header_menu h2{display:none;}#jb_header #jb_header_menu ul{margin-top:20px;}#jb_header #jb_header_menu li{display:inline;}#jb_header #jb_header_menu a{color:#eeeeee;}#jb_header #jb_header_menu a:hover{color:#ffffff;}#jb_top_menu{font-size:13px;color:#cda869;}#jb_top_menu h2{display:inline;font-size:13px;margin-right:10px;}#jb_top_menu h2 + div{display:inline;}#jb_top_menu ul{margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;display:inline;}#jb_top_menu li{display:inline;}#jb_top_menu a{color:#eeeeee;}#jb_top_menu a:hover{color:#ffffff;}.jb_front h2{border-bottom:1px solid #bcbcbc;font-size:1.2em;}#jb_front_1 ul,#jb_front_2 ul,#jb_front_3 ul,#jb_front_4 ul{font-size:13px;line-height:180%;}#jb_front_1 a,#jb_front_2 a,#jb_front_3 a,#jb_front_4 a{color:#666666;}#jb_front_1 a:hover,#jb_front_2 a:hover,#jb_front_3 a:hover,#jb_front_4 a:hover{color:#f96e5b;}#jb_main_content h2.jb_node_title{border-bottom:1px solid #bcbcbc;font-size:1.2em;}#jb_main_content ul.tabs{border-top:1px solid #bcbcbc;border-bottom:1px solid #bcbcbc;margin:0px 0px 10px 0px;padding:10px 10px 10px;}#jb_main_content ul.tabs li a{border:none;background:none;}#jb_main_content .jb_node_submitted{margin-bottom:10px;}#jb_main_content .field-label-above{}#jb_main_content .jb_content_top_right{float:right;margin:10px 0px 10px 20px;}#jb_main_content img.file-icon{vertical-align:middle;}#jb_main_content .node > ul.links{display:inline-block;font-size:12px;}#jb_main_content .node > ul.links li{border:1px solid #bcbcbc;border-radius:3px;padding:8px;}#jb_main_content .jb_content_bottom_1:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#jb_main_content .jb_content_bottom_1_1{float:left;width:200px;}#jb_main_content .jb_content_bottom_1_2{float:right;width:400px;}#jb_main_content #comments .comment{margin-bottom:10px;padding:10px;border:1px solid #bcbcbc;border-radius:10px;}#jb_main_content #comments .comment h3{display:none;}#jb_main_content #comments .comment .submitted{border-bottom:1px solid #bcbcbc;}#jb_main_content ul.pager{margin-top:30px;font-size:0.9em;}#jb_main_content ul.pager li{margin:0px 1px;}#jb_main_content ul.pager li:first-child{margin-left:0px;}#jb_main_content ul.pager li{border:1px solid #bcbcbc;border-radius:3px;}#jb_main_content ul.pager li.pager-current{background-color:#bcbcbc;padding:0.5em 1.0em;}#jb_main_content ul.pager a{display:inline-block;padding:5px;}.jb_content_bottom_1_2 ul{font-size:0.9em;line-height:180%;}#jb_sidebar_right h2{border-bottom:1px solid #bcbcbc;font-size:1.2em;}#jb_sidebar_right a{color:#666666;}#jb_sidebar_right a:hover{color:#f96e5b;}#jb_sidebar_right a.active{font-weight:bold;}#jb_sidebar_right ul{font-size:13px;line-height:180%;}#jb_sidebar_right #block-system-user-menu ul{padding-left:12px;}#jb_sidebar_right #block-book-navigation a.active{color:#2195c9;font-weight:normal;}#jb_footer_area{color:#aaaaaa;}#jb_footer_area h2{color:#cccccc;border-bottom:1px solid #444444;font-size:1.2em;}#jb_footer_area ul{font-size:13px;line-height:180%;}#jb_footer_area a{color:#aaaaaa;}#jb_footer_area a:hover{color:#eeeeee;}#jb_copyright{color:#ffffff;text-align:center;}table.jb_forum_table{width:100%;}table.jb_forum_table th{padding:5px;text-align:center;}table.jb_forum_table tr{border-bottom:1px solid #bcbcbc;}table.jb_forum_table td{padding:5px;}.jb_forum_topic_n,.jb_forum_post_n,.jb_forum_reply_n{width:50px;text-align:center;}div.messages{background-position:12px 12px;margin-top:20px;}#book-outline{min-width:initial;}#block-book-navigation .book-block-menu ul{padding:0px 0px 0px 12px;margin:0px 0px 0px 0px;}#block-book-navigation .book-block-menu ul li.dhtml-menu-cloned-leaf{font-size:1.0em;font-style:normal;font-weight:normal;}.jb_book_title{margin:200px 0px 200px 0px;text-align:center;font-size:40px;}.jb_box_black{border:1px solid #DADADA;background-color:#EEEEEE;padding:0px 15px 0px 15px;}.jb_box_green{border:1px solid #72D727;background-color:#EEF9E6;padding:0px 15px 0px 15px;}.jb_box_orange{border:1px solid #FBA903;background-color:#FDF4E2;padding:0px 15px 0px 15px;}.jb_box_red{border:1px solid #FF0000;background-color:#FEE2E2;padding:0px 15px 0px 15px;}.jb_box_blue{border:1px solid #00A0FF;background-color:#E2F4FE;padding:0px 15px 0px 15px;}.jb_box_refer{border:1px solid #DADADA;background-color:#EEEEEE;padding:0px 15px 0px 15px;}.jb_box_ad_black{border:1px solid #DADADA;background-color:#EEEEEE;padding:0px 15px 0px 15px;}.page-node-track #jb_main_content table{width:100%;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:11px;}.page-node-track #jb_main_content table th{padding-right:0px;text-align:center;}.views-field-field-jb-theme-image img{width:100%;}.field-name-field-jb-theme-image .field-items{text-align:center;}.jb_theme_a{text-align:center;}.jb_theme_a a{display:inline-block;color:#ffffff;background-color:#2195c9;border-radius:3px;margin:10px 5px;padding:10px;width:100px;}.jb_theme_a a:hover{background-color:#27a9e3}a.jb_theme_a_details{}a.jb_theme_a_demo{} .view-jb-taxonomy-term .view-content .item-list ul{list-style-type:none;}.view-jb-taxonomy-term .view-content .item-list ul li{margin:0px 0px 15px 0px;}.view-jb-taxonomy-term .view-content .item-list ul li:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.view-jb-taxonomy-term .views-field-title{font-weight:bold;margin:5px 0px;}.view-jb-taxonomy-term .views-field-field-image{float:left;margin:0px 15px 0px 0px;line-height:0;border:1px solid #bcbcbc;padding:5px;border-radius:3px;}.view-jb-taxonomy-term .views-field-field-category .views-label-field-category{font-weight:bold;}.view-jb-taxonomy-term .views-field-field-category .field-content{display:inline-block;}.view-jb-taxonomy-term .views-field-field-image-category .views-label-field-image-category{font-weight:bold;}.view-jb-taxonomy-term .views-field-field-image-category .field-content{display:inline-block;}.node-type-jb-reference #jb_main_content{width:730px;}.node-type-jb-reference #jb_sidebar_right{width:190px;}
이온디
이온디 11년 전
기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? [출처] 기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까?|작성자 키롱 http://blog.naver.com/jjonny/90085518455 전엔 "변경 사항을 기본 서식 파일에 자동으로 저장했습니다. 로드하시겠습니까?" 하고 묻길래 좀 뒤적거렸는데(엮인글 참조) 이번엔 "기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습… 기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? [출처] 기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까?|작성자 키롱 http://blog.naver.com/jjonny/90085518455 전엔 "변경 사항을 기본 서식 파일에 자동으로 저장했습니다. 로드하시겠습니까?" 하고 묻길래 좀 뒤적거렸는데(엮인글 참조) 이번엔 "기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까?"란다. 망할 빌리.. 일단 지난번 쓴 글에 따라 해보자. 1. 옵션을 끈다. 끄려고 보니 찾기가 어렵고... 찾은 담에 보니 이미 꺼져 있을 뿐이고... 2. 기본 서식이 변경 안되게 이렇게 하려면 .wll이나 com을 변경하라는데 어우 보기만해도 귀찮다. 패스. 매크로 지우는건 좀 쉬워보여서 들어가는데, 개발 도구 탭을 보이려면 옵션을 또 손대야 한다. 이정도야 하지. 우여곡절끝에 연 매크로. 아무것도 없다; 3. 매크로 바이러스 제거 그래. 설마가 사람 잡는단다. 하지만 설마 내 컴이 매크로 바이러스에 걸렸을리 없다. 백신 빠방하고 이상한 행동은 안한다구! ...결론은 wll이랑 com을 손봐야 한다는거. 안하고 만다 ;;; ...가 아니라, ... ... 지금은 곤란하다. 기다려달라. Normal.dotm [Office Word] 에러 http://jjun7983.tistory.com/171 "Word에서 기존 Normal.dotm에 문제가 있음을 발견했습니다. Normal.dotm을(를) 새로 만드시겠습니까?" 라는 확인 창이 떴다.. 이건또 뭥미...젠장...ㅠㅠ 또 검색... 고고씽.. 원인은 한마디로 말하자면 Office Word 문서를 사용할때 Word 기본 서식파일이다. 그 기본 서식 파일이 손상되서 생기는 문제다. 원인을 알았으니 해결방법은 찾아보니 겁나 길다.. 그래서 대충... 우선 파일있는 경로로 %userprofile%\appdata\roaming\microsoft\templates Normal.dotm 을 이름바꾸기 Oldword.old로 변경후 탐색기 닫기! Word 2007 은 Word 실행 - Microsoft Office 단추 - Word 옵션 - 추가기능 - 서식 파일 이동 - 첨부 클릭 - Templates 폴더에서 Normal.dotm[새로 생성된 파일] 열기 - 확인 - Word 를 종료 서식파일 변경완료 ~ 다시 실행해본다. 다른 방법도 있는데 작성은 힘들고.. 참고 하길... 참고 : http://support.microsoft.com/kb/918429/ko http://zyint.tistory.com/361 Word 2007을 종료할 때마다 기본 서식 파일에 변경 내용을 저장할 것인지 묻는 메시지가 나타난다 Word 2007을 종료할 때마다 기본 서식 파일에 변경 내용을 저장할 것인지 묻는 메시지가 나타난다#증상#Microsoft Office Word 2007을 종료할 때마다 다음과 같은 메시지가 나타난다. 기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? 원인#이 문제는 다음 조건 중 하나에 해당하는 경우에 발생한다. 기본 서식 파일을 저장하기 전에 확인 옵션이 설정되어 있는 경우기본 서식 파일을 변경하는 추가 기능 또는 매크로가 컴퓨터에 설치되어 있는 경우. 예를 들어 컴퓨터에 다음과 같은 추가 기능이 설치되어 있으면 이 문제가 발생할 수 있습니다. Stamps.com Internet Postage.wll 파일서식 파일COM 추가 기능자동 매크로컴퓨터가 기본 서식 파일(Normal.dotm)을 변경하는 매크로 바이러스에 감염된 경우 해결 방법#해결 방법 1: "기본 서식 파일을 저장하기 전에 확인" 옵션 해제#기본 서식 파일을 저장하기 전에 확인 옵션이 설정되어 있는 경우에 이 문제를 해결하려면 다음과 같이 하십시오. 참고 Word 2007에서 이 옵션을 해제해도 기본 서식 파일이 변경될 수 있습니다. 그러나 이 경우 변경 내용을 저장할 것인지 묻는 메시지가 나타나지 않습니다. 이 방법보다는 이 문서의 뒷부분에서 설명하는 다른 해결 방법을 사용하는 것이 좋습니다. Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.고급을 누릅니다.저장에서 기본 서식 파일을 저장하기 전에 확인 확인란의 선택을 취소합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다. 해결 방법 2: 기본 서식 파일을 변경하는 추가 기능 또는 매크로 제거#기본 서식 파일을 변경하는 추가 기능 또는 매크로가 컴퓨터에 설치되어 있는 경우에 이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오. 방법 1: Word 2007 Startup 폴더 및 Office Startup 폴더에서 .wll 추가 기능 및 서식 파일 제거#Word 2007을 시작하면 Office Startup 폴더 및 Word Startup 폴더에 들어 있는 서식 파일과 추가 기능이 자동으로 로드됩니다. 이러한 항목 중 하나에서 충돌이나 문제가 발생하면 "현상" 절에 설명된 문제가 나타납니다. Startup 폴더에 있는 항목으로 인해 문제가 발생하는 것인지 확인하려면 폴더를 임시로 비울 수 있습니다. 이렇게 하려면 다음과 같이 하십시오. Word 2007의 모든 인스턴스를 종료합니다. Microsoft Outlook에서 Word 2007을 전자 메일 편집기로 사용하는 경우에는 Outlook도 종료합니다.바탕 화면에서 내 컴퓨터를 두 번 누른 다음 Office Startup 폴더를 엽니다. 기본적으로 Office Startup 폴더는 다음 위치에 있습니다. C:\Program Files\Microsoft Office\Office12\StartupOffice Startup 폴더의 각 항목을 바탕 화면으로 끕니다. 또는 바탕 화면에 폴더를 만들고 각 항목을 이 새 폴더로 끕니다. 참고 바탕 화면에 새 폴더를 만들려면 바탕 화면의 빈 영역을 마우스 오른쪽 단추로 누르고 새로 만들기를 가리킨 다음 폴더를 누르십시오.Word Startup 폴더를 엽니다. 기본적으로 Word Startup 폴더는 다음 위치에 있습니다. C:\Documents and Settings\user name\Application Data\Microsoft\Word\Startup Word Startup 폴더의 각 항목을 바탕 화면으로 끕니다. 또는 바탕 화면에 폴더를 만들고 각 항목을 이 새 폴더로 끕니다.Word 2007을 시작합니다. Office Startup 폴더 및 Word Startup 폴더에서 여러 항목을 제거한 이후 문제가 더 이상 발생하지 않으면 한 번에 하나씩 파일을 원래 Startup 폴더에 다시 추가하여 문제의 원인을 확인할 수 있습니다. 이때 문제의 원인이 되는 파일을 찾기 위해 각 파일을 추가한 후 문제가 발생하는 상황을 재현해 보십시오. 방법 2: COM 추가 기능 제거#COM 추가 기능은 어떤 위치에나 설치할 수 있으며 Word 2007과 상호 작용하는 프로그램에 의해 설치됩니다. 컴퓨터에 설치되어 있는 COM 추가 기능의 목록을 보려면 다음과 같이 하십시오. Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.추가 기능을 누릅니다.관리에서 COM 추가 기능을 누른 다음 이동을 누릅니다. COM 추가 기능 대화 상자가 나타납니다. COM 추가 기능 대화 상자에 추가 기능이 나열되면 각 추가 기능을 임시로 해제합니다. 이렇게 하려면 표시된 각 COM 추가 기능의 확인란을 선택 취소한 다음 확인을 누릅니다. Word 2007을 다시 시작하면 해제한 COM 추가 기능이 로드되지 않습니다. COM 추가 기능을 해제한 후에도 문제가 해결되면 나열된 COM 추가 기능 중 하나가 문제의 원인입니다. 문제의 원인이 되는 추가 기능을 확인하려면 COM 추가 기능을 한 번에 하나씩 설정한 다음 Word 2007을 다시 시작해 보십시오. 방법 3: Word 2007 자동 매크로 제거#자동 매크로는 Word 2007을 시작하거나 Word 2007에서 특정 동작을 수행했을 때 실행됩니다. 다음 표는 Word 2007 자동 매크로를 보여 줍니다. 매크로저장 위치동작AutoExec기본 서식 파일 또는 글로벌 추가 기능Word 2007을 시작하면 실행됩니다.AutoNew서식 파일서식 파일을 기반으로 하는 새 문서를 만들면 실행됩니다.AutoOpen문서 또는 서식 파일서식 파일을 기반으로 하거나 매크로가 포함된 문서를 열면 실행됩니다.AutoClose문서 또는 서식 파일서식 파일을 기반으로 하거나 매크로가 포함된 문서를 닫으면 실행됩니다.AutoExit기본 서식 파일 또는 글로벌 추가 기능Word 2007을 종료하면 실행됩니다.제거해야 할 자동 매크로를 확인하려면 Word 2007 자동 매크로의 실행을 일시적으로 중지합니다. AutoExec 매크로의 실행을 일시적으로 중지하려면 시작을 누르고 모든 프로그램을 가리킨 다음 Shift 키를 누른 상태에서 Microsoft Word 2007을 누릅니다. 이 표에 나열된 다른 매크로 중 하나를 중지하려면 해당 매크로가 실행되게 동작을 Shift 키를 누른 상태에서 실행합니다. 자동 매크로를 제거하려면 다음과 같이 하십시오. Word 2007을 시작합니다.개발 도구 탭의 코드 그룹에서 매크로를 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오. Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.매크로 대화 상자에서 이름이 "Auto"로 시작하는 매크로를 모두 제거합니다. 자동 매크로를 제거하려면 매크로를 누른 다음 삭제를 누릅니다. 참고 Word 2007 추가 기능에 의해 자동 매크로가 추가되었을 수 있습니다. 서식 파일에 자동 매크로가 포함되었는지 확인하려면 매크로 위치 상자에서 각 서식 파일을 하나씩 누릅니다. 이렇게 하면 선택한 서식 파일에 포함된 매크로 목록이 표시됩니다. 서식 파일에 자동 매크로가 포함되었을 확인했으면 해당 서식 파일을 컴퓨터에서 제거하는 것이 좋습니다. 그러나 Word 2007 추가 기능에 의해 추가된 서식 파일을 제거하면 추가 기능의 기능에 영향을 줄 수 있습니다. 취소를 눌러 매크로 대화 상자를 닫습니다.Microsoft Office 단추를 누른 다음 Word 끝내기를 누릅니다. Word 2007을 다시 시작한 이후에 문제가 발생하지 않으면 자동 매크로 중 하나가 문제의 원인입니다. 해결 방법 3: 매크로 바이러스에 의한 감염으로부터 컴퓨터 보호#컴퓨터가 매크로 바이러스에 감염된 경우에 이 문제를 해결하려면 다음 방법 중 하나 이상을 사용하십시오. 방법 1: 바이러스 백신 소프트웨어 설치 및 업데이트#매크로 바이러스를 장기적으로 방지하려면 매크로 바이러스 검색 기능을 제공하는 바이러스 백신 소프트웨어를 설치합니다. 방법 2: Word 2007에서 매크로 설정 구성#Word 2007에서는 다음과 같은 매크로 설정을 사용하여 매크로 바이러스에 의해 문서, 서식 파일 또는 추가 기능이 감염될 가능성을 줄일 수 있습니다. 모든 매크로 제외(알림 표시 없음)모든 매크로 제외(알림 표시) 참고 이 설정이 기본 설정입니다. 디지털 서명된 매크로만 포함모든 매크로 포함(위험성 있는 코드가 실행될 수 있으므로 권장하지 않음) Word 2007에서 매크로 설정을 변경하려면 다음과 같이 하십시오. 개발 도구 탭의 코드 그룹에서 매크로 보안을 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오. Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.매크로 설정을 누릅니다.매크로 설정에서 신뢰할 수 없는 위치에 있는 문서에 대해 다음 매크로 설정 중 하나를 누릅니다. 모든 매크로 제외(알림 표시 없음)모든 매크로 제외(알림 표시)디지털 서명된 매크로만 포함모든 매크로 포함(위험성 있는 코드가 실행될 수 있으므로 권장하지 않음)확인을 눌러 보안 센터 대화 상자를 닫습니다. 방법 3: 기본 서식 파일 잠그기#기본 서식 파일을 잠그고 암호를 만들면 매크로 바이러스가 컴퓨터에 무단으로 액세스할 가능성을 줄일 수 있습니다. 기본 서식 파일을 잠그려면 다음과 같이 하십시오. 개발 도구 탭의 코드 그룹에서 Visual Basic을 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오. Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.Visual Basic Editor의 프로젝트 창에서 This Document를 누릅니다. 참고 이때 프로젝트 창이 보이지 않으면 보기 메뉴에서 프로젝트 탐색기를 누르십시오. 도구 메뉴에서 프로젝트 속성을 누릅니다.보호 탭을 누르고 읽기 전용으로 프로젝트 잠금 확인란을 선택합니다.암호 입력란에 암호를 입력합니다. 그런 다음 암호 확인 입력란에 암호를 다시 입력합니다.확인을 눌러 프로젝트 속성 대화 상자를 닫습니다.파일 메뉴에서 닫고 Microsoft Word(으)로 돌아가기를 누릅니다.Microsoft Office 단추를 누른 다음 Word 끝내기를 누릅니다. 다음 메시지가 나타나면 예를 누릅니다. 기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? 참고자료#(1) http://support.microsoft.com/?kbid=918064 [ㅁㄴㅇ출처] 기본 서식 파일 Norhttp://jjun7983.tistory.com/171mal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까?|작성자 키롱 ㄴㅇㄹ 열기-서식파일 폴더를 열어 Normal.dotm 이라는 서식파일을 찾아 여세요. 그안에 서식을 만들어 저장하면 새문서를 열때마다 그 서식으로 열립니다. 이미 만들어 놓은 서식파일로는 열때마다 새로 찾아 열어야 합니다. Ctrl+O 열기의 서식파일이나, 새문서만들기-내 서식파일 (폴더는 같습니다) 또 새문서의 기존 항목(파일)에서 새로 만들기 에서 열수 있죠. 열기의 서식파일과 새문서의 서식파일..이 다른점은 열기의 서식파일은 다른이름으로 저장하지 않으면 덮어써 진다는 것입니다. 아래처럼요.. 그래서 Normal.dotm 파일도 수정할 수 있죠.. 새문서, 기존항목은 저장하면 따로 이름을 정할 수 있습니다. 기본서식파일 Normal.dotm(새문서의 서식파일)을 수정해 쓰시다 원래 있던 빈 새문서 창으로 돌아가려면 서식파일 폴더의 Normal.dotm 을 삭제하면 됩니다. 기본값으로 다시 만들어져요. 기본 서식 파일(Normal.dotm) 변경 Normal.dotm 서식 파일은 Microsoft Office Word 2007을 시작할 때마다 열리며, 이 파일에는 문서의 기본 모양을 지정하는 기본 스타일 및 사용자 지정 설정이 포함되어 있습니다. Normal.dotm 서식 파일 변경Normal.dotm을 변경하면 이후 만들어지는 모든 문서에 변경된 내용이 적용됩니다. Microsoft Office 단추 를 클릭한 다음 열기를 클릭합니다.다음 중 하나를 실행합니다.Microsoft Windows Vista의 경우서식 파일을 클릭하고 Normal.dotm 파일을 두 번 클릭하여 엽니다. Microsoft Windows XP 또는 Microsoft Windows Server 2003의 경우파일 이름 옆의 서식 파일을 클릭합니다. 열기 대화 상자에 서식 파일이 나열되어 있지 않으면 파일 형식 상자 옆에 있는 화살표를 클릭한 다음 모든 Word 서식 파일을 클릭합니다. 기본 서식 파일로 작업하고 있는지 알고 싶으면 Word 제목 표시줄에 Normal.dotm이 나타나는지 확인하십시오.글꼴, 여백, 간격 및 기타 설정을 원하는 대로 변경합니다. 일반 문서를 변경할 때 사용하는 것과 같은 명령과 기능을 사용할 수 있지만, Normal.dotm을 변경하면 이후 만들어지는 모든 문서에 해당 변경 내용이 적용된다는 점을 기억해야 합니다. 변경을 완료했으면 Microsoft Office 단추 를 클릭한 다음 저장을 클릭합니다. 참고 Normal.dotm의 이름을 바꾸거나 이동하거나 파일이 손상된 경우에는 다음에 Word를 시작할 때 원래 기본 설정을 사용하는 새 버전이 자동으로 만들어집니다. 새 버전에는 이름을 바꾸거나 이동한 이전 버전에서 설정한 사용자 지정 내용이 포함되지 않습니다. http://office.microsoft.com/ko-kr/word-help/HA010030756.aspx http://support.microsoft.com/kb/918064/ko Word 2007을 종료할 때마다 기본 서식 파일에 변경 내용을 저장할 것인지 묻는 메시지가 나타난다 인쇄 전자 메일 기술 자료 번역 기술 자료: 918064 - 이 문서가 적용되는 제품 보기. 베타 정보이 문서에서는 Microsoft 제품의 베타 릴리스에 대해 설명합니다. 이 문서의 정보는 "있는 그대로" 제공되며 사전 통보 없이 변경될 수 있습니다. 이 베타 제품은 Microsoft의 공식 제품 지원 서비스를 받을 수 없습니다. 베타 릴리스 지원을 얻는 방법에 대한 자세한 내용은 베타 제품 파일에 포함된 설명서를 참조하거나 릴리스를 다운로드한 웹 사이트를 확인하십시오. 모두 확대 | 모두 축소 이 페이지에서요약본 문서에서는 Microsoft Office Word 2007을 종료할 때마다 기본 서식 파일 Normal.dot에 변경 내용을 저장할 것인지 묻는 메시지가 나타나는 문제의 해결 방법에 대해 설명합니다. 첫 번째 방법은 기본 서식 파일을 저장하기 전에 확인 옵션을 해제하는 것입니다. 그러나 이 방법을 사용하면 Word 2007에서 기본 서식 파일에 변경 내용을 자동으로 저장하는 경우에도 메시지가 나타나지 않기 때문에 문제가 될 수 있습니다. 두 번째 방법은 기본 서식 파일을 변경하는 모든 추가 기능 또는 서식 파일을 제거하는 것이고, 세 번째 방법은 기본 서식 파일을 변경하는 매크로 바이러스로부터 컴퓨터를 보호하는 것입니다. 위로 가기 | 피드백 보내기 현상Microsoft Office Word 2007을 종료할 때마다 다음과 같은 메시지가 나타납니다.기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? 위로 가기 | 피드백 보내기 원인이 문제는 다음 조건 중 하나에 해당하는 경우에 발생합니다.기본 서식 파일을 저장하기 전에 확인 옵션이 설정되어 있는 경우기본 서식 파일을 변경하는 추가 기능 또는 매크로가 컴퓨터에 설치되어 있는 경우. 예를 들어 컴퓨터에 다음과 같은 추가 기능이 설치되어 있으면 이 문제가 발생할 수 있습니다.Stamps.com Internet Postage추가 기능은 다음과 같은 항목 중 하나 이상을 컴퓨터에 추가할 수 있습니다..wll 파일서식 파일COM 추가 기능자동 매크로컴퓨터가 기본 서식 파일(Normal.dotm)을 변경하는 매크로 바이러스에 감염된 경우위로 가기 | 피드백 보내기 해결 과정이 문제를 해결하려면 다음 해결 방법 중 하나 이상을 사용하십시오.해결 방법 1: "기본 서식 파일을 저장하기 전에 확인" 옵션 해제기본 서식 파일을 저장하기 전에 확인 옵션이 설정되어 있는 경우에 이 문제를 해결하려면 다음과 같이 하십시오. 참고 Word 2007에서 이 옵션을 해제해도 기본 서식 파일이 변경될 수 있습니다. 그러나 이 경우 변경 내용을 저장할 것인지 묻는 메시지가 나타나지 않습니다. 이 방법보다는 이 문서의 뒷부분에서 설명하는 다른 해결 방법을 사용하는 것이 좋습니다.Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.고급을 누릅니다.저장에서 기본 서식 파일을 저장하기 전에 확인 확인란의 선택을 취소합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.해결 방법 2: 기본 서식 파일을 변경하는 추가 기능 또는 매크로 제거기본 서식 파일을 변경하는 추가 기능 또는 매크로가 컴퓨터에 설치되어 있는 경우에 이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.방법 1: Word 2007 Startup 폴더 및 Office Startup 폴더에서 .wll 추가 기능 및 서식 파일 제거Word 2007을 시작하면 Office Startup 폴더 및 Word Startup 폴더에 들어 있는 서식 파일과 추가 기능이 자동으로 로드됩니다. 이러한 항목 중 하나에서 충돌이나 문제가 발생하면 "현상" 절에 설명된 문제가 나타납니다. Startup 폴더에 있는 항목으로 인해 문제가 발생하는 것인지 확인하려면 폴더를 임시로 비울 수 있습니다. 이렇게 하려면 다음과 같이 하십시오.Word 2007의 모든 인스턴스를 종료합니다. Microsoft Outlook에서 Word 2007을 전자 메일 편집기로 사용하는 경우에는 Outlook도 종료합니다.바탕 화면에서 내 컴퓨터를 두 번 누른 다음 Office Startup 폴더를 엽니다. 기본적으로 Office Startup 폴더는 다음 위치에 있습니다.C:\Program Files\Microsoft Office\Office12\Startup Office Startup 폴더의 각 항목을 바탕 화면으로 끕니다. 또는 바탕 화면에 폴더를 만들고 각 항목을 이 새 폴더로 끕니다. 참고 바탕 화면에 새 폴더를 만들려면 바탕 화면의 빈 영역을 마우스 오른쪽 단추로 누르고 새로 만들기를 가리킨 다음 폴더를 누르십시오.Word Startup 폴더를 엽니다. 기본적으로 Word Startup 폴더는 다음 위치에 있습니다.C:\Documents and Settings\user name\Application Data\Microsoft\Word\Startup Word Startup 폴더의 각 항목을 바탕 화면으로 끕니다. 또는 바탕 화면에 폴더를 만들고 각 항목을 이 새 폴더로 끕니다.Word 2007을 시작합니다.Office Startup 폴더 및 Word Startup 폴더에서 여러 항목을 제거한 이후 문제가 더 이상 발생하지 않으면 한 번에 하나씩 파일을 원래 Startup 폴더에 다시 추가하여 문제의 원인을 확인할 수 있습니다. 이때 문제의 원인이 되는 파일을 찾기 위해 각 파일을 추가한 후 문제가 발생하는 상황을 재현해 보십시오.방법 2: COM 추가 기능 제거COM 추가 기능은 어떤 위치에나 설치할 수 있으며 Word 2007과 상호 작용하는 프로그램에 의해 설치됩니다. 컴퓨터에 설치되어 있는 COM 추가 기능의 목록을 보려면 다음과 같이 하십시오.Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.추가 기능을 누릅니다.관리에서 COM 추가 기능을 누른 다음 이동을 누릅니다. COM 추가 기능 대화 상자가 나타납니다.COM 추가 기능 대화 상자에 추가 기능이 나열되면 각 추가 기능을 임시로 해제합니다. 이렇게 하려면 표시된 각 COM 추가 기능의 확인란을 선택 취소한 다음 확인을 누릅니다. Word 2007을 다시 시작하면 해제한 COM 추가 기능이 로드되지 않습니다. COM 추가 기능을 해제한 후에도 문제가 해결되면 나열된 COM 추가 기능 중 하나가 문제의 원인입니다. 문제의 원인이 되는 추가 기능을 확인하려면 COM 추가 기능을 한 번에 하나씩 설정한 다음 Word 2007을 다시 시작해 보십시오.방법 3: Word 2007 자동 매크로 제거자동 매크로는 Word 2007을 시작하거나 Word 2007에서 특정 동작을 수행했을 때 실행됩니다. 다음 표는 Word 2007 자동 매크로를 보여 줍니다. 매크로저장 위치동작AutoExec기본 서식 파일 또는 글로벌 추가 기능Word 2007을 시작하면 실행됩니다.AutoNew서식 파일서식 파일을 기반으로 하는 새 문서를 만들면 실행됩니다.AutoOpen문서 또는 서식 파일서식 파일을 기반으로 하거나 매크로가 포함된 문서를 열면 실행됩니다.AutoClose문서 또는 서식 파일서식 파일을 기반으로 하거나 매크로가 포함된 문서를 닫으면 실행됩니다.AutoExit기본 서식 파일 또는 글로벌 추가 기능Word 2007을 종료하면 실행됩니다. 제거해야 할 자동 매크로를 확인하려면 Word 2007 자동 매크로의 실행을 일시적으로 중지합니다. AutoExec 매크로의 실행을 일시적으로 중지하려면 시작을 누르고 모든 프로그램을 가리킨 다음 Shift 키를 누른 상태에서 Microsoft Word 2007을 누릅니다. 이 표에 나열된 다른 매크로 중 하나를 중지하려면 해당 매크로가 실행되게 동작을 Shift 키를 누른 상태에서 실행합니다. 자동 매크로를 제거하려면 다음과 같이 하십시오.Word 2007을 시작합니다.개발 도구 탭의 코드 그룹에서 매크로를 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오.Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.매크로 대화 상자에서 이름이 "Auto"로 시작하는 매크로를 모두 제거합니다. 자동 매크로를 제거하려면 매크로를 누른 다음 삭제를 누릅니다. 참고 Word 2007 추가 기능에 의해 자동 매크로가 추가되었을 수 있습니다. 서식 파일에 자동 매크로가 포함되었는지 확인하려면매크로 위치 상자에서 각 서식 파일을 하나씩 누릅니다. 이렇게 하면 선택한 서식 파일에 포함된 매크로 목록이 표시됩니다. 서식 파일에 자동 매크로가 포함되었을 확인했으면 해당 서식 파일을 컴퓨터에서 제거하는 것이 좋습니다. 그러나 Word 2007 추가 기능에 의해 추가된 서식 파일을 제거하면 추가 기능의 기능에 영향을 줄 수 있습니다.취소를 눌러 매크로 대화 상자를 닫습니다.Microsoft Office 단추를 누른 다음 Word 끝내기를 누릅니다.Word 2007을 다시 시작한 이후에 문제가 발생하지 않으면 자동 매크로 중 하나가 문제의 원인입니다.해결 방법 3: 매크로 바이러스에 의한 감염으로부터 컴퓨터 보호컴퓨터가 매크로 바이러스에 감염된 경우에 이 문제를 해결하려면 다음 방법 중 하나 이상을 사용하십시오.방법 1: 바이러스 백신 소프트웨어 설치 및 업데이트매크로 바이러스를 장기적으로 방지하려면 매크로 바이러스 검색 기능을 제공하는 바이러스 백신 소프트웨어를 설치합니다. 참고 새 매크로 바이러스를 검색하고 제거하려면 컴퓨터에 설치된 바이러스 백신 프로그램을 업데이트하여 최신 상태로 유지해야 합니다. 바이러스 백신 소프트웨어 프로그램을 업데이트하는 방법에 대한 자세한 내용은 해당 바이러스 백신 소프트웨어 공급업체에 문의하십시오. 바이러스 백신 소프트웨어 공급업체에 문의하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.65416 A-K로 시작하는 하드웨어 및 소프트웨어 공급업체 연락처 목록 60781 L-P로 시작하는 하드웨어 및 소프트웨어 공급업체 연락처 목록 60782 Q-Z로 시작하는 하드웨어 및 소프트웨어 공급업체 연락처 목록 매크로 바이러스에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.http://office.microsoft.com/ko-kr/assistance/HA011030691033.aspx(영문) 방법 2: Word 2007에서 매크로 설정 구성Word 2007에서는 다음과 같은 매크로 설정을 사용하여 매크로 바이러스에 의해 문서, 서식 파일 또는 추가 기능이 감염될 가능성을 줄일 수 있습니다.모든 매크로 제외(알림 표시 없음)모든 매크로 제외(알림 표시) 참고 이 설정이 기본 설정입니다.디지털 서명된 매크로만 포함모든 매크로 포함(위험성 있는 코드가 실행될 수 있으므로 권장하지 않음)Word 2007에서 매크로 설정을 변경하려면 다음과 같이 하십시오.개발 도구 탭의 코드 그룹에서 매크로 보안을 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오.Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.매크로 설정을 누릅니다.매크로 설정에서 신뢰할 수 없는 위치에 있는 문서에 대해 다음 매크로 설정 중 하나를 누릅니다.모든 매크로 제외(알림 표시 없음)모든 매크로 제외(알림 표시)디지털 서명된 매크로만 포함모든 매크로 포함(위험성 있는 코드가 실행될 수 있으므로 권장하지 않음)확인을 눌러 보안 센터 대화 상자를 닫습니다.방법 3: 기본 서식 파일 잠그기기본 서식 파일을 잠그고 암호를 만들면 매크로 바이러스가 컴퓨터에 무단으로 액세스할 가능성을 줄일 수 있습니다. 기본 서식 파일을 잠그려면 다음과 같이 하십시오.개발 도구 탭의 코드 그룹에서 Visual Basic을 누릅니다. 참고 이때 개발 도구 탭이 보이지 않으면 다음과 같이 하십시오.Microsoft Office 단추를 누른 다음 Word 옵션을 누릅니다.자주 사용하는 메뉴를 누릅니다.Word에서 가장 많이 사용하는 옵션에서 리본 메뉴에 개발 도구 탭 표시 확인란을 선택합니다.확인을 눌러 Word 옵션 대화 상자를 닫습니다.Visual Basic Editor의 프로젝트 창에서 This Document를 누릅니다. 참고 이때 프로젝트 창이 보이지 않으면 보기 메뉴에서 프로젝트 탐색기를 누르십시오.도구 메뉴에서 프로젝트 속성을 누릅니다.보호 탭을 누르고 읽기 전용으로 프로젝트 잠금 확인란을 선택합니다.암호 입력란에 암호를 입력합니다. 그런 다음 암호 확인 입력란에 암호를 다시 입력합니다.확인을 눌러 프로젝트 속성 대화 상자를 닫습니다.파일 메뉴에서 닫고 Microsoft Word(으)로 돌아가기를 누릅니다.Microsoft Office 단추를 누른 다음 Word 끝내기를 누릅니다. 다음 메시지가 나타나면 예를 누릅니다.기본 서식 파일 Normal.dotm이(가) 변경되었습니다. 변경 사항을 저장하시겠습니까? 위로 가기 | 피드백 보내기 추가 정보이 문서에 나와 있는 타사 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이러한 제품의 성능이나 신뢰성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다. 
Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.위로 가기 | 피드백 보내기 속성기술 자료: 918064 - 마지막 검토: 2007년 11월 27일 화요일 - 수정: 1.3 본 문서의 정보는 다음의 제품에 적용됩니다.Microsoft Office Word 2007 키워드: kberrmsg kbmacro kbaddin kbtemplate kbvirus kbautomation kbprb kbvba kbstartprogram kbexpertisebeginner kbproductlink KB918064
이온디
이온디 12년 전
안녕하세요 잡코입니다!! 정말 오랜만에 음악 포스팅 하네요ㅎㅎ '힘들 때 위로가 되는 음악' 포스팅 응원을 많이 해주셔서 이번 포스팅이 아주 살짝 부담도 되는 것 같아요ㅋㅋ 오늘은 '지친 일상 속 여유를 느끼게 해주는 노래 Best 10-한국 노래'를 포스팅하려고해요!! 영어 버전은 이 포스팅 다음에 올릴게요~ 후보가 너무 많아서 2가지 버전으로 나눠봤어요ㅋㅋ 중부지방은 장마로, 남부지방은 무더위로...힘드시죠???ㅠㅠ 학교에, 학원에, 직장에...안그래도 힘든데 날씨도 말을 안듣죠??ㅠㅠ 더워서… 안녕하세요 잡코입니다!! 정말 오랜만에 음악 포스팅 하네요ㅎㅎ '힘들 때 위로가 되는 음악' 포스팅 응원을 많이 해주셔서 이번 포스팅이 아주 살짝 부담도 되는 것 같아요ㅋㅋ 오늘은 '지친 일상 속 여유를 느끼게 해주는 노래 Best 10-한국 노래'를 포스팅하려고해요!! 영어 버전은 이 포스팅 다음에 올릴게요~ 후보가 너무 많아서 2가지 버전으로 나눠봤어요ㅋㅋ 중부지방은 장마로, 남부지방은 무더위로...힘드시죠???ㅠㅠ 학교에, 학원에, 직장에...안그래도 힘든데 날씨도 말을 안듣죠??ㅠㅠ 더워서 밤에 잠도 안오고ㅋㅋ 그래서 오늘은 지친 하루를 마무리하고 싶을 때, 하루 중 너무 지쳐서 휴식이 필요할 때 들으면 좋은 노래들을 한 번 골라봤어요!!! :))) 1. 10cm - 새벽 4시 개인적으로 새벽에 듣기 가장 노래라고 생각하는 곡인데요. 그 이유라 하면 뭔가 아침이 올까봐 약간 불안한 듯 하면서 여유가 느껴지는(??) 느낌 때문이 아닐까 싶어요ㅋㅋ (너무 창의적인가???ㅋㅋㅋ) 흔히, 또는 쉽게 접할 수 있는 것들을 새롭게 바라보는 시각을 주는 곡인만큼 바쁘고 지칠 때 일상의 소중함을 느끼고 여유를 찾기 좋은 노래라고 생각해요ㅎㅎ "갈라진 창문 틈새에 스민 이상하리만치 따스한 그 겨울 밤 별빛을 아직 기억해 차가운 여관방 이불 속에 부끄러운 사랑의 자욱 하늘을 날았던 몸짓을 기억해 기억해 별이 쏟아진 다리 우리 야윈 손을 꼭 잡고 걸어가던 길을 걷다 마주한 가장 아름다운 순간에 바라보던 그 달, 그 밤, 그때에 나를 담은 작은 그림들이 지난 낭만의 꿈속에 어른이 된 나는 어지러워 새벽을 맞은 동네 골목에 이상하리만치 달콤한 자판기 커피 냄새를 아직 기억해 먼지에 가려진 빙판길에 어쩔 줄 모르던 고양이 그 살가운 울음소리를 기억해 기억해 별이 쏟아진 다리 우리 야윈 손을 천천히 놓아가며 길을 걷다 마주한 가장 안타까운 순간에 바라보던 그 달, 그 밤, 그때에 나를 담은 작은 그림들이 지난 낭만의 꿈속에 어른이 된 나는 어지러워 지나간 지난 얘기 지난 그림 어렴풋한 사랑의 장면 낭만의 꿈 속 애매한 느낌 아련한 연기와 나, 메마른 아침에 눈을 뜨면 안타까운 가장 아름다운 저 풍경에 더 아쉬운 귓가에 맴도는 목소리에 더 그리운 가장 아름다운 그 순간에 더 두려운 별이 쏟아진 다리 우리 야윈 손을 천천히 놓아가네 어려운 일이지만 가장 아름다운 순간에 바라보던 그 달, 그 밤, 그때에 나를 담은 작은 그림들이 지난 낭만의 꿈속에 어른이 된 나는 어지러워 어른이 된 나는 어지러워" 어쿠스틱한 사운드때문에 더 마음이 편안해 지는 것 같아요!! 가사를 한 번 천천히 읽어보시면 너무 예뻐서 마음이 몽글몽글 해 지실 거에요ㅎㅎ 잠시 지친 일상에서 벗어나 나를 느끼고 싶을 때 들어보시라고 꼭 추천 해드리고 싶네요 :) 2. 전람회 - 기억의 습작 작년에 첫사랑 열풍을 몰고 온 영화 '건축학 개론' 덕에 재조명을 받은 곡이죠. 제가 너무 좋아하는 '김동률'님의 감미로운 목소리!!ㅎㅎ 언제들어도 전율이 느껴지는 노래에요ㅠㅠ 약간 나른하게 만들어지는 분위기와 목소리, 하지만 조용한 웅장함!! 언제 들어도 마음이 편안해지고 몸을 릴렉스 시켜주는 이유들이 아닐까 싶어요ㅎㅎ "이젠 버틸순 없다고 휑한 웃음으로 내 어깨에 기대어 눈을 감았지만 이젠 말할 수 있는 걸 너의 슬픈 눈빛이 나의 마음을 아프게 하는 걸 나에게 말해봐 너의 마음 속으로 들어가 볼 수만 있다면 철없던 나의 모습이 얼만큼 의미가 될 수 있는지 많은 날이 지나고 나의 마음 지쳐갈 때 내 마음속으로 쓰러져가는 너의 기억이 다시 찾아와 생각이 나겠지 너무 커버린 미래의 그 꿈들 속으로 잊혀져 가는 너의 기억이 다시 생각날까 너의 마음 속으로 들어가 볼 수만 있다면 철없던 나의 모습이 얼만큼 의미가 될 수 있는지 많은 날이 지나고 나의 마음 지쳐갈 때 내 마음속으로 쓰러져가는 너의 기억이 다시 찾아와 생각이 나겠지 너무 커버린 내 미래의그 꿈들 속으로 잊혀져 가는 나의 기억이 다시 생각날까 많은 날이 지나고" 가사는 조금 슬프지만 왠지 아련한게 여유로움을 주기엔 안성맞춤인 곡이에요. 워낙 유명해서 좋아하시는 분들은 자주 들으시겠지만 바쁘고 지칠 때 눈을 감고 천천히 멜로디와 가사를 다시 들어보시는 건 어떨까요?? :) 3. 뜨거운 감자 - 고백 세번째는 조금 귀여운 선곡입니당ㅎㅎ 듣기만 해도 입가에 미소가 지어지는 너무 달콤한 곡이죠!! 귀엽고 진실된 가사와 상쾌한 멜로디는 여유를 느끼게 해주기엔 정말 딱 인것 같아요ㅋㅋ 공원에서, 데이트할 때 등등 언제들어도 좋은 곡이긴 하지만 짜증나고 피곤할 때 들으면 좋은 에너지가 더 잘 전달되겠죠?ㅎㅎ "달이차고 내 마음도 차고 이대로 담아두기엔 너무 안타까워 너를 향해 가는데 달은 나에게 오라 손짓하고 귓속에 얘길하네 지금 이 순간이 바로 그 순간이야 제일 맘에드는 옷을입고 노란꽃 한송이를 손에들고 널 바라보다 그만 나도 모르게 웃어버렸네 이게 아닌데 내맘은 이게 아닌데 널 위해 준비한 오백가지 멋진말이 남았는데 사랑한다는 그 흔한말이아니야 그보다 더욱더 로맨틱하고 달콤한 말을 준비했단말야 숨이차고 밤공기도 차고 두눈을 감아야만 니 모습이 보여 걸을수가 없는데 구름위를 걷는다는말이 과장이 아니란걸 알게됐어 널 알게 된 후부터 나의 모든건 다 달라졌어 이게 아닌데 내맘은 이게 아닌데 널 위해 준비한 오백가지 멋진말이 남았는데 사랑한다는 그 흔한 말이아니야 그보다 더욱더 로맨틱하고 달콤한 말을 준비했단말야 나를 봐줘요 내 말을 들어 봐줘요 아무리 생각을 하고 또 해도 믿어지지 않을만큼 사랑해" 처음 이 앨범 나왔을 때 너무 좋아서 무한반복했던 기억이 나네요ㅋ 약간 직설적인 것 같으면서도 수줍음이 느껴지는 가사인 좋은 곡들이 많아요!! 마음에 여유를 찾고 싶을 때, 뜨거운 감자의 노래를 추천합니다!!ㅎㅎ 4. 어반자카파 - Breeze '어반자카파' 노래들도 정말 다 너무 좋죠ㅠㅠ 처음 어반자카파를 알았을 때부터 지금까지 꾸준히 듣고있는데 들으면 들을수록 더 빠져든다는...ㅎㅎ 이 곡은 제목처럼 BREEZE가 느껴지는 것 같은 느낌을 주는 노래인데요. 멜로디때문이 아닌가 싶어요ㅋㅋ 가사는 멜로디에 느껴지는 것보단 약간 씁쓸하네요ㅋㅋ "찬 바람이 불어와 날 감싸고 또 떠나 그대처럼 딴 사랑이 또 와도 그때 우리 같진 않겠지 Another day Better day 내게 다가오죠 A better day 그리운 마음만 둘게요 * 바람 또 햇살 우리 온기 그때 그곳에 다 두고서 그 바람을 타고서 저 멀리로 우리만 떠나기로 해요 날 사랑한단 말도 더는 들을 수가 없지만 Another day Better day 우릴 기다리죠 A better day 더 많이 웃길 바랄게요 Another day Better day 내게 다가오죠 Another day Better day 우릴 기다리죠 Another day Better day Better day" 기쁨과 슬픔 중간에 위치한 것 같은 분위기의 노래인 것 같아요ㅋ 시원섭섭한 기분이랄까????ㅋㅋ 하지만 이어폰을 꽂고 잠시 여유를 즐기기엔 충분히 좋은 노래에요!!ㅎㅎ 5. 소향 - 햇살이 입맞춤 하던 날 '소향'씨 CCM 세계에서 유명하다고는 알고 있었지만 실제로 노래를 들어 본 건 '나가수'때가 처음이었는데요ㅋ 처음 듣고 엄청난 음역대에 깜짝 놀랐다는ㅋㅋㅋ 사실 나가수 볼 때만 해도 노래는 정말 짱인데 감상하기엔 조금 부담스러울 것 같다는 생각을 했어요. 그런데 앨범을 들어보니 생각보다 듣기도 편하고 너무 좋더라구요ㅎㅎ 앨범의 타이틀곡이기도 한 이 노래는 제가 소향시 곡들 중에서 가장 좋아하는데요. 제목부터 너무 예쁘지 않나요??ㅋㅋ "햇살이 입맞춤 하던 날 난 그댈 처음 만났어요 세상이 반짝거리던 그날 잊을 수 없었죠 지금도 아른 거리는 그대의 미소에 문득 솟아오르던 벅찬 마음이 여전하다는 게 아직도 아직도 떨리고 아직도 설레고 아직도 요란스러워 지죠 햇살이 입맞추고 빛이 환하게 비춰져 내 맘이 환해지던 날 그리움이 무언지 가슴이 말하던 날 햇살이 입맞춤 하던 날 사랑이란 걸 알게해준 널 처음 만난 그 공간들 니 몸짓에 당황스러운 감정들에 흔들리게 만들던 시간들 아른 거리는 그대 속삭임들 문득 내게 들리던 두근거림이 여전하다는 게 아직도 아직도 떨리고 아직도 설레고 아직도 요란스러워 지죠 햇살이 입맞추고 빛이 환하게 비춰져 내 맘이 환해지던 날 그리움이 무언지 가슴이 말하던 날 햇살이 입맞춤 하던 날 이젠 아무 말도 하지말아요 서로 이렇게 바라만 봐도 (보고 있어도) 알고 있는 걸 내가 사랑하고 그대가 사랑하고 아직 우리 우리눈빛에 맘에 간직하고 있는 걸 아직도 떨리고 아직도 설레고 아직도 요란스러워 지죠 햇살이 입맞추고 빛이 환하게 비춰져 내 맘이 환해지던 날 그리움이 무언지 가슴이 말하던 날 햇살이 입맞춤 하던 날" 가사가 예쁘기도 하고 왠지 들으면 평화롭다고 해야하나?? 좀 편해지는 기분이 들어서 듣기 너무 좋은 곡 같아요!! 조금 일차원적인 아이디어긴 하지만 정말 햇살 아래에서 쉴 때 들으면 좋을 것 같네요 :)) 6. 버스커 버스커 - 여수 밤바다 언제 들어도 좋은 버스커 버스커!!!! 사실 버스커 버스커 앨범에 있는 모든 곡이 여유가 필요할 때 들으면 좋은 곡이긴 하지만 저는 그 중에서도 가장 마음이 편안해지고 아름다운 생각을 할 수 있는 '여수밤바다'를 골랐어요ㅎㅎ 서정적인 분위기가 언제 어디서 듣더라도 안정감과 편안함을 주는 것 같아요!! "여수 밤바다 이 조명에 담긴 아름다운 얘기가 있어 네게 들려주고파 전활 걸어 뭐하고 있냐고 나는 지금 여수 밤바다 여수 밤바다 아 아 아 아 아 아 아 너와 함께 걷고 싶다 이 바다를 너와 함께 걷고 싶어 이 거리를 너와 함께 걷고 싶다 이 바다를 너와 함께 걷고 싶어 여수 밤바다 여수 밤바다 이 바람에 걸린 알 수 없는 향기가 있어 네게 전해주고파 전활 걸어 뭐하고 있냐고 나는 지금 여수 밤바다 여수 밤바다 아 아 아 아 아 아 아 아 너와 함께 걷고 싶다 이 바다를 너와 함께 걷고 싶어 이 거리를 너와 함께 걷고 싶다 이 바다를 너와 함께 너와 함께 오 바다 이 조명에 담긴 아름다운 얘기가 있어 네게 들려주고파 전활 걸어 뭐하고 있냐고 나는 지금 여수 밤바다 여수 밤바다 아 바다 아아아 하아아아 하아오오 하 아아아 허오 아아아아 뭐하고 있냐고 나는 지금 여수 밤바다" 순식간에 사람을 감상에 젖게 만드는 노래!!!!ㅎㅎ '벚꽃엔딩'이 봄의 캐롤이 된 것 처럼 이 노래는 곧 국민힐링곡이 되지 않을까 싶네요ㅋㅋ 버스커 버스커 새 앨범 나왔으면 좋겠어요!!!ㅠㅠ 7. 김윤아 - 봄날은 간다 영화 '봄날은 간다'의 OST로 유명한 곡이죠??ㅋㅋ 김윤아씨 1집 앨범에 보너스 트랙으로 수록되었던 곡입니다. 개인적으로 김윤아씨같은 보이스 너무 좋아하는데요ㅎㅎ 그래서 그런지 차분하고 몽환적이게 느껴지는 멜로디와 김윤아씨 보컬이 릴렉스되는 기분을 느끼게 해주네요!! "눈을 감으면 문득 그리운 날의 기억 아직까지도 마음이 저려 오는 건 그건 아마 사람도 피고 지는 꽃처럼 아름다워서 슬프기 때문일 거야 아마도 봄날은 가네 무심히도 꽃잎은 지네 바람에 머물 수 없던 아름다운 사람들 가만히 눈감으면 잡힐 것 같은 아련히 마음 아픈 추억 같은 것들 봄은 또 오고 꽃은 피고 또 지고 피고 아름다워서 너무나 슬픈 이야기 봄날은 가네 무심히도 꽃잎은 지네 바람에 머물 수 없던 아름다운 사람들 가만히 눈감으면 잡힐 것 같은 아련히 마음 아픈 추억 같은 것들 눈을 감으면 문득 그리운 날의 기억 아직까지도 마음이 저려 오는 건 그건 아마 사람도 피고 지는 꽃처럼 아름다워서 슬프기 때문일 거야, 아마도" 노래들으면서 가사를 한 번 천천히 읊어보세요ㅋㅋ 시적인 가사가 뭔가 마음에 울림을 주지 않을까요??ㅎㅎ 제가 오늘 포스팅하는 10곡 중에서 이 곡이 가장 주제와 잘 어울리는 것 같아요!! (제 생각엔ㅎㅎ) 그러니 정말 지칠 때 이 음악 꼭 들어보시길 바래요 :)) 8. 베란다 프로젝트 - Bike Riding '김동률'님과 '이상순'님의 프로젝트 그룹인 '베란다 프로젝트'!! 2010년에 나온 앨범의 타이틀 곡인 'Bike Riding'은 미소가 절로 지어지는 행복한 곡이에요!! 앞에 따르릉~하는 자전거 소리가 너무 예쁘고 왠지 자연이 느껴지는 평화로운 곡이기도 하구요ㅎㅎ 그래서!!!! 이 노래 지칠 때 들으면 너~무 좋아요ㅎㅎ "아침 일곱시 오분 오늘도 자전거를 끌고 너를 만나러 간다 힘차게 패달을 밟고 으샤 언덕길 조금 더 힘을내 두 손 벌려 바람을 맞을까 오늘따라 날씨도 좋아 지나가는 아주머니 조심하세요 제가 조금 급하답니다. 늦었어요. 저기 다릴 건너서 공원을 가로지르며 저 멀리 반가운 노란 너의 자전거 웬 일인지 나는 네가 좋아 잠이 덜깬 모습도 좋아 앞서가는 뒷모습이 사랑스러워 때릉때릉 나의 마음을 전해보네 매일 지나도 늘 새로운 풍경들 싱그러운 봄바람이 좋아 구름위를 나는것 같아 나란히 네 손을 잡고 달리고 싶어 때릉때릉 나의 마음을 전해보네 웬 일인지 나는 네가 좋아 물마시는 모습도 좋아 처음 내게 길을 묻던 그 순간부터 매일매일 함께 달리는 아침산책" 남자친구가 이 노래 불러주면 정말 행복할 듯 해요ㅎㅎ 참고로 이 앨범은 정말 힐링앨범으로 추천해 드리고 싶은데, 한 곡 한 곡이 다 너~무 좋아요!!! 기회가 되면 제 다음 음악포스팅에 다시 소개할게요!! 9. 제이래빗 - 잠이 솔솔 '제이래빗' 노래 가사들도 다 너무 좋죠??ㅠㅠ 귀여운 목소리와(정말 훔치고 싶은...ㅋㅋ) 예쁜 가사때문에 제가 제이래빗을 알게 된 후로 계속 꾸준히 듣고있어요ㅎㅎ 이 곡은 제목처럼 사람을 약간 나른하게 하는 매력을 가진 노래인데요ㅋㅋ 정말 지친 일상 속에서 여유를 느끼고 싶을 때 딱인 노래같아요!! "날씨는 좋고 점심도 먹었고 할 일은 많은데 잠은 솔솔 쏟아지고 꿈속의 난 음악을 들으며 홀로 여행을 떠나려하네 나는 새로 산 가방을 매고 푸르른 가을하늘 아래 자전거를 타고 바람을 느끼고 싶어 좋아 시원해 좋아 나 홀로 떠나는 여행 햇살도 좋고 시간은 멈추고 기분 좋은 오후에 사람들은 미소짓고 꿈속의 난 노래를 부르며 함께 여행을 떠나려 하네 나는 새로 산 가방을 매고 푸르른 가을하늘 아래 자전거를 타고 바람을 느끼고 싶어 좋아 시원해 좋아 우리가 떠나는 여행" 듣기만 해도 휴가를 떠난 것 같은 기분??ㅎㅎ 3분도 안되는 짧은 곡이긴 하지만 그 짧은 순간에 시원한 편안함을 느끼실 수 있을거에요 :) 10. 박정현 - Vincent 사실 리메이크된 곡이 원곡보다 좋기 쉽지 않은데 이 곡은 박정현씨 버전이 조금 더 좋은 것 같아요ㅋ (제 개인적인 생각입니당~ㅎㅎ 오리지널이랑 분위기가 조금 달라요!!) 원곡은 Don Mclean이 불렀는데요. 화가 '빈센트 반 고흐'를 추모하기 위해 만들어진 노래인데요. 살아있을 때 인정받지 못한 그의 예술세계와 천재성을 기리기 위한 곡입니다. 사실 이 곡이 만들어진 이유만 놓고 보자면 원곡의 분위기가 그 이유와 더 잘 맞지만 제 포스팅 주제와는 박정현씨 버전이 훨씬 더 잘 어울리는 것 같아요ㅎㅎ 하지만 원래 노래가 워낙 좋아서 취향에 따라 골라들으시면 좋을 것 같네요!!ㅎㅎ "Starry, starry night Paint your palette blue and gray 별이 찬란한 밤, 파란색과 회색을 파레트에 그려요 Look out on a summer's day 여름날 밖을 내다 보세요 With eyes that know the darkness in my soul 내 영혼의 어둠을 이해하는 눈으로 Shadows on the hills. Sketch the trees and the daffodils 언덕 위의 그림자들. 나무와 수선화를 스케치해요 Catch the breeze and the winter chills 눈처럼 새하얀 천 바닥에 In colors on the snowy linen land 미풍과 겨울의 한기를 색체로 표현하세요 Now I understand 이제는 알 수 있어요 What you tried to say to me, 당신이 내게 하려 했건 말이 무엇이었는지를 And how you suffered for your sanity 온전한 영혼을 유지하기 위해 얼마나 고통받았는지를 And how you tried to set them free 그들을 자유롭게 하기 위해 얼마나 애를 썼는지를 They would not listen, they did not know how 아무도 들으려 하지 않았어요. 방법도 몰랐고요 Perhaps they listen now. 지금에서는 들으려 할지는 모르겠지만 Starry, starry night 별이 촘촘한 밤이에요 Flaming flowers that brightly blaze 불꽃처럼 밝게 타오르는 꽃들 Swirling clouds in violet haze 보랏빛 안개 속에 소용돌이 치는 구름들 Reflect in Vincent's eyes of china blue 빈센트의 청잣빛 푸른 눈에 어리네요 Colors changing hue 색조를 바꾸는 물감 Morning fields of amber grain, 황갈색 곡식의 아침 들판 Weathered faces lined in pain 고통으로 지친 얼굴들은 Are soothed beneath the artist's loving hand 화가의 사랑스런 손길로 위로 받죠 For they could not love you 허나 당신을 사랑할 수 없었죠 But still, your love was true 하지만 당신의 사랑은 진실했어요 And when no hope was left inside 내면에 아무런 희망도 남지 않은 On that starry, starry night 별빛이 촘촘했던 그날 밤 You took your life as lovers often do 연인들이 늘 그러듯이 당신은 삶을 버렸죠 But I could've told you, Vincent 하지만 난 당신에게 말할 수 있었어요 This world was never 이 세상은 당신처럼 meant For one as beautiful as you 아름다운 사람에게는 어울리지 않는다고 Starry, starry night 별빛이 찬란한 밤이에요 Portraits hung in empty halls 빈 방에 걸린 초상화들 Frameless heads on nameless walls 이름 모를 벽에 걸린 액자 없는 얼굴들 With eyes that watch the world and can't forget 그 두 눈, 세상을 바라보며 잊지 못하네요 Like the strangers that you've met The ragged men in ragged clothes 당신이 만났던 누더기 차람의 남루한 사람들처럼요 The silver thorn, a bloody rose 새빨간 장미의 은빛 가시 Lie crushed and broken on the virgin snow 순결한 눈 위에서 거짓은 부서져 버리죠 Now I think I know 이제는 알 것 같아요 What you tried to say to me 내게 하려 했던 말들을 And how you suffered for your sanity 온전한 영혼을 위한 고통과 And how you tried to set them free 그들을 자유롭게 하기 위해 들인 노력을 They would not listen, they're not listening still 아무도 들으려 하지 않았죠, 아직도 들으려 하지 않아요 Perhaps they never will 앞으로도 들으려 하지 않을 거에요" 평화로운 멜로디가 너무 여유롭고 가사도 너무 순수하고 아름다운 것 같아요ㅎㅎ 박정현씨 특유의 음색과 원곡이 가지고 있는 아름다움이 만나 여유로움을 느끼기에 딱인 곡으로 탄생한 듯 합니다! 저번 포스팅에 해석 부탁하신 분이 계셨는데 제가 직접하기엔 시간이 없어서 친절한 네이버에서 데려왔습니다ㅋㅋ 오랜만에 한 음악포스팅 끝~ 뿌듯하네요ㅎㅎ 마지막곡은 한국노래는 아니지만 한국 가수니까 봐주세요~ㅎㅎㅎ 외국노래는 최대한 빨리 이어서 올리도록 노력하겠습니다!!! 제 음악 포스팅 좋아해주시는 모든 분들 너무 감사드리구요 :) 오늘은 여기서 안녕~ㅎㅎ 아...그리고 혹시 요즘 싸이블로그 조금 이상해졌다고 느끼시는 분 없으신가요??? 포스팅한게 막 날라가고 그래서ㅠㅠ 혹시 있으시면 알려주세요!!!
이온디
이온디 13년 전
다음 뷰 애드온 정도 있으면 게시물 내 추천/비추천 버튼보다 더 효과적인 광고가 될 듯 하다는 생각이 들었는데 좋은걸요. 믹스 추천보다 다음 추천을 많이 쓰시려나요 뭘 더 많이 쓰는지 모르겠군요. - 수정 - 아쉽게도 view 서비스가 2014년 6월 30일 종료되었습니다. http://v.daum.net/ 다음 뷰 애드온 정도 있으면 게시물 내 추천/비추천 버튼보다 더 효과적인 광고가 될 듯 하다는 생각이 들었는데 좋은걸요. 믹스 추천보다 다음 추천을 많이 쓰시려나요 뭘 더 많이 쓰는지 모르겠군요. - 수정 - 아쉽게도 view 서비스가 2014년 6월 30일 종료되었습니다. http://v.daum.net/
이온디
이온디 17년 전
dfd [code] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=euc-kr"> <style type="text/css"> img {border:none;} form {margin:0; padding:0;} a{color:#474747; text-decoration:none;} a:ho… dfd [code] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=euc-kr"> <style type="text/css"> img {border:none;} form {margin:0; padding:0;} a{color:#474747; text-decoration:none;} a:hover{text-decoration:underline;} #login{position:relative; width:187px; height:100px; letter-spacing:-1px; background:url(http://wstatic.naver.com/w7/green/bg_login01.gif) #F9F8E5 no-repeat; color:#4F4F30; font-size:11px; font-family:돋움, Dotum, AppleGothic, sans-serif; margin:0;} #common_set{font-size:11px; letter-spacing:-1px;} #login h3{display:none;} #login span{position:absolute;} #login label{font-size:11px;} #login .green_set{position:absolute; top:9px; left:16px; letter-spacing:-1px;} #login .green_btn{width:38px; height:16px; background:url(http://static.naver.com/green/bg_slide.gif) left bottom no-repeat;} #login .green_set .move{left:15px; margin-top:2px; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.naver.com/green/btn_slide.png',sizingMethod='scale'); cursor:pointer;} html>body #login .green_set .move{background:url(http://static.naver.com/green/btn_slide.png) transparent;} #login .green_step{font-size:11px; top:4px; left:43px; width:60px; color:#444444;} html>body #login .green_step{top:3px; left:42px; width:64px; letter-spacing:-2px; } /*0730*/ #login .green_step em{font-style:normal; letter-spacing:1px;} #login .ip{background:url(http://static.naver.com/green/bg_bar03.gif) 0 2px no-repeat; padding:1px 0 0 8px; position:absolute; top:3px; left:97px; width:70px;} #login .check_icon{vertical-align:top; margin:-1px 0 0 0; cursor:pointer; cursor:hand;} #login .id{top:29px; left:15px;} #login .id input, #login .pw input{width:99px; height:18px; color:#444444; font-size:12px; border:1px solid #CBDBA8; font-family:돋움, Dotum, AppleGothic, sans-serif; padding:2px 0 0 2px;} #login .pw{top:50px; left:15px;} #login .mem{top:33px; left:118px;} html>body #login .mem{top:32px; left:121px;} #login .mem img{float:left; display:inline; vertical-align:top; margin-left:-1px;} #login .mem label {float:left; display:inline; margin:2px 0 0 1px;} html>body #login .mem label {margin:1px 0 0 4px; width:35px; } #login .green{top:43px;left:82px}#login .green label{display:none;} #login .login_submit{top:50px; left:118px;} html>body #login .login_submit{top:49px; left:118px;} #login .login_submit input{width:54px; height:20px;} #login .find_id{top:80px; left:72px;} #login .join{top:80px; left:15px; letter-spacing:-2px; } #login .inform{top:77px; left:3px;} #login .join_line {top:80px; left:63px; color:#E0EBC7; font-size:9px;} html>body #login .join_line {top:81px; } #login .join a{font-weight:bold; letter-spacing:-1px; color:#ED6C1F; text-decoration:none;} #login .join a:hover{font-weight:bold; letter-spacing:-1px; color:#ED6C1F; text-decoration:underline;} #login .find_id a:link, #login .green a:link, #login .mem a:link, #login .find_id a:visited, #login .green a:visited, #login .mem a:visited{text-decoration:none;color:#474747;} #login .find_id a:hover, #login .green a:hover, #login .mem a:hover{text-decoration:underline;} #login .level02{top:29px; left:9px;} #login_flashbox{position:absolute; top:30px; left:15px;} html>body #login_flashbox{position:absolute;top:29px; left:15px;} #login_activex{position:absolute;top:30px; left:15px;} html>body #login_activex{position:absolute;top:29px; left:15px;} .common_set_line {position:absolute; top:73px; left:15px; width:157px; height:1px; border-top:1px solid #E0EBC7; } .caps_top{filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.naver.com/green/caps_top.png',sizingMethod='scale');} html>body .caps_top{background:url('http://static.naver.com/green/caps_top.png') transparent;} </style> <!--[if IE 5]><style type="text/css">.move{width:12px; height:13px; background:url(http://static.naver.com/green/btn_slide.gif) no-repeat;}</style><![endif]--> <style type="text/css"> #login .caps{top:80px; left:6px; letter-spacing:-1px; background-color:#F9F8E5;} #login .caps strong{color:#ED6C1F; letter-spacing:-2px;} </style> <!-- 수정 20080513 --> <script type="text/javascript" src="http://static.naver.com/green/js/enc_www_20080603.js"></script> <script type="text/javascript"> /** * @copyright NHN corp. <http://www.nhncorp.com> * @author UserManagermentSystem Team * @version 1.0.0 */ document.domain = "naver.com"; AC_FL_RunContent = 0; var slider; var IdObj; var PwObj; var activex_url = "/enclogin/transfer.html"; var getkeyurl='http://static.nid.naver.com/enclogin/keys.nhn'; var blankurl='/enclogin/blank.html'; var keys = null; var keystr = null; var keyname = ''; var evalue =''; var nvalue =''; var initEnc = 2; var is_sid=getCookie("nid_sid")? true:false; var is_ipcheck = getCookie("nid_slevel")?getCookie("nid_slevel"):1; var savedEnc; var flashenable = 1; </script> <!-- 수정 20080513 --> <script type="text/javascript" src="http://static.naver.com/green/js/encrypt_20071019.js"></script> </head> <body onload="checkFlashLoad();"> <div id="msg" style="position:absolute;top:0px;left:0px;height:94px;width:190px;z-index:10;display:none;font-size:11px;font-color:#333"> <script type="text/javascript" src="http://static.naver.com/green/js/enc_www_error2_2.js"></script> </div> <div id="login"> <form name="frmNIDLogin" id="loginform" target="_top" method="post" AUTOCOMPLETE="off" action="https://nid.naver.com/nidlogin.login" onsubmit="return confirm_submit();"> <input type="hidden" name="url" id="url" value="http://www.naver.com"> <input type="hidden" name="svctype" id="svctype" value="1"> <input type="hidden" name="viewtype" id="viewtype" value=""> <input type="hidden" name="postDataKey" id="postDataKey" value=""> <input type="hidden" name="saveID" id="saveID" value="0"> <input type="hidden" name="encpw" id="encpw" value=""> <input type="hidden" name="encnm" id="encnm" value=""> <script type="text/javascript"> document.write("<input type='hidden' id='smart_level' name='smart_level' value='"+is_ipcheck+"'>"); </script> <h3>로그인 관련 영역</h3> <div class="green_set" onSelectStart="javascript:return false;" onDrag="javascript:return false;"> <div id="slider" class="green_btn"><span id="unit" class="move"><a href="javascript:;"><img src="http://static.naver.com/green/blank.gif" alt="보안단계 조절바" width="12" height="13"></a></span></div> <span class="green_step" id="green_step"> <a href="http://static.nid.naver.com/enclogin/enc_help.html" target="_blank" onClick="javascript:OpenWin('http://static.nid.naver.com/enclogin/enc_help.html', '520', '750');return false;" title="보안단계에 대한 자세한 도움말을 보실 수 있습니다.">보안<em>2</em>단계</a> </span> <span style="display:none;"><input type=hidden name="enctp" id="enctp" value="2"></span> <span class='ip'><a href="http://static.nid.naver.com/enclogin/enc_help2.html" target="_blank" onClick="javascript:OpenWin('http://static.nid.naver.com/enclogin/enc_help2.html', '520', '750');return false;" title="IP보안에 대한 자세한 도움말을 보실 수 있습니다.">IP보안</a> <script type="text/javascript"> if (is_ipcheck != -1) { document.write("<img id='ipcheckimg' onClick='javascript:ipCheckswap();' src='http://static.naver.com/green/ico_ip_on.gif' alt='ip보안이 켜져 있습니다.' width='18' height='12' class='check_icon'>"); } else { document.write("<img id='ipcheckimg' onClick='javascript:ipCheckswap();' src='http://static.naver.com/green/ico_ip_off.gif' alt='ip보안이 꺼져 있습니다.' width='18' height='12' class='check_icon'>"); } </script> </span> </div> <div id="login_box" style="display:none;"> <span class="id"><input type="text" name="id" id="id" maxlength="12" size="12" tabindex="4" accesskey="l" style="background:url(http://wstatic.naver.com/w7/green/loginbox_id.gif) no-repeat 3px 3px #FFFFFF"></span> <span class="pw"><input id="pw" type="password" name="pw" tabindex="5" value="" maxlength="16" style="background:url(http://wstatic.naver.com/w7/green/loginbox_pw.gif) no-repeat 3px 3px #FFFFFF"></span> <span class="mem"><input type="Checkbox" name="sID" id="sID" style="display:none;"><img src="http://static.naver.com/green/uncheck.gif" alt="ID 저장" tabindex="7" onClick="javascript:SidCheckedSwap();" onMouseOver="javascript:SidCheckedMouseOn();" onMouseOut="javascript:SidCheckedMouseOff();" width="13" height="13" id="sidImg" > <label>ID 저장</label></span> <span class="login_submit"><input type="image" id="submit_img" src="http://wstatic.naver.com/w7/green/btn_login.gif" tabindex="6" ></span> </div> </form> <!--080513 12:19 수정 onFocus="javascript:isFocusIn();" onblur = 'javascript:isFocusOut();'--> <div id="login_flashbox"> <SCRIPT LANGUAGE=VBScript> on error resume next Sub FUILogin_FSCommand(ByVal command, ByVal args) call FUILogin_DoFSCommand(command, args) end sub </SCRIPT> <A HREF=FSCommand:click></A> <script type="text/javascript"> if (AC_FL_RunContent == 0) { flashenable = -1; } else { try { if (navigator.userAgent.indexOf("Firefox")!=-1) { AC_FL_RunContent( 'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0', 'width', '157', 'height', '40', 'src', 'rsa', 'quality', 'high', 'pluginspage', 'http://www.macromedia.com/go/getflashplayer', 'align', 'middle', 'play', 'true', 'loop', 'true', 'scale', 'showall', 'wmode', 'transparent', 'devicefont', 'false', 'id', 'FUILogin', 'bgcolor', '#ffffff', 'name', 'FUILogin', 'menu', 'true', 'accesskey', 'l', //'onfocus', 'javascript:isFocusIn();', //'onblur', 'javascript:isFocusOut();', 'tabindex', '7', 'allowScriptAccess','always', 'movie', 'http://static.nid.naver.com/enclogin/FUILogin_080527.swf?kurl=http://static.nid.naver.com/enclogin/keys.nhn&savedID='+(getCookie("nid_sid")!=null?getCookie("nid_sid"):""), 'salign', '' ); } else { AC_FL_RunContent( 'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0', 'width', '157', 'height', '40', 'src', 'rsa', 'quality', 'high', 'pluginspage', 'http://www.macromedia.com/go/getflashplayer', 'align', 'middle', 'play', 'true', 'loop', 'true', 'scale', 'showall', 'wmode', 'window', 'devicefont', 'false', 'id', 'FUILogin', 'bgcolor', '#ffffff', 'name', 'FUILogin', 'menu', 'true', 'accesskey', 'l', //'onfocus', 'javascript:isFocusIn();', //'onblur', 'javascript:isFocusOut();', 'tabindex', '7', 'allowScriptAccess','always', 'movie', 'http://static.nid.naver.com/enclogin/FUILogin_080527.swf?kurl=http://static.nid.naver.com/enclogin/keys.nhn&savedID='+(getCookie("nid_sid")!=null?getCookie("nid_sid"):""), 'salign', '' ); } } catch (e) { flashenable = -1; } } function flashcapslock(){ capslockshow(); } </script> </div> <div id="login_activex" style="display:none;"><iframe id="loginframe" src="/enclogin/blank.html" width="157" height="40" frameborder=0 scrolling=no marginheight=0 marginwidth=0 tabindex="8"></iframe></div> <div class="caps_top" id="capslockNotice" style="position:absolute; left:15px; top:72px;display:none;"><img src="http://static.naver.com/green/blank.gif" alt="CapsLock이 켜져 있습니다." width="158" height="26"></div> <div class="common_set" id="common_set"> <span class="join"><a target=_top href="http://rd.naver.com/i:1000008614/c:28293?https://nid.naver.com/nidregister.form?url=http://www.naver.com">회원가입</a></span> <span class="join_line">|</span> <span class="find_id"> <a target=_top href="http://rd.naver.com/i:1000008615/c:5925?https://nid.naver.com/nidreminderid.form" alt="아이디 찾기">아이디</a> / <a target=_top href="http://rd.naver.com/i:1000008616/c:53147?https://nid.naver.com/nidreminder.form" alt="비밀번호 찾기">비밀번호 찾기</a> </span> </div> <div class="common_set_line"></div> <div class="informaccess" id="informaccess" style="display:none;"> <span class="inform"><img src="http://static.naver.com/green/gif_ing.gif"></span> </div> </div> <script type="text/javascript"> if (is_sid) { document.getElementById('sID').checked = true; document.getElementById('sidImg').src = "http://static.naver.com/green/check.gif"; document.getElementById('id').style.backgroundImage=''; document.getElementById('id').value = getCookie('nid_sid'); } slider = new Ku.Slider('slider', { unit : 'unit', minValue : 1, maxValue : 3, maxPos : 28, initPos : {x:-2, y:0}, onChanging : checkSlide, onChange : checkClick }); if (initEnc==1) { slider._unit_element.style.left = '-2px'; } else if (initEnc==3) { slider._unit_element.style.left = '28px'; } else { slider._unit_element.style.left = '13px'; } try { if (navigator.appVersion.toLowerCase().indexOf("win") != -1) { $('id').style.imeMode = "disabled"; } } catch (e) { } IdObj = new Nu.IdObj('id'); PwObj = new Nu.PwObj('pw'); if (flashenable == -1 ) { viewInformDiv(3); } try { if (getCookie('nid_enctp') && getCookie('nid_enctp') != 2) { checkChange(getCookie('nid_enctp')); } }catch (e) {} </script> </body> </html> [/code]
이온디 16년 전
수강번호 구분 학점 학과명 담당교수 강의시간 강의실 0026 교양 3 국어표기법과표준화법 범금희 월10:30-11:45 수09:00-10:15 011-205 011-205 0052 교양 3 다문화사회의이해 이정화 월13:30-14:45 목12:00-13:15 005-206 005-206 0091 교양 3 문학과영화 백승숙 월15:00-16:15 목10:30-11:45 004-302 004-302 0599 전공 3 현대시인론 김문주 화10:30-11:45 목09:00-10:15 월19:4… 수강번호 구분 학점 학과명 담당교수 강의시간 강의실 0026 교양 3 국어표기법과표준화법 범금희 월10:30-11:45 수09:00-10:15 011-205 011-205 0052 교양 3 다문화사회의이해 이정화 월13:30-14:45 목12:00-13:15 005-206 005-206 0091 교양 3 문학과영화 백승숙 월15:00-16:15 목10:30-11:45 004-302 004-302 0599 전공 3 현대시인론 김문주 화10:30-11:45 목09:00-10:15 월19:40-22:10 0477 일반선택 3 성경으로배우는증권투자 0520 일반선택 2 증권투자의첫걸음     17
이온디 19년 전
out_download.php?disk=38&id=44f59d2a26d16 위서현 2005.08.28 09:58 한 사람을 통해 완전한 수용감을 느끼게 되고. 한 사람을 통해서 느낄 수 있는 아늑함을 알게 되었습니다. 그 한 사람은 누구에게도 열지 않던 고집스런 내 마음을 처음으로 열어주었습니다. 한 사람으로 인해 <함께 한다>는 것이 주는 단순한 행복을 처음으로 알게 됐고. 변하지 않음이 주는, 깊은 신뢰를 느끼게 됐고, 그 한사람이 나에게 보여준 확신으로 인해 나 스스로… out_download.php?disk=38&id=44f59d2a26d16 위서현 2005.08.28 09:58 한 사람을 통해 완전한 수용감을 느끼게 되고. 한 사람을 통해서 느낄 수 있는 아늑함을 알게 되었습니다. 그 한 사람은 누구에게도 열지 않던 고집스런 내 마음을 처음으로 열어주었습니다. 한 사람으로 인해 <함께 한다>는 것이 주는 단순한 행복을 처음으로 알게 됐고. 변하지 않음이 주는, 깊은 신뢰를 느끼게 됐고, 그 한사람이 나에게 보여준 확신으로 인해 나 스스로에게도 자신감을 가질 수 있었습니다. 그 사람은 연애가 어렵기만 하던 나에게 사랑받는 평범한 기쁨을 누릴 수 있게 해주었습니다. 평범함이 주는 기쁨이 무엇인지 그 때서야 알았지요. 나에게 연애는 어색하거나, 불편하거나, 그것도 아니면 귀찮거나. 싫증나는 것이었으니까요. 깨질 것같이 위태로운 자존심으로 내 방식만 바라보며 가고 있던 나를, 누군가에게 부끄럽지 않기 위해 노력하고 싶은 사람으로 만들고. 꺼렸던 것도, 함께라면 도전해보고 싶게 만들었습니다. 나도 한 사람에게 빛이 될 수 있음을 알게 해주었고. 나약하고 인간적인 내 모습 그대로가,누군가에게는 없어서는 안 될 소중한 모습일 수 있음을 알게 해주었고. 나로 인해 길을 가다가도 웃음짓는 사람이 있음을 알게 해 주었고. 그래서.. 내가 살아있음이 행복이 되고 의미를 찾을 수 있었습니다. 사람과 사람 사이에 솔직하다는 것은 참으로 용기를 필요로 하는 것인데 나에게 늘 담백하고, 무모할 정도로 솔직했던 당신을 통해 내가 얼마나 겁쟁이였는지도 깨달았습니다. 사랑이란 것이 결국 한 사람을 위해 내 마음을 내어주기로 선택하는 것이고, 결심하는 것임도 알았습니다. 그리고 그 사람이 아니었더라면 난 아마 영원히. 선택이란, 내리지 못하고.. 결심이란, 할 용기도 없었을 겁니다. 내 인생 오래도 붙잡고 있었던 경계선의 끈을 내려놓은 건. 그대가 늘... 진심이었기 때문입니다. 나에 대한 강한 믿음을 보여주었기 때문입니다. 마음 토라져 문을 닫아버렸을 때건, 웃으며 마주앉았을 때건 우린 항상 우.리. 였고, 우린 항상 함.께.였고. 그 모든 것은 너.와. 내.가 만들어가는 이야기라는 것만으로도 소중하고 아름다운 시간인 듯 합니다. 앞으로도 항상 친구같고, 연인같고, 편안해도 늘 설레는 우리가 될 수 있겠지요? 아낌없이 사랑하고, 아낌없이 사랑받는 기쁨을 오래오래 누리며 살 수 있음에... 진심으로 고마워요. *^^*
이온디 17년 전
다음커뮤니케이션(대표 석종훈 www.daum.net)의 꿈이 영글었다. 2003년 이후 네이버 검색서비스에 빼앗긴 업계 1위를 다시 찾는 꿈이다. 동영상 사용자제작콘텐츠(UCC) 서비스 전략을 통해서가 아니다. 바로 검색 기술을 통한 정면 승부다. 전진 기지는 제주도에 있는 ‘다음 글로벌미디어센터(GMC)’다. 제주 다음 GMC에서 근무하는 직원은 180여명. 다음 전체 직원의 약 20%에 달한다. 이 중 8명의 핵심 개발자들이 웹검색개발팀을 구성했다. 이들을 통해 최근 다음이 선보인 웹검색 … 다음커뮤니케이션(대표 석종훈 www.daum.net)의 꿈이 영글었다. 2003년 이후 네이버 검색서비스에 빼앗긴 업계 1위를 다시 찾는 꿈이다. 동영상 사용자제작콘텐츠(UCC) 서비스 전략을 통해서가 아니다. 바로 검색 기술을 통한 정면 승부다. 전진 기지는 제주도에 있는 ‘다음 글로벌미디어센터(GMC)’다. 제주 다음 GMC에서 근무하는 직원은 180여명. 다음 전체 직원의 약 20%에 달한다. 이 중 8명의 핵심 개발자들이 웹검색개발팀을 구성했다. 이들을 통해 최근 다음이 선보인 웹검색 서비스(ws.daum.net)와 UCC검색 서비스가 나왔다. 웹상의 웹문서 데이터를 분석하고 연관 데이터를 끄집어내는 데이터마이닝 작업을 이 팀이 한다. 사용자가 원하는 데이터가 뭔지, 특정 데이터를 만들려면 검색엔진 개발 부문에 무엇을 요구해야 하는지 방향을 제시한다. 다음 검색기술에 대해 업계의 관심이 워낙 높아 제주의 다음GMC를 직접 찾았다. 제주시에서 조금 남쪽으로 내려가다 제주대학교에 도착하기 전 한적한 곳에 자리잡았다. “검색서비스에서 가장 중요한 게 랭킹으로 구글의 페이지랭크도 구글이 서비스를 시작한 8∼9년 전까지만 해도 상당히 위대한 서비스라고 볼 수 있겠지만 지금은 블로그나 카페, 지역정보 뉴스 등을 페이지랭크로 구현하기엔 한계가 있습니다. 다음의 최대 강점인 카페에 축적된 콘텐츠가 30억건에 달하는데 이를 랭킹과 웹검색 기술을 적용해 최적의 검색결과를 보여주기 위해 다른 접근이 필요합니다. 블로그나 카페의 콘텐츠와 UCC는 페이지랭크가 기본 개념으로 잡고 있는 링크가 없어 페이지랭크를 적용하기 어렵기 때문입니다.” 김동욱 다음 웹검색개발팀장의 설명이다.개발자답지 않게 술술 설명하는 그의 모습에서 지난해부터 검색에 공을 들이기 시작한 다음의 그간 노력의 흔적이 묻어났다. 실제로 다음이 자체 기술로 선보인 웹검색과 UCC 검색의 검색 퀄리티는 다음의 통합검색은 물론 경쟁사업자인 네이버의 그것보다도 우수하다는게 자체 평가다. 사용자의 검색 의도와 딱맞는 웹문서를 찾아준다는 설명이다. 네이버나 다음의 통합검색창에 ‘가야’라는 키워드를 검색할 경우 대다수의 사용자가 원하는 고대 왕국 ‘가야’에 대한 정보보다는 ‘함께 가야’ 또는 ‘내가 가야 할 길’, ‘연금펀드로 가야’ 등 사용자의 의도와 맞지 않는 검색결과가 상당수다. 다음의 웹문서검색과 UCC검색은 달랐다. 상당히 정확하게 문서를 찾아냈다. 물론 고유명사나 상업용키워드의 경우 통합검색을 이용하는 게 낫지만 웹문서를 검색할 때는 얘기가 다르다. “네이버가 지식검색으로 국내 포털 시장을 평정했는데 네이버 지식인은 즉흥적인 질문과 답변이 많을 수밖에 없습니다. 다음 내부의 카페나 블로그에 더 좋은 정보가 많지만 검색기술이 없어 장점을 살리지 못했는데 이제 자신감이 생겼습니다.” 김동욱 팀장은 그간 작업의 성과에 대해 아직은 완벽하지 않지만 분명히 발전하고 있다며 이렇게 말했다. 이 팀의 목표는 다음 통합검색 내 웹문서 검색에 적용된 구글 검색엔진을 올해 안으로 자체 개발한 웹검색 엔진으로 대체하는 일이다. “구글이 야후를 앞선 것은 구글의 검색기술이 야후 검색을 앞선 후부터 5년이 걸렸습니다. 기술에서 앞서고 사용자의 요구에 부합하기 시작한다면 다음도 국내 인터넷 시장에서 언젠가 선두를 탈환할 것으로 믿습니다.” 검색기술에 대한 공격적인 투자와 성과를 하나둘씩 내놓고 있는 제주도 다음 GMC의 핵심 인재들은 흥망성쇠를 속단할 수 없는 인터넷 업계에서 주목받을 수밖에 없다. 제주= 김민수기자@전자신문, mimoo@etnews.co.kr
이온디 17년 전
이 세상의 권력은 문장에서 나온다. - 이문열 성공전술과리더십 강연에서 숙명여대 학생서비스센터에서 나온 팀장님께서 강연 중에 하신 말씀이 기억에 남아 이 곳에 옮겨놓는다. 이 세상의 권력은 문장에서 나온다. - 이문열 성공전술과리더십 강연에서 숙명여대 학생서비스센터에서 나온 팀장님께서 강연 중에 하신 말씀이 기억에 남아 이 곳에 옮겨놓는다.