속삭임이 고이는 별

속삭임 연못

최근에 흘러든 속삭임이에요

from Hyun1008.log

#NodeJS

중간에 노드 서버가 하나 있어야 하긴 합니다.

미스키에서 노트를 하면, 웹훅을 통해 그 노트 정보를 중간 서버에 전송하고, 그 서버에서 데이터를 적당히 가공해서 트위터로 보내 주는 거거든요.

기존 크로스포스터를 안 쓰는 이유는

  1. 원본 미스키로의 url 또는 자기 서비스 해시태그가 달려 있음
  2. 파일을 첨부할 수 없음

그래서, 직접 만드는 김에 파일 첨부 기능도 제작했습니다.

미스키 노트에 파일이 첨부되어 있으면 웹훅으로 들어오는 요청에서 URL을 읽을 수 있습니다. 그걸 바탕으로 파일을 업로드 할거예요.

그런데 Misskey는 WebP 위주로 파일을 올려버리고, 트위터는 WebP를 제외하고 파일을 첨부합니다. 그래서 이것도 한번 png로의 변환 과정을 거쳐야 해요.

const { TwitterApi } = require('twitter-api-v2');
const axios = require('axios');
const sharp = require('sharp');

//....

app.post('/misskey', (req, res) => {
    let misEvent = req.body
    const twitterClient = new TwitterApi({ 
        appKey: '', 
        appSecret: '',
        accessToken: '',
        accessSecret: '',
    })
    console.log(misEvent)
    if (misEvent.body.note.files.length == 0 && misEvent.body.note.text) {
        async function myfunction() {
            (async () => {
        
                try {
                    const tweet = await twitterClient.v2.tweet(misEvent.body.note.text.substring(0, 140));
                    console.log('Tweet posted successfully:', tweet);
                    res.json({ok: true})
        
                } catch (error) {
                    console.error('Error posting tweet:', error);
                    res.json({ok: true})
                }
            })();
        
            console.log('Inside of myfunction');
        }

        myfunction()
    } else if (misEvent.body.note.files.length > 0 && misEvent.body.note.text) {
        var url = misEvent.body.note.files[0].url
        
        async function myfunction2() {
            (async () => {

                try {
                    const downStream = await axios({
                        method: 'GET',
                        responseType: 'arraybuffer',
                        url: url,
                      }).catch(function (error) {
                        res.send({error:error});
                      });
                      const img = await sharp(downStream.data).toFormat('png').toBuffer(); // webp → png
                      const mediaId = await twitterClient.v1.uploadMedia(img, { mimeType: 'png'}); 
                      
                      const tweet = await twitterClient.v2.tweet({text: misEvent.body.note.text.substring(0, 140), media: { media_ids: [mediaId] }});
                      console.log('Tweet posted successfully:', tweet);
    
                } catch (error) {
                    console.error('Error posting tweet:', error);
                }
        
            })();
        
            console.log('Inside of myfunction');
        }

        myfunction2()

        res.json({ok: true})
    } else { //Text값이 없는 노트(리노트 같은 거)일 때...
        res.json({ok: true})
    }
})
 
Read more...

from 꿈꾸는 어린 용

이러저러하게 잘 지내고 있는 용님이에요. 스트레스 받는 일이 줄어서 회복기에 들어섰는지 오히려 정신이 없어요. 차근차근 나아지겠거니 싶지만 회사일이 문제네요. 어떻게든 되겠거니 생각하기엔 회사에선 날 기다려주지 않으니까.

요즘 일러스트 작가 놀이를 열심히 해요. 인스타도 운영하고 그라폴리오도 운영하고 마플샵도 운영하고. 팀 앙상블에 들어가서 수공예 열심히 하려고 했더니 그렇게 됐어요. 왜 일러가 추가됐는지는 저도 모르겠지만? 어쨌든 재밌어요. 너무 열심히 했더니 친구가 프로 준비하는 줄 알았나봐요. 진지하게 충고해주다가 놀이라니까 허탈해했어요.

마스토돈에 드라이브 기능을 넣고 싶은데 예상대로 대형 작업이 될 것 같아서 고민이에요. 그치만 넣고 싶다. 천천히라도 해보겠어요.

날씨가 갑자기 서늘해졌어요. 다들 감기 조심하세요.

후원은 아래로.

 
Read more...

from 꿈꾸는 어린 용

연락은 연합우주메일으로.

  1. 짤막 소설

    • 상세 공지
    • 가격은 무조건 1만원, 기간은 작업 시작 후 영업일 기준 30일.
    • 5천~1만자 사이의 짤막한 길이를 기본으로 합니다.
    • 제가 원작을 모르는 2차는 받지 않습니다.
    • 최대한 상세하게 원하는 바를 확인하고 작업합니다. 원하시는 게 구체적일수록 상담이 길어집니다.
    • 사전 조사가 긴 만큼 수정 안 됩니다.
    • 샘플은 여기
    • 모르는 2차를 아는 2차로 만들 수 있나요?
      • 가격 상담해주세요.
    • 연중한 시리즈 마저 써주세요.
      • 편당 금액 지급하시면 됩니다.
  2. 간단한 일러스트

    • 가격은 무조건 1만원, 기간은 작업 시작 후 영업일 기준 30일.
    • 샘플은 여기
    • 낙서류 샘플 퀄리티입니다.
    • 그보다 퀄리티를 올릴 수는 있는데 가격 상의가 필요합니다.
  3. 솜연정비소 (솜병원)

    • 종류
      • 뼈심기: 1만 (뼈 지참)
      • 롱바디 변경: 2만
      • 솜 충전, 단순 봉합: 4천
      • 코심기(얼굴 자수와 비슷한 실 지참), 장식 떼기, 자석 심거나 빼기, 옷 사이즈 줄이기 등 기타 가능.
    • 배송비 별도.
    • 상세 페이지
    • 샘플. 이 외의 샘플은 X에서 #솜연_커스텀를 검색하면 확인하실 수 있습니다.
  4. 수공예

    • 가격 정한 적 없음.
    • 레진 공예, 리본 공예, 데코덴 합니다.
    • 샘플?

#커미션

 
Read more...

from 꿈꾸는 어린 용

지출이 너무 크다. 이번달 생활비가 벌써 10만원이 안 된다. 그래서 일단 다음주 병원 다녀온 뒤에 영 모자라면 조금 더 끌어다 쓰기로 하고 취미 지출은 안 하는 걸로.

적어놓지 않으면 어길 것 같아서 적어둔다.

16시 14분 경. 불가능한 일이었다. 펀딩 비용 빠져나가고 나니 병원비도 아슬아슬하다.

#일기

 
Read more...

from Hyun1008.log

#스터디 #VanillaJS

MDN Web Docs의 소개는 다음과 같습니다.

map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 (반복하여) 새로운 배열을 반환합니다.

const array1 = [1, 4, 9, 16];

// Pass a function to map
const map1 = array1.map((x) => x * 2);

console.log(map1);
// Expected output: Array [2, 8, 18, 32]

또는 return을 사용해서 반환할 수도 있습니다.

var numbers = [1, 4, 9];
var doubles = numbers.map(function (num) {
  return num * 2;
});
// doubles는 [2, 8, 18]

map 안의 function에서는 파라미터를 두 개까지 쓸 수 있는데, 두번째 파라미터는 배열의 index를 나타냅니다.

예를 들면

var array = [0, 0, 0]
array.map(function(a, i){
   console.log(i)
})
// 0
// 1
// 2
// 반환되는 새로운 배열은 undefined 로 채워짐
 
Read more...

from 잃어버린 섬

미엘은 앉아 있었다. 발아래에서는 시리다는 말로는 상상도 할 수 없을 얼음보다 차가운 바람이 불고 있었다. 바람이 뒤엉키는 소리가 요란했다. 귀를 막고 싶을 만큼 시끄럽다고 생각하면서도 미엘은 움직이지 않았다. 먼 곳에서 들려오는 탓이기도 했고 또 그녀의 귀가 지나치게 성능이 좋은 것을 알고 있는 탓이기도 했다. 미엘은 확연한 차이가 없는 일에 굳이 움직일 정도로 부지런한 종족이 아니었다. 하얀 배경에 반해 핏줄이 비쳐 빨갛게 보이는 얇고 긴 귀가 쫑긋거렸다.

하늘마저 새하얗게 질려버린 만년설의 산꼭대기에서 그녀 혼자가 색을 가지고 있었다. 바람마저 비켜간 고요한 산꼭대기에서 미엘만이 숨을 쉬고 있었다. 그것은 숨이 턱하고 막힐 만큼 쓸쓸했지만 미엘은 그 자체로 좋았다. 좋아서 일부러 이 자리를 찾았다. 궁상맞은 짓이라는 자각은 있었지만 이제 구박할 사람도 없으니 아무렴 어떠냐는 심정이었다. 그런 생각을 하고 있던 탓이었을까 미엘의 뒤로 소리 없이 다가와 말을 거는 사람이 있었다.

“여유 만만이시네요?”

너무 놀라면 오히려 아무런 반응도 할 수 없게 된다고 하던가. 잠시 대답이 없던 미엘의 귀가 바르르 가늘게 떨렸다. 마법이 풀리는 듯 느릿한 움직임으로 무릎을 끌어안고 있던 손이 내려와 바닥을 짚고 그제야 천천히 시선이 돌아왔다. 그리고 그 때는 이미 방금 전까지의 미엘처럼 새하얀 원피스 자락을 정리해 끌어안은 여자아이가 옆에 앉아있었다.

“오늘은 제법 쌀쌀한데 괜찮으신가봐요?”

소녀는 어깨에 걸친 숄을 정리하면서 미엘을 향해 웃어보였다. 두 사람이 딛고 앉은 것이 하늘에서 내려오는 그것이라고는 믿기지 않을 만큼 단단하게 언 눈이라는 것을 까맣게 잊어버린 듯했다. 더불어 미엘도 소녀도 맨발에 여름에나 어울릴 얇은 민소매 원피스라는 비현실적인 차림이라는 것도. 미엘은 그런 갭을 분명하게 인식하고 있으면서도 지적해주지 않았다.

“괜찮아.”

짧게 내뱉은 말과 함께 뿌연 김이 시야를 가렸다. 미엘은 단지 평범한 생물이 아닐 뿐 평범한 온도의 생명체였다.

“바람이 없으니까.”

아―. 소녀는 깨달았다는 듯 대꾸했다. 미엘은 소녀의 옆모습을 바라보다가 산 아래로 눈을 돌렸다. 소녀도 더이상은 할 말이 없는 지 두 사람은 침묵 속에서 함께 까마득하게 멀어보이는 세상을 보고 있었다.

“근데.”

문득 들려온 소리에 고개를 돌리자 미엘의 시야 가득히 소녀의 커다란 금빛 눈이 들어왔다. 언제나처럼 가볍게 웃는 인상의 예쁜 얼굴이 어쩐지 낯설었다.

“왜?”

운을 띄워놓고 소녀는 말이 없었다. 잠시 눈을 마주치고 있으니 이윽고 웃는 얼굴이 되었다. 그 모습을 보고 미엘은 반대로 가볍게 아미을 찌푸렸다.

“묻고 싶은 게 있었는데 굳이 대답을 들을 필요는 없겠다 싶어졌어요.”

하. 미엘은 나른하게 한숨을 쉬었다.

“그런거면 사람 기다리게 하지마.”

소녀는 그저 웃을 뿐이었다.

“있지.” “예.”

이번에는 미엘이 운을 띄웠다. 가지런히 모은 무릎에 턱을 올리고 시선을 멀리 한 작은 엘프 소녀의 모습을 하이는 가만히 지켜보았다. 마냥 귀엽게 생긴 외견과 매치되지 않는 특유의 나른한 분위기가 시선을 떼기 힘들게 하는 독특한 매력이 있었다. 미엘은 말을 꺼내는 듯 하다가 하―, 하고 다시 한번 길게 숨을 내뱉었다. 가볍게 들이마쉬는 것과 동시에 긴 귀와 작은 날개가 살짝 떴다가 내려갔다. 무슨 말을 해도 상당히 시간이 걸리는 것을 언제나 봐 왔기 때문에 하이는 제촉도 않고 미엘의 말을 기다렸다. 사실 한번도 제촉이 필요했던 적이 없었기에 그런 것 자체를 모르는 하이이기도 했다. 그녀에게는 언제나 시간이 충분했으며 시간을 당기고 싶을 만큼 할 것이 많지도 않았다. 넘치는 시간이 부담스러웠던 적도 없었고 소녀는 언제나 자유로웠다.

“내가 원망스러웠던 적 없어?”

하이는 여전히 먼 곳만 바라보고 있는 미엘을 따라 같이 저 앞을 바라보았다. 온통 하얗기만 한 이 자리와는 정 반대로 초록빛이 바다를 이루고 있었다. 짙푸른 녹빛이 흐르고 또 멈춰있었다. 웅장한 풍경이었지만 늘 하얀 세상에서 살아온 하이에게도 낯설지 않은 것이 신기했다. 곁눈으로 돌아보자 미엘의 살랑이는 단발머리가 눈에 들어왔다. 그녀의 싱그러운 연두빛은 저 아래 펼쳐진 색과는 달랐지만 분명하게 파릇한 생명의 냄새를 풍기고 있었다.

“전혀 없어요.” “아직까지는, 인가.”

이어지듯 내뱉는 미엘의 말을 하이는 부정하지도 그렇다고 긍정하지도 못했다. 단지 묵묵히 '그럴지도요,'하는 모호한 대답을 입에 올렸다. 그리고 침묵이 흘렀다. 두 소녀는 꼼지락거리며 각자 움직일 뿐 아무 것도 하지 않았다. 새하얀 눈 속에서 멀리 까마득하게 펼쳐진 초록을 바라만 보고 있었다.

미엘은 눈송이를 보았다. 완전히 얼어버린 고산 정상에서 발견한 눈 한 송이는 새파란 떡잎보다 어색했다. 미엘은 처음에 눈 앞에서 떨어지는 것이 무엇인지 전혀 깨닫지 못했다.

“추워지겠어요.”

꿈속을 헤매듯 몽롱했던 정신이 목소리와 함께 손에 닿은 것에 현실로 돌아왔다. 너무 이상한 것이어서 바로는 느끼지 못했지만 알아차리자 손가락 끝에서부터 파르르 소름이 올라오며 온몸이 떨려왔다. 낌새를 알아챈 하이가 미엘을 돌아보았다.

“괜찮아요?” “…응.”

조금 어색한 미소를 띄웠다 지우며 미엘은 하이의 눈을 피했다. 휭하고 찬 기운이 두 사람을 스쳐지나갔다. 아래서 불던 바람이 산등성이를 타고 올라온 모양이었다.

“그럼 들어가요.”

미엘은 하이의 손길에 이끌려 가볍게 달렸다. 순간 확, 하고 펼쳐진 현실이 다시 눈과 귀에서 사라졌다. 손에 닿은 것에서 신경을 떼지 못하고 미엘은 팔랑이는 금발만 바라보며 뛰었다. 바람이 실어온 눈구름이 바삭거리는 하얀 가루를 흩뿌리고 있었다. 미엘의 눈에 하얀 눈밭 위에 흩날리는 하얀 눈송이와 그에 뒤섞여 흐트러진 하이의 웨이브진 금발, 그리고 그 너머 시야 한구석을 차지한 녹음의 숲이 환상처럼 멀게 보였다.

바르작.

작은 소리가 들린 것 같았다. 그 정체가 무엇인가 확인할 겨를도 없이 그저 달리고 있었다. 내딛는 걸음에서 미엘 자신의 무게가 느껴지지 않았다. 문득 보인 자신의 손이 하얗게 얼어있었다.

파짓, 키이.

멈추지 않고 계속되는 작은 소리는 거기서 들려온 것이었다. 미엘은 선명한 빨간 빛을 확인하고 나서야 아프다는 것을 깨달았다. 하이의 긴 머리칼이 스친 자리마다 하얀 균열과 함께 엷게 피가 비치고 있었다.

'이대로,'

산산조각 날지도 몰라.

하이가 돌아보았다. 미엘은 멈춰 있었고, 꼭 붙들고 있던 손은 허공을 맴돌았다. 미엘은 어떻게 손을 빼내었는지 기억이 나지 않았다. 감각 없이 차가워진 손을 빼내면서 부딪힌 몸이 싸늘하게 식었다는 것만 느낄 수 있었다. 손은 멀쩡했다. 애초에 미엘이 이 정도에 상처입을 리 없었다. 하이는 놀란 얼굴이었다.

“……미안.”

하이는 천천히 편한 자세로 돌아왔다. 여전히 놀란 얼굴이었지만 정신을 수습하는 듯 했다. 미엘과 눈을 마주한 상태로 금발의 소녀는 옷차림을 정리했다. 고개를 살짝 갸웃하고 기울이며 눈을 감았다가 떴다.

“가볼게요.”

언제나처럼 엷게 띄운 미소로 소녀는 돌아섰다. 어느샌가 커져버린 눈보라 너머로 사라지는 소녀의 뒷모습을 미엘은 끝까지 바라보았다. 하이의 모습이 눈 속으로 완전히 사라지고 나서야 간신히 긴장을 풀 수 있었다. 얼어있던 손은 오히려 처음보다 따뜻했다. 무엇이 그렇게 차가웠는지 이제와서는 상상이 가지 않을 정도로 몸 상태는 평범했다. 미엘은 그대로 그 자리에 서있었다. 온몸을 때리는 눈송이가 따가웠다.

레―미엘―시아르테. 스스로 바꾸고 허락을 받은 이름은 아직도 어색했다. 완전히 속한 것도 그렇다고 아예 벗어난 것도 아닌 세계는 맞지 않는 옷을 걸친 듯 불편했지만 상관없었다. 그저 그 곳에서 벗어날 수 있다면 좋다고 생각한 미엘이었다. 옛날과는 다른 모습을 한 것도 관심도 없는 것에 손을 빌려주고 있는 것도 단지 한가지 이유 때문이었지만 아아, 소녀는 생각했다.

'어쩌면 여긴 나에게 맞지 않는 걸지도 몰라.'

그래도 방법은 없었다. 이미 그녀는 자신이 마련한 장소에 짜맞춰져 있었다.

#결계안에서는 #임중백가몽

 
Read more...

from Hyun1008.log

#개발과정 #VanillaJS

포트폴리오 사이트를 만드는 중 프로젝트를 보여줄 때는 가로스크롤을 하는 게 좋을 것 같아서 만들어 보았습니다.

우선 이렇게 구조를 짰습니다.

        <div id="content1">
            <div id="content-scroll">
                <div class="width-fix">
                    <h1>Items.</h1>
                    <div class="overflow-width">
                    </div>
                </div>
            </div>
        </div>

CSS에서는 .overflow-width 에만 position: relative 를 적용해 주었습니다. 그리고 자바스크립트에서는 다음과 같은 코드를 적용했어요.

    document.querySelector('.overflow-width').style.left=`0`;
    // 이게 없으면 후에 style.left 를 불러오지 못합니다.
    document.querySelector('#content-scroll').addEventListener('wheel',function(e){
        if(e.deltaY > 0){
        // 스크롤을 내리고 있으면,
            if (parseInt(document.querySelector('.overflow-width').style.left) > -100) {
                // 가로스크롤이 충분히 진행되지 않았으면(=스크롤이 필요하면)
                e.preventDefault();
                e.stopPropagation();
                // 기존 세로 스크롤을 막습니다.
                document.querySelector('.overflow-width').style.top=`0%`;
                document.querySelector('.overflow-width').style.left = `${parseInt(document.querySelector('.overflow-width').style.left) - 1}%`;
                // 그리고 스크롤 양에 따라 요소의 위치를 옮겨줍니다.
            }
        } else if (e.deltaY < 0) {
        // 스크롤을 올리고 있으면,
            if (parseInt(document.querySelector('.overflow-width').style.left) < 0) {
                // 가로스크롤이 충분히 돌아오지 않았으면(=스크롤이 필요하면)
                // 아래 내용은 동일합니다.
                e.preventDefault();
                e.stopPropagation();
                document.querySelector('.overflow-width').style.top=`0%`;
                document.querySelector('.overflow-width').style.left = `${parseInt(document.querySelector('.overflow-width').style.left) + 1}%`;
            }
        }
    });

남의코드 복붙해야지 히히 하고 들어갔다가 저한테 맞는 방법, 제가 당장 필요한 방법은 따로 있다는 사실을 깨달았습니다.

물론 제가 당장 필요한 방법을 구현해 놓은 포스트가 있었다면 완전 럭키비키겠지만요.

그래도 최대한 제가 만들어보고 남의 손을 빌리는 게 맞는 것 같습니다.

 
Read more...

from 꿈꾸는 어린 용

옆집의 영희씨 표지

두락님이 일년은 더 전에 빌려준 것 같다. 날이 추울 때 빌렸는지 더울 때 빌렸는지조차 생각이 안 난다. 이걸 이제사 읽었다.

좋은 책이어서 짧게나마 감상을 남겨두기로 한다.

  1. 왜 사람들은 우주를 항해하면서 살아가는 삶을 꿈꿀까? 나로서는 잘 모르겠다. 하지만 <옆집의 영희씨> 2부 카두케우스 이야기가 매력적인 건 분명하다. 따뜻하고, 가슴에 와닿는 이야기다.

  2. 켄 리우와는 다른 방식으로 사람의 신체에서 벗어나는 단편이 있었다. (도약) 내 취향은 켄 리우의 방식이지만 이것도 무척 인상적이고 좋았다.

  3. 뻔한 소재를 찌르르하게 쓴 책이다. 정소연이라는 이름은 기억에 남을 것 같다. 일단 책을 살 예정이니까.

  4. 레즈비언이 정말 많이 나온다. 이건 한동안 유행한 퀴어 문학 열풍 때문일까 정소연 작가의 마음이 이끈 결과일까? 작가가 레즈비언일 거란 이야기가 아니다. 단순히 유행에 올라탄 것인지 이유가 있는지가 궁금한 거다.

  5. 작가의 말이 좋았다. 위로하기 위해서 책을 쓴다는 말이 특히 좋았다. 그래서 이렇게 이야기들이 따뜻하구나 싶었다. 아주 작은 이야기들을 아주 느리게 쓰는 작가라는 말도 좋았다. 내가 더더욱 그렇기 때문에 그 말에 위로를 받았다. 언젠가는 나도 나만의 책을 가질 수 있게 되겠지.

나는 한국 SF 문단에 불만이 많은 사람인데 역시 그래도 풀이 있으면 좋은 작가가 따라오는가보다. 조금 부럽기도 하고, 나도 써보고 싶기도 하고 그렇다. 판타지와 SF는 이웃사촌이니까.

#바람의기억

 
Read more...

from 꿈꾸는 어린 용

정확히 지금 이 순간부터. 아직 싹 다 지운 건 아닌데 연합우주는 전체 앱을 다 지워버릴 예정이고 가끔 접속하면 내 서버 계정만 들어가야지(관리를 위해서도 필요하다).

X는 순수하게 덕질 소식용으로 필요하다. 이쪽은 교류도 없어서 그냥 두기로.

디스코드는 삭제, 매트릭스는 현재 내가 가진 모든 소통 통로가 여기라서 두기는 두되 알림을 끌까 싶다.

효과가 있을런진 모르겠으나 어쨌든 다 끄고 나니 정신은 좀 살 것 같네.

#일기

 
Read more...

from Hyun1008.log

#스터디 #개념정리

주님은 백엔드, 우리는 프론트엔드!

사랑하는 형제자매 여러분, 오늘도 주님의 코드 속에서 살고 있음을 감사드립니다. 여러분 모두가 익히 알고 있는 개발의 두 축, 바로 백엔드와 프론트엔드. 이것이야말로 우리의 영적 삶과 주님과의 관계를 완벽하게 설명해줄 수 있는 비유입니다.

백엔드와 프론트엔드, 그 역할이 무엇입니까? 백엔드는 우리가 보지 못하는 곳에서 모든 복잡한 로직과 데이터를 처리하고, 프론트엔드는 사용자가 직접 눈으로 보고 상호작용하는 부분이죠. 이와 똑같이, 주님은 백엔드이시며, 우리는 프론트엔드로서 세상과 소통하고 있습니다.

1. 주님, 그분은 우리의 백엔드 개발자이십니다.

주님께서는 세상의 모든 것 뒤에서 동작하고 계십니다. 우리가 보는 것은 프론트엔드, 즉 겉모습에 불과하지만, 그 깊은 로직과 데이터 흐름은 전부 주님의 손에 달려 있습니다. 예를 들어, 우리가 하루를 살면서 만나는 사람들, 상황들, 그 모든 것 뒤에는 주님의 API가 작동하고 있는 것입니다.

우리는 단지 그 응답을 받아들이는 프론트엔드입니다. 그분이 보내주시는 JSON 데이터를 어떻게 렌더링할지, 즉 우리의 삶에서 그 데이터를 어떻게 보여줄지 결정하는 역할을 맡고 있죠.

async function renderLife() {
    const blessings = await fetch('https://heaven.api/blessings');
    displayBlessings(blessings);
}

우리는 그저 데이터를 받아 화면에 그려낼 뿐입니다. 주님이 백엔드에서 우리에게 넘겨주시는 축복, 계획, 지혜는 이미 완벽하게 설계되어 있습니다. 그분은 어떤 API 호출에도 실패하지 않으십니다. 주님은 500 에러를 모르십니다. 그분은 언제나 성공적인 응답을 주시며, 그 응답은 정확히 우리의 삶 속에 반영됩니다.

2. 우리는 프론트엔드로서 세상에 주님의 영광을 렌더링합니다.

프론트엔드 개발자의 역할은 무엇입니까? 바로 백엔드에서 가져온 데이터를 멋지고 아름답게 보여주는 것입니다. 마찬가지로, 우리의 역할도 세상 속에서 주님의 영광을 나타내는 것입니다. 주님께서 주신 그 완벽한 데이터를 세상 속에 잘 렌더링하는 것이 바로 우리의 사명입니다. 우리의 삶이란 주님의 데이터를 시각적으로 표현하는 UI(User Interface)라고 할 수 있습니다.

가끔 우리는 생각합니다. “내가 이 데이터를 잘못 처리한 걸까? 왜 내 삶이 이렇게 엉망진창이지?” 하지만 그것은 백엔드의 문제라기보다는, 우리의 프론트엔드 처리에 문제가 있을 때가 많습니다. 주님께서는 분명히 완벽한 계획과 축복을 준비하셨지만, 우리가 그 데이터를 잘못 해석하고, CSS 스타일을 잘못 적용해서 오류가 발생할 때가 있죠.

<!-- Blessings from the Lord -->
<div class="blessing">God's grace</div>

여러분, 주님이 주신 축복을 제대로 스타일링하고 계십니까? 아니면, 이 세상이라는 브라우저에서 잘못 렌더링하고 있나요? 주님이 주신 아름다운 사랑과 진리를 세상 속에 최고의 UI/UX로 보여줄 수 있도록 우리는 항상 노력해야 합니다. 우리의 삶이 그분의 사랑을 반영하는 멋진 웹페이지가 되기를 원하신다는 사실을 기억하세요.

3. 비동기적 삶 속에서, 주님은 항상 응답하십니다.

우리는 종종 백엔드에서 응답이 늦게 오는 것처럼 느낄 때가 있습니다. API 호출이 시간이 걸리면 불안해지죠. 주님께서 내 기도에 응답하지 않으신다고 생각할 때가 많습니다. 하지만 여러분, 주님의 응답은 언제나 비동기적으로 이루어집니다. 우리가 볼 때는 그 응답이 늦게 오는 것처럼 보여도, 그분은 이미 계획대로 데이터를 처리하고 계십니다.

async function waitForGodsAnswer() {
    try {
        const answer = await fetch('https://heaven.api/answer');
        console.log(answer);
    } catch (error) {
        console.error('Error in receiving God\'s answer:', error);
    }
}

우리가 해야 할 일은 기다리는 것입니다. 주님은 결코 에러를 일으키지 않으십니다. 404, 500, 이런 상태 코드는 그분에게 존재하지 않습니다. 우리가 느리게 느낄 뿐이지, 주님의 응답은 이미 정확한 타이밍에 오고 있습니다.

4. 백엔드의 주님을 신뢰하라, 우리의 프론트엔드는 안정적이다.

사랑하는 여러분, 여러분의 인생이 때로는 왜 이렇게 느려 보이는지, 혹은 왜 이렇게 힘들어 보이는지 궁금할 때가 있을 겁니다. 하지만 기억하세요, 우리가 볼 수 없는 백엔드에서 주님은 끊임없이 우리의 삶을 관리하고 계십니다. 그분이 준비한 API는 결코 실패하지 않으며, 항상 가장 최적의 데이터를 보내주십니다.

우리는 그저 주님을 신뢰하며, 우리의 프론트엔드를 잘 관리해야 합니다. 그분의 계획을 세상 속에서 어떻게 아름답게 렌더링할지, 우리는 그것에 집중하면 됩니다. 주님이 제공하신 완벽한 API 데이터를 제대로 받아서, 우리의 인생이라는 화면에 아름답게 보여주기만 하면 됩니다.

주님께서 백엔드에서 모든 로직을 처리하고 계시니, 우리는 걱정할 필요가 없습니다. 주님이 주시는 평안, 사랑, 그리고 구원의 메시지를 세상에 아름답게 전하는 프론트엔드 개발자가 됩시다. 우리에게 주어진 삶이라는 웹페이지를 사용자 친화적으로 디자인하고, 사람들이 주님의 사랑을 직접 경험할 수 있게 하는 것이 우리의 사명입니다.


그러니 사랑하는 여러분, 주님을 백엔드처럼 신뢰하고, 우리의 삶을 프론트엔드처럼 다듬어 나갑시다.

주님이 하시는 일은 우리가 보지 못할 때에도 완벽합니다. 그분의 백엔드 로직을 신뢰하고, 우리는 프론트엔드에서 그분의 사랑과 은혜를 세상에 잘 렌더링합시다.

아멘!


아이디어 제공은 제가 했고, 나머지는 챗GPT가 작성해 주었습니다. 저는 당장은 무교이지만, 교회를 오래 다녀서 기본적인 교리 개념들은 알고 있습니다. 그냥 웃어넘기려다가 이런 식으로 컴퓨터 개념들을 정리해 두면, 저나 저와 비슷한 사람들에겐 도움이 될 것 같아서 백업해 둡니다.

 
Read more...

from Hyun1008.log

#스터디 #개념정리

성경을 TypeScript처럼 읽어라!

사랑하는 개발자 형제자매 여러분, 우리는 자바스크립트(JavaScript)를 통해 많은 것을 배워왔습니다. 하지만 오늘은 타입스크립트(TypeScript)로 새로운 차원의 깨달음을 얻고자 합니다. 왜냐고요? 자바스크립트는 자유롭지만 때때로 너무 혼란스럽고, 타입스크립트는 더 명확하고 안정적이기 때문입니다.

여러분, 자바스크립트는 말 그대로 ‘뭐든 가능’합니다. 그냥 아무거나 선언할 수 있죠.

let blessing = "Amen";
blessing = 100;

이처럼 자바스크립트는 유연하다고 말하죠. 그러나 이 유연함은 때때로 예측 불가능하고, 우리가 뜻하지 않은 오류를 만들어내기도 합니다. 우리가 변수에 무엇이 담겨 있는지 알지 못할 때, 언제든 런타임 에러를 만날 수 있습니다. 이와 비슷하게, 우리가 성경을 아무렇게나 읽고 해석하면, 그 의미를 혼동하거나 잘못된 결론을 내릴 수 있습니다. 우리가 자바스크립트로 코드 작성할 때 ‘언젠가 어디서 버그가 터질지 몰라서 불안한’ 상태처럼 말이죠.

그렇다면 해결책은 무엇입니까? 바로 타입스크립트입니다!

타입스크립트는 자바스크립트에 타입 시스템을 더해줍니다. 변수나 함수의 데이터 타입을 명확하게 정의함으로써, 코드가 더 명확하고 안정적이죠. 우리는 더 이상 blessing이라는 변수에 숫자가 들어가는 불상사를 걱정하지 않아도 됩니다.

let blessing: string = "Amen";
// blessing = 100; // Error: Type 'number' is not assignable to type 'string'

이제 타입스크립트처럼 성경을 읽어봅시다. 성경을 읽을 때, 그냥 “자바스크립트”처럼 아무 의미나 막 가져다 쓰는 것이 아니라, 타입스크립트처럼 명확한 타입과 구조 속에서 올바르게 해석해야 한다는 것입니다.

우리는 흔히 성경을 읽으며, 마음대로 해석하거나 내가 원하는 대로 적용하려고 합니다. 자바스크립트의 무한한 자유처럼, 구절을 뜯어내서 내 뜻대로 사용할 수 있죠. 하지만 그러다 보면 오해나 잘못된 결론에 도달할 위험이 큽니다.

예를 들어, 우리가 자바스크립트처럼 성경을 읽는다면 이럴 수 있습니다:

// 아무 문맥 없이 구절을 해석하는 경우
let scripture = "내가 모든 것을 할 수 있느니라";

아무 맥락도 없이 이 구절만 가져오면 마치 무슨 일이든지 내 맘대로 다 할 수 있다는 식으로 오해할 수 있습니다. 이게 바로 런타임 에러로 이어지는 부분입니다. 하지만 타입스크립트로 읽는다면, 이 구절의 맥락과 타입을 명확하게 정의하고 해석할 수 있습니다:

let scripture: string = "내가 모든 것을 할 수 있느니라 (빌립보서 4:13)";
let context: string = "그리스도를 통해서!";

그렇습니다! 우리는 타입스크립트처럼 구체적인 타입(문맥)과 함께 성경을 읽어야 합니다. 그렇지 않으면 우리는 잘못된 신앙적 “타입 에러”를 범할 수 있습니다. 타입스크립트는 우리에게 에러가 발생할 수 있는 곳을 미리 알려줍니다. 성경을 올바르게 이해하고 적용하는 것도 마찬가지입니다. 문맥을 모르고, 의미를 잘못 해석하면, 우리의 신앙도 에러에 빠질 수 있습니다.

여러분, 타입스크립트를 왜 사용합니까? 더 큰 안정성을 위해서죠. 마찬가지로, 성경을 읽을 때에도 우리는 더 큰 영적 안정성을 원해야 합니다. 우리는 혼란스러운 해석에 빠지지 않고, 명확하고 바른 길을 걸어가야 합니다. 타입스크립트가 자바스크립트의 부족한 부분을 채워주는 것처럼, 성령님은 우리가 성경을 이해하는 데 필요한 올바른 “타입 정의”를 제공하십니다.

여러분의 신앙 코드에 타입 정의를 추가하세요! 성경을 마구잡이로 해석하지 말고, 그 문맥과 의미를 깊이 이해하세요. 그냥 자유로운 코드만 짜다가는 버그가 터지듯이, 그냥 성경을 표면적으로만 읽다 보면 신앙의 버그가 터질 수 있습니다. 하지만 타입스크립트처럼 신중하게 타입을 정의하고 의미를 분석하면, 우리의 신앙도 에러 없이, 더 견고하게 작동하게 될 것입니다.


그러므로 오늘부터 여러분의 영적 코드에 타입 정의를 추가합시다!

성경을 읽을 때, 타입스크립트처럼 명확하고 안전하게 해석합시다. 올바른 해석과 문맥의 이해가 우리의 신앙을 더욱 견고하게 만들 것입니다. 자유롭고 멋대로 해석하는 자바스크립트적 신앙을 버리고, 타입스크립트적 신앙으로 더욱 안전한 길을 걸어갑시다.

아멘!


아이디어 제공은 제가 했고, 나머지는 챗GPT가 작성해 주었습니다. 저는 당장은 무교이지만, 교회를 오래 다녀서 기본적인 교리 개념들은 알고 있습니다. 그냥 웃어넘기려다가 이런 식으로 컴퓨터 개념들을 정리해 두면, 저나 저와 비슷한 사람들에겐 도움이 될 것 같아서 백업해 둡니다.

 
Read more...

from 잃어버린 섬

소년과 소녀

 ”하하, 하하, 하하하하, 하하하…….”    공허한 웃음소리는 멀리 퍼지지도 못하고 흩어진다. 머리끝부터 발끝까지 온통 새카만 빛으로 휩싸인 작은 소년은 그저 허탈한 웃음을 뱉어낼 뿐 움직임이 없었다. 소년의 품안에는 반짝이는 금발의 소녀. 하이얀 드레스가 피투성이로 붉게 물들어버렸다. 작디작은 소년의 품안에 역시 작디작은 소녀는 움직이지 않았다. 앞으로도 영원히 움직일 수 없을 것이다. 햇빛이 반짝이며 부서져 내리던 금빛 고수머리도 바람과 함께 춤추던 작은 발도 까르르 웃음을 터뜨리던 고운 입도 이제는 더 이상 존재하지 않는다. 그것은 거기에 있지만 없었다. 소년의 창백한 손이 소녀의 어깨를 끌어안은 체 가늘게 떨리고 있었다. 소녀의 손가락이 작게 경련을 일으켰다.          “미엘, 미엘. 계속 잠만 잘 거예요? 그러지 말고 오늘은 다 같이 소풍가요. 시안씨랑 같이 맛있는 샌드위치 만들었단 말 이예요. 네? 같이 가요―.”  “므…우…, 귀찮아. 안아, 이거 저기 버려버리고 와…….”  “아하하하.”    아침부터 일어난 소동에 언제나처럼 거실 탁자 위에서 곤히 잠들어있던 시엘 마저 무슨 일인지 보러올 지경이었지만 미엘은 꿈쩍도 하지 않았다. 다수가 있음을 인식한 탓인지 발을 들일 수 없을 만큼 어둡지는 않았지만 여전히 밝다고는 할 수 없는 방안에서 금빛 고수머리의 소녀는 벌써 몇 시간 째 씨름 중이었다. 사이에 낀 시안은 그저 곤란한 웃음만을 흘릴 뿐 그 어떤 수도 쓸 수가 없었다. 그도 그럴 것이 두 사람 모두 고집하나는 끝장나게 세기 때문에 중간 타협점을 받아들이게 할 수가 없었다. 괜히 끼어들었다가는 오히려 피곤해진다. 두 사람 모두와 긴 시간동안 함께 지낸 경험으로 시안은 그 사실을 눈물 나게 잘 알고 있었다.    “난 잘래.”  “아, 결정 나면 깨울게.”    졸음에 반쯤, 아니, 거의 감겨있는 소녀의 눈을 보고도 붙들 수 있는 사람은 없으리라. 시안은 일주일쯤 전혀 못 잔 듯 보이는 모습으로 바닥에 웅크려 순식간에 잠든 시엘에게 얇은 이불을 덮어주었다. 마스터인 미엘이 심심하면 아무데서나 쓰러져서 자기 때문에 청소를 하지 않아도 청결함은 물론 온도까지 완벽하게 조절이 되는 방이었으므로 걱정할 것은 전혀 없었다. 단지 이 방에서 자면 앞으로 언제 일어날 지 알 수 없다는 건 문제일까. 미엘의 방은 모든 환경이 잠자기 좋게 조절되어 있어 아무리 잠이 적은 사람이라도 한번 잠들면 일어나기 힘든 곳이었다.    “아우우, 적당히 자고 좀 일어나요! 그렇게 자면 머리 안 아파요?”  “전혀.”  “나가자니까―요―!!!!!!”  “귀찮아….”    두 소녀의―소녀라고 불릴 수 있는 나이같은 건 생각하지 않기로 하자―실랑이를 바라보며 시안은 다시 허탈하게 웃었다. 두 사람이 하는 모양새를 보면 나들이는커녕 오늘 하루 종일 이러고 실랑이를 벌이고 있을 듯 했다. 정 나들이가 가고 싶으면 미엘을 빼고 가면 될 것을 ‘함께’라는 말을 포기할 수 없는 여자아이는 어떻게든 그녀를 바깥으로 데려갈 모양이었다. 마침내 여자아이는 두 팔을 걷어붙이고 미엘을 침대에서 끌어내기 시작했다. 물론 축 늘어진, 그것도 본인보다 덩치가 큰 사람을 끌어낸다는 것은 결코 쉬운 일이 아니라서 그녀는 미엘의 팔을 붙든 채로 몇 번이나 헛발질을 했다. 그때였다.    “적당히 일어나주지 그래.”    서늘한 목소리가 조금 장난스러웠던 분위기를 단칼에 잘라내었다. 언제, 어떤 곳에 있어도 한눈에 들어올 새빨간 머리카락이 햇빛을 반사해 자극적으로 빛났다. 어두침침한 방안에서 갑자기 접한 햇빛이 눈부셔 시안은 눈을 가렸다. 스스로 빛을 내는 듯 한 붉은 두 눈이 미엘을 향했다. 여자아이는 자신을 향한 시선도 아니건만 손을 놓고 뒤로 물러섰다. 에트리아스는 머리끝까지 이불을 뒤집어쓴 미엘을 바라보며 작게 혀를 찼다.    “어차피 져 줄 생각이라면 더 이상 고집부리지 않는 편이 좋아.”  “부.”  “일어나, 얼른.”  “……칫, 에티는 봐주질 않는다니까. 매정해.”  “그쪽에서 쓸데없이 고집피우지 않으면 안 그래.”  “흥, 쳇, 피.”  “그래서, 어디로 갈 건데?”  “에, 에?”    갑자기 자신에게 바통이 내밀어지자 금발의 여자아이는 까만 두 눈을 깜빡일 뿐 제대로 반응하지 못했다. 에트리아스는 창문에 다시 커튼을 치는 미엘을 바라보며 한 번 더 말했다.    “싫으면 말아.”          햇빛이 나뭇잎사이로 광선처럼 한줄기 선을 그리며 떨어졌다. 맑은 날이었지만 무성한 나뭇잎 아래는 빛이 닿지 않아 아직 어둑어둑했다. 상록수 숲 특유의 촉촉하고 상쾌한 공기가 가득한 오솔길을 조금 기묘한 일행이 걷고 있었다. 선두에는 파티장이라도 나온 듯 화려한 남성용 예복의 여자아이. 콧노래를 흥얼흥얼, 지팡이를 빙글빙글 돌리며 걸었다. 그녀의 뒤로는 화사한 금발의 소년, 소녀가 커다란 바구니를 들고 웃음꽃을 피웠다. 소년의 가슴 정도밖에 안 오는 작은 소녀는 복슬복슬한 곱슬머리 위에 보닛을 쓰고 하얀 나들이 원피스를 팔랑이며 걸었다. 그녀의 조잘거림에 대꾸하는 소년은 남자아이치고 큰 키가 아니었지만 주변에 온통 고만고만한 키의 여자아이들뿐이었기 때문에 껑충하게 머리가 위로 솟아있었다. 그리고 그런 소년의 뒤에 바짝 붙어 느릿한 걸음으로 전체의 속도를 늦추고 있는 것이 그의 동생. 손가락이 하얗게 될 만큼 소년의 옷을 꼭 쥐고 걸었다. 그리고 그들 모두와 떨어져 같은 일행이라 하기엔 멀고 모르는 사람이라고 치기엔 애매한 거리에 초록빛 숲속에서 눈에 확 들어오는 선홍빛의 소녀가 뒤를 따랐다. 평범하진 않았지만 즐거운 무리. 앞서 걷는 여자아이의 흥얼거림이 뒤쳐진 소녀의 귀에까지 들려왔다. 햇살은 따스하고 그늘은 서늘한 기분 좋은 나들이.    “마스터, 어디까지 가는 건가요?”    금발의 소년, 시안이 물었다.    “갈 수 있는 곳까지.”    흥얼거리던 박자에 맞추어 선두를 걷던 여자아이, 미엘이 대답했다.    “나 힘들어.”    시안에게 찰싹 붙어 걷던 시엘이 그의 귀에 작게 속삭였다.    “꽤 머네요.”    흰 원피스 자락이 하늘거렸다.    “적당히 쉬었다 가는 게 어때?”    붉은 입술을 빠끔거리며 에트리아스가 중얼거렸다. 앞서 걷는 다른 일행은 아무도 그녀의 목소리를 듣지 못했으나 미엘만은 정확하게 알아듣고 그녀의 말에 대꾸했다.    “안 돼, 안 돼, 이제 얼마 안 남았어. 엘이 너, 시안이한테 땡깡 피우면 혼난다?”  “흥.”    시엘은 와락 시안의 팔을 끌어안았다. 시안이 넘어질 뻔하며 작은 소란이 일어났고 소녀의 까르륵하는 맑은 웃음소리가 공간을 울렸다. 흥얼흥얼흥얼, 노랫소리와 함께 흔들리는 나뭇가지들이 그들을 바라보고 있었다.          거대한 나무가 있었다. 끝이 보이지 않을 만큼 하늘 높은 곳까지 가지를 높고 넓게 펼치고 있었다. 나뭇잎이 무성했고, 그 둘레는 평범한 성인 남성 30명이 손에 손을 잡고 둥글게 서도 모자랄 것 같은 굵은 줄기를 가지고 있었다. 하늘을 떠받힌다는 전설 속의 나무처럼 엄청난 크기. 번듯한 집 한체가 안에 들어앉아있대도 믿어버릴 것 같은 나무를 미엘은 살며시 쓰다듬었다. 사랑하는 이를 만지듯 부드러운 손길이 차가운 나무껍질을 스쳤다. 소녀의 입가에 엷게 미소가 스며든다. 그녀는 휙 돌아서 돗자리를 깔고 바구니에 담아온 것들을 펼치기에 바쁜 세 사람의 옆에 털썩 주저앉았다.    “말했는지 모르겠는데 앞으로도 이 이상 넘어가면 안 돼. 다들 기억해둬.”  “왜?”    모두를 대표해 시엘이 물었다. 나머지 두 사람 역시 묻는 듯한 눈으로 미엘을 바라보았다. 미엘은 대답 대신 얼굴 가득 함박웃음을 머금었다. 그녀의 입에는 어느 샌가 아직 꺼내지도 않은 샌드위치가 물려있었다. 뒤늦게 그 사실을 알아차린 시안이 한마디 했다.    “그 것만 꺼내신 거예요? 안을 다 뒤집어놓으신 건 아니죠?”  “이거 맛있다.”  “다행히 괜찮아요. 하여간 못 말리는 사람이라니까요.”    금빛 고수머리의 소녀가 한숨을 쉬며 고개를 살래살래 저었다. 물론 미엘에게 아무 소용이 없다는 것은 당연한 일이었다. 그녀는 그저 깔깔깔 한번 웃어주고는 맛있게 샌드위치를 씹을 뿐이었다. 소녀도 그녀의 미안해하는 모습 같은 것은 전혀 기대하지 않았던지 뾰로통한 표정으로 하던 일을 계속했다.    “에티, 에티도 와서 좀 먹어봐. 맛있어.”    에트리아스는 부산한 다른 일행과는 달리 아직도 멀리 길 위에 서서 홀린 듯 한 표정으로 나무를 바라보고 있었다. 미엘은 즐거워 보이는, 그리고 조금은 오만한 미소를 입가에 걸치고 그녀의 목소리도 듣지 못한 듯 보이는 에트리아스를 지긋이 응시했다. 후後좌左우右에서 조잘거리는 대화를 배경음악삼아 사랑스러운 그녀의 인형을 감상한다. 언제나 싱그러운 푸른색으로 가득한 미엘의 숲에서 흰색과 붉은색으로만 치장된 인형은 이질적이지만 눈부시게 빛이 났다.    ‘아름다워.’    취할 듯 강렬한 풀잎의 향기가 와인의 향을 대신해서 감상에 흥을 더했다. 목으로 넘어가는 매끄러운 감각은 안타깝지만 샌드위치로 대신했다. 향기와 입안에 넣을 것. 미엘이 감상 시 필수로 여기는 두 가지였다. 무엇을 볼 때든 그것만은 잊지 않았다.    “이거, 맛있다.”  “엘아, 안된다니까!”  “그렇지만 맛있어.”  “그냥 다 꺼내놓을까요?”  “그게 나을지도……, 하하하.”    시안들은 먹느라 정리하느라 소란스러웠다. 샌드위치를 다 먹은 미엘은 가볍게 어깨를 으쓱하고는 다시 자리를 털고 일어났다. 타박타박 걸어 에트리아스의 앞에 섰다. 그녀는 눈에 보이지도 않는 지 시선을 위로만 향하고 있는 에트리아스의 뺨에 손가락을 얹었다. 뺨보다 뜨거운 손의 감촉에 에트리아스가 놀라 시선을 정면으로 떨구었다. 결코 기분좋아보이지는 않는 미소가 에트리아스를 향하고 있었다. 배회하던 시선이 미엘의 그 것과 얽히고, 소녀는 그대로 얼어붙었다.    “사랑하는 에티. 나의 에트리아스.”    미엘의 입술이 작게 벌어졌다 다물어지며 달콤한 음성을 자아냈다. 범하는 것 같이 뜨겁고 은밀한 시선이 소녀의 온 몸을 훑었다.    ‘미소. 불쾌함이라는 감정을 드러내기 위한 표정.’    미엘의 두 손이 에트리아스의 뺨을 감쌌다. 붉은 미소가 더욱 진해지고 초점을 붙들린 에트리아스의 눈에 미엘의 얼굴이 선명하게 비쳤다.    “훅.”    자연스럽게 벌어진 입술 사이로 숨결을 불어넣었다. 미엘의 웃음이 베시시 즐거운 듯 변했다. 불쾌한 감정은 사라지지 않았지만 조금은 장난스러운 미소. 미엘의 손이 움찔 떠는 에트리아스의 어깨를 붙들고 혀가 아랫입술을 핥았다. 소녀는 몸을 물리는 에트리아스를 눌러 잡고 그대로 입술을 붙였다. 반항 없이 입술이 벌어지고 미엘의 혀가 에트리아스의 입안을 휘저었다.    “읏.”    피부가 맞닿았다 떨어지며 생기는 츗, 하는 소리가 났다. 미엘이 곤란한 듯 당황한 듯 혼란한 듯 어색한 얼굴의 에트리아스를 끌어안았다. 도닥도닥 등을 쓰다듬는 손길이 다정하기만 했다. 얼어붙은 에트리아스를 소중하게 끌어안고 있었다.    “자, 함께 소풍을 즐겨야지?”    발랄한 목소리가 고막을 울렸다. 어느 샌가 숨이 막힐 듯 강렬한 시선은 사라지고 없었다. 미엘은 방긋 웃으며 얼떨떨한 상태의 에트리아스를 끌고 돗자리로 돌아왔다. 금발의 여자아이가 밝은 목소리로 두 사람을 맞았다. 숨차게 떠드는 소리, 즐거운 웃음소리, 맛있는 간식. 즐거운 소풍이었다. 평소와 같이 즐거운 소풍이었다.          미엘은 아이의 서투른 콧노래가 마음에 드는 지 기분 좋은 표정이었다. 에트리아스는 굳이 불쾌한 표정을 감추지 않았다. 시안과 시엘은 이미 돌아가 자리에 없었다. 남은 것은 금빛 고수머리를 흰 옷자락과 함께 펄럭이며 가볍게 춤을 추고 있는 작은 소녀. 그리고 그 것을 그늘아래서 지켜보고 있는 미엘과 에트리아스 뿐이었다.    “참 용하지 않아, 에티?”    잔뜩 애교를 부린 귀여운 목소리였다. 한껏 기분이 업 되었을 때나 내는 교태어린 목소리였다.    “무슨 생각을 하는 거야.”  “아무것도? 그냥 구경중이야. 켈이가 저렇게나 귀여운걸.”  “…….”    손톱이 길었다면 좋았을걸. 미엘이 중얼거렸다. 손마디가 하얗게 질릴 정도로 꼭 움켜쥔 에트리아스의 한 손을 어루만지며 한 말이었다. 애매하게 일그러진 발그레한 뺨에 사랑스럽게 키스를 남긴다. 입맛을 다시듯 자신의 입술을 혀로 핥아내는 모습이 지독히도 사랑스러웠다. 천사의 목소리로 노래하던 소년의 어설픈 허밍이 귓가를 울리고 있었다. 금빛 저녁햇살에 물든 소녀의 하이얀 드레스가 꿈결처럼 아득했다. 그 어느 곳에 있어도 배경과 분리되어 그림자를 드리우던 아이는 그가 좋아하던 소녀와 같이 숲속에 자연스럽게 녹아 환하게 빛나고 있었다. 흑과 백, 색채라고는 보이지 않던 작은 신체는 온갖 빛깔에 둘러싸여―.    “있을 수 없는 일이잖아.”  “어째서? 이미 그렇게 되어 있는데.”  “그런.”    계속 말하려는 에트리아스의 입술에 미엘의 손가락이 가볍게 와닿았다. 쉿, 작게 속삭인 미엘은 너무도 즐거워 보이는 미소를 띄고 있었다.    “분명히 그날 리히트는 죽었어.”  “…….”  “하지만 사라진 건 리히트가 아니지.”  “…….”  “지금 저기에 리히트가 있잖아.”  “…….”  “죽은 사람과 사라진 사람이 언제나 같은 건 아니야. 적어도,”    미엘이 세상을 다 얻은 것 같이 행복하게 온 얼굴로 방긋 웃었다.    “꿈속에서는 말이지.”    소년은 붉은 노을아래서 금빛으로 빛나는 머리칼을 흩날리며 하얀 원피스 자락을 가녀린 손가락으로 붙든 체 살랑거리는 바람과 함께 춤을 추었다. 흐릿하게 들려오는 음정이 맞지 않는 노래는 사람이 부르는 것이라고는 믿어지지 않는 신비한 목소리로 연주되고 있었다. 눈웃음 치고 있는 오른쪽 눈은 동공의 부재로 까만 유리구슬 같았다. 나무들이 그의 춤에 맞추어 우수수 소리를 냈다. 까르륵 하는 작은 웃음소리가 섞여들었다.    소년과 소녀가 있었다. 소녀는 세상의 사랑을 받아 반짝거렸다. 소년은 그런 소녀를 세상보다 더 사랑했다. 사람이 소녀를 시기해 칼을 들었다. 하늘이 울던 그날 소녀의 심장이 멈추었다. 소년은 자신의 심장을 소녀에게 주기로 했다. 하지만 끊어진 운명의 실은 다시 이어지지 않아서, 소년은 소녀만을 되찾기로 했다. 그래서 소년은 소녀가 되었다.  그날 소녀는 죽었다. 그날 소년은 사라졌다.    “이야기는 아직 끝나지 않았어. 그렇지, 에티?”    에트리아스는 작게 고개를 끄덕였다.

#결계안에서는 #임중백가몽

 
Read more...

from 사랑하는 당신에게

오랜만이에요, 당신. 벌써 한 계절이 지나버렸네요. 저는 그 사이에 긴 휴식을 취했습니다. 많이 지쳐있다는 걸 몰랐나봐요.

사랑하는 당신. 당신은 어떤가요? 내가 없는 사이 많은 일이 지나갔겠죠. 그 일들이 당신에게는 어떤 의미였을까요.

제게도 많은 일들이 지나갔습니다. 하지만 돌이켜보면 제대로 기억이 나지 않아요. 편지는 커녕 일기조차 쓰지 않았으니 돌아볼 기록도 존재하지 않네요. 그런 때도 있는 거겠죠.

요즘의 저는 어린 시절의 취미를 되찾았습니다. 커다란 사람 모양의 인형들과 함께 시간을 보내고 있어요. 눈을 맞추고 손을 붙잡고 있으면 잊고 있던 자신을 돌려주는 친구들이에요.

당신에게는 그런 친구가 있나요? 생각해보면 꼭 인형이 아니라도 제게는 친구들이 모두 그런 존재인 것 같아요. 삶에 떠밀려 잊고 있던 나 자신을 되찾아주고 다시 상냥함을 갖추게 해주는 존재요.

당신에게 그런 존재가 되면 좋겠다는 작은 희망을 품어봅니다.

2024년 8월 23일 금요일. 이제서야 겨우 여유를 찾은 당신의 속삭임.

 
Read more...

from 잃어버린 섬

“안아.”

그녀는 나를 그렇게 불렀다.

“안아, 안 자?”

“벌써 여섯시인걸요. 아침이에요.”

얇은 베일처럼 겹겹이 깔린 어슴푸레한 새벽의 어둠이 가볍게 흔들렸다. 거의 걷혀가는 새벽의 자취가 이 공간의 지배자에게 보일 수 있는 유일한 경외의 표시였다. 다만 안타까운 것은 정작 경배를 받은 그녀 본인이 전혀 눈치를 채지 못했다는 것이다.

“여섯시? 우, 그럼 한참 꿈나라에서 헤엄치고 있을 시간이잖아.”

그녀는 잠에 취해 비틀거리며 나를 향해 다가왔다. 한손으로는 늘 그녀의 침대에 뒹굴고 있는 강아지 인형을 끌어안고 나머지 한손으로는 눈을 가리고 있는 상태였다. 정오가 되어도 한밤중처럼 캄캄한 그녀의 방에 비하면 이미 하루가 시작된 이 곳, 거실은 눈이 부신 것이 당연했다. 나는 읽던 책을 내려두고 일어나 그녀의 어깨를 붙잡았다.

“그럼 다시 방으로 가요. 좀 더 자고 이따가 일어나세요.”

“우우.”

그녀는 투정부리듯 고개를 흔들었지만 달래면서 한 발짝 내딛자 눈앞의 풍경이 바뀌어 있었다. 방금 전까지는 환하게 빛이 들어오던 거실이었는데 지금은 어둑한 복도에 자리한 그녀의 방문 앞이었다. 집안의 다른 이들에겐 열리지 않는 비밀의 문 정도로 알려져 있는 방이지만 사실은 그녀의 침실. 그것도 지금같이 인간의 모습을 하고 있을 때는 물론 그녀가 본체로 돌아갔을 때도 편히 쉴 수 있도록 준비해둔 특별한 장소였다. 문이 열리자 바깥과는 완전히 다른 공간인 듯 끝이 보이지 않는 아득한 어둠이 눈에 들어왔다.

“정말 깜깜하네요.”

“졸려-.”

나는 바로 방의 윤곽도 보이지 않을 만큼 어두워서 방이 아니라 문 너머로 구멍이 뚫린 듯한 그곳에 차마 발을 들이지 못했다. 하지만 그녀는 전혀 거리낌 없이 자연스럽게 문턱 안으로 발을 들여놓았고, 그녀가 내 손목을 잡고 있었기 때문에 나 역시 따라 들어갈 수밖에 없었다. 방안은 말 그대로 한치 앞도 보이지 않는 상태. 문에서부터 그녀의 침대까지 이르는 긴 직선상에 부딪칠만한 물건이 없어서 다행이었다. 그녀는 이불 속으로 기어들어 가면서도 내 손을 놓지 않았다.

“저 이만 가볼게요.”

“싫어, 옆에 있어.”

거의 잠에 빠져든 상태인 듯 웅얼거리는 목소리로 그녀가 말했다. 그녀는 내 손을 더욱 끌어당겨 아예 인형과 함께 품에 안았다. 난 완전히 침대위에 걸터앉게 되어버렸다. 놓아달라는 의미로 그녀의 손을 톡톡 두드려보았지만 그녀는 모르는 척 새근새근 고른 숨소리를 내었다.

“자는 척이라니, 어린애처럼 굴지 마세요, 마스터.”

조용히 불러 보아도 그녀는 꼼짝도 하지 않았다. 괜히 웃음이 나왔다. 아무것도 보이질 않아 어쩔 수 없이 그녀의 머리를 찾아 침대를 더듬었다. 그녀가 자면서 신경 쓰이지 않도록 얼굴을 덮은 머리카락을 정리했다. 머리카락을 정리하고 마지막으로 그녀의 이마를 쓸어 넘기는데 갑자기 강한 힘으로 손을 붙들고 있던 팔이 느슨해졌다. 나는 몸을 일으켰다. 끝까지 소매에서 떨어지지 않는 손을 조심스레 잡아 그녀의 가슴 위에 올려놓았다.

“이따가 낮에 일어나면 다시 손 잡아드릴게요. 그러니까 지금은 참으세요.”

당연히 대답은 없었다. 나는 그녀의 이마에 가볍게 키스를 남기고 방을 나왔다. 언제나 그랬지만 이 방은 빠져나갈 때는 정체를 알 수 없는 은은한 빛이 나갈 길을 비추어 주었다. 마치 어느 누구의 접근도 반갑지 않다는 듯 들어오는 이에겐 인색하고 나가는 이에겐 후한 방이었다.


시안이 나가고 문이 닫히자 방안의 풍경이 바뀌었다. 문과 문턱이 맞닿고 ‘잘각’하는 소리로 바깥 공간과 완전히 격리되었음을 깨달은 방이 자신의 본 모습을 드러낸 것이다. 그러나 갑자기 방의 크기가 변하거나 벽지, 가구가 바뀌는 등의 큰 변동은 아니다. 방안에서 변한 것은 단 한 가지. 갑자기 나타난 것인지 단순히 커튼에 가려 있었는데 너무 어두워서 눈치 채지 못한 것인지 모를 작은 창문이 나타났을 뿐이었다. 창밖의 풍경은 집안의 다른 장소와는 다르게 한밤중이었다. 어두운 푸른 하늘에 달과 별이 촘촘히 박혀 있었다. 맑고 깨끗한 빛이 창문을 통해 들어와 갖가지 잡동사니로 가득한 수납장을 비추었다. 무대 위로 스포트라이트가 떨어지듯 곧은 직선을 그리며 들어온 달빛이 가장 환하게 빛나는 방의 구석에 ‘그녀’또래로 보이는 한 소녀가 서있었다.

소녀는 달빛을 받아 붉고 시리게 빛났다. 붉었다. 소녀의 선명한 선홍색 머리카락은 귀를 덮고 좁고 가녀린 어깨를 만나 갈라졌지만 남은 머리숱만으로도 풍성해 어깨마저 덮고 빈약한 가슴과 등을 타고 흘러내려 통통한 엉덩이와 허벅지, 종아리를 지나 마침내는 바닥에 흩어져버렸다. 어둠 속에서 보아도 눈이 아플 만큼 자극적인 붉은색이 달빛을 받아 소녀의 전신을 감싸고 반짝였다. 가만히 달을 응시하는 그녀의 동그란 두 눈, 그것을 감싼 풍성한 속눈썹과 눈 위의 곧고 짙은 눈썹도 같은 빛이었다. 그뿐이 아니었다. 밀랍인형 만큼이나 창백한 그녀의 피부 위에도 머리카락만큼이나 붉은 곳이 있었다. 화장기라곤 전혀 없는 소녀의 양 뺨은 한눈에 띌 만큼 발그스름했고 앙다문 입술은 립스틱을 바른 아가씨의 입술보다도 붉었다. 붉은 빛에 가려져 거의 보이지 않는 여린 몸뚱아리엔 소녀의 피부만큼이나 하얀 민소매 원피스 한 장만이 걸쳐져 있었다. 그것은 마치 소녀의 붉음이 더욱 붉어 보이도록 배경으로 깔아놓은 흰 도화지 같았다.

건조한 무표정과 미세한 움직임조차 없는 모습은 소녀를 살아 있는 생물이 아닌 것처럼 느끼게 했다. 얼핏 보기엔 숨도 쉬지 않는 것 같아 보이지만, 자세히 살펴보면 느린 박자로 가슴이 오르락내리락 하고 있음을 알 수 있었다.

“댕-. 댕-. 댕-.”

창 너머 먼 곳에서 출처를 알 수 없는 종소리가 들려왔다.

“댕-. 댕-. 댕-.”

느릿하게 퍼지는 종소리의 여운은 이미 깊은 잠에 빠진 아이에게 이불을 덮어주듯 방안을 포근하게 감싸주었다.

“댕-. 댕-. 댕-.”

종소리 사이로 뭔가 다른 소리가 들렸다.

‘일어나’

숨소리 같은 속삭임.

“댕-. 댕-. 댕-.”

“지금이야.”

마지막 종이 울리자마자 들린 것은 조금 전의 환청 같은 소리와는 달랐다. 들릴락 말락 작게 속삭이는 것은 같았지만 분명 방안에서 들려온 것이었다. ‘그녀’의 목소리는 아니었다.

“시작했다.”

붉은 빛의 소녀였다. 소녀의 작은 입술이 달싹였다.

“계속 자고 있을 건가.”

“움…….”

그녀가 몸을 뒤척이더니 옆으로 돌아누웠다. 소녀에게 등을 보이는 방향이었다. 그녀는 뭔가 불편한 듯 얼굴을 찌푸린 체 강아지 인형을 꼭 껴안았다.

“그렇군.”


소녀는 사라졌다. 처음 나타나서 내내 그림같이 한자리에 서 있던 소녀는 말을 끝내자 아무런 낌새도 없이 그대로 사라져버렸다. 방안의 풍경은 붉고 커다란 점이 사라졌다는 것을 제외하고는 바뀐 것이 없었다. 어느 샌가 창에는 속이 비치는 얇은 커튼이 쳐져 있었다. 그녀는 조금 더 어두워진 방안이 마음에 들었는지 행복한 미소를 띠고 편안히 잠들어 있었다.

#결계안에서는 #임중백가몽

 
Read more...

from 잃어버린 섬

붉은 머리를 땅에 끌릴 정도로 길게 기른 창백한 소녀. 길을 잘못 들어 미로에 빠진 당신에게 뜬금없는 질문을 던집니다.

“떠날거야?”

끝없는 미로를 헤매다가 지친 당신은 알 수 없는 직감으로 그에게 대답합니다. 아니오, 라고.

“좋아. 그럼 안내해줄게. 그녀의 꿈 속으로.”

하얀 발이 수풀을 밟고 먼저 나아갑니다. 뒤로 길게 이어지는 붉은 머리칼을 따라 당신은 섬의 깊은 곳으로 향하게 됩니다…


에트리아스 나이미어Etrias Neimir

잃어버린 섬을 지키는 결계석. 결계석을 지키는 외로운 붉음.

소녀는 창백한 뺨에 붉은 입술과 머리칼을 가지고 있습니다. 무표정한 얼굴은 몹시 지친듯해요. 목소리는 작고 거의 어조의 변화가 없습니다. 맨발에 하얀 원피스를 입고, 수풀 속을 소리도 없이 걷지요.

소녀는 그녀의 그림자입니다. 꿈의 가장 깊은 곳에서 고통을 감당하고 있지요. 동시에 섬을 둘러싼 결계, 즉 당신이 헤매던 미로를 관리하는 관리자입니다. 실수로 들어선 이들을 가로막아 나가지도 들어가지도 못하게 하는 게 소녀의 일이에요. 섬으로 들어가길 원하는 이들만이 소녀의 안내를 받아 섬 안으로 들어갈 수 있습니다.

그러나 이 섬은 꿈 속에 떠있는 섬. 언제까지 계속될 수 있을까요? 어디까지가 진실일까요?

평화로운 일상은, 과연 어디로 향하는 걸까요.

“발을 들인 이상 빠져나갈 수는 없어.”

소녀는 조그맣게 속삭입니다.

#결계안에서는

 
Read more...

from 사랑하는 당신에게

사랑하는 당신께. 저는 지금 당신에게 편지를 쓰고 있습니다. 그렇다는 건 다른 일을 하고 있지 않다는 뜻이기도 하지요. 무슨 말이냐면, 저는 지금 공부를 미루고 있습니다. 네, 도피형 편지예요.

하지만 들어보세요.

오늘 날이 참 좋습니다. 맑다 못해 더울 정도로 좋아요. 햇빛 아래 있으면 뜨거워서 버틸 수 없을 지경입니다. 벌써 여름이 오고 있다고요. 아직 5월도 되지 않았는데요. 즉, 지금 제가 있는 이곳은 한창 환절기입니다.

환절기가 어떤 때인가요. 마음이 싱숭생숭 흔들려 아무 이유 없이 설레거나 심란해지곤 하는 때입니다. 그런 시기에, 제 마음이 어떻겠어요. 생각해보세요. 가만히 앉아서 공부나 하기에는 너무 힘든 날이란 말이에요.

물론 변명입니다. 알고 있어요. 미루기는 하지만 할 거예요. 할 거라고요. 그래도 당신과 조금만 수다를 떨고 싶어요. 이 정도는 괜찮죠?

사랑스런 당신. 저는 오늘 식사를 대충 해치워버렸습니다. 아침과 점심 두 끼니를 말이죠. 아침에는 샐러드 야채만 잔뜩. 점심에는 베이글. 이렇게 말이에요. 그리고 중간에 간식을 두 번이나 먹었습니다. 달달한 것들로만 먹었지요. 딸기청을 부은 요거트와 초콜릿바예요. 주말이라고 이렇게 대충 때우면 안 되는데 싶으면서도 맛있었으면 됐다는 안일함이 올라와요. 건강을 지키는 게 이렇게나 어렵습니다.

그러고보니 오늘 드디어 친구와 스터디를 시작했어요. 가볍게 하는 스터디지만 함께 공부한 성과를 나누는 것이 즐거웠습니다. 나누는 과정에서 얻는 것도 있었고요. 앞으로도 빠듯한 시간이지만 잘 쪼개서 함께 공부해나가려고 해요.

초록빛이 어여쁜 요즘입니다. 비록 햇살은 뜨겁지만 밖에 나가서 걷는 게 기분 좋아요. 공기만 맑으면 완벽한데 조금 아쉽습니다. 당신 날이 저물면 산책을 나가보세요.

당신의 매일이 푸른 잎사귀처럼 언제나 푸르르길 바라며.

2024년 04월 27일, 당신과 함께 걷고픈 속삭임이.

푸른 잎사귀

 
Read more...