빛은 어둠 속에서 길을 잃은 이들에게 얼마나 큰 위로가 될 수 있을까...?

최은영 작가의 "아주 희미한 빛으로도"는 이 질문에 대한 답을 찾아가는 여정을 담고 있다. 이 책은 가족 관계, 선후배간의 일상적인 관계속에서 찾아볼 수 있는 그릇된 사회적 통념, 가슴 아픈 한국 근현대사의 사건들로부터 생기는 개개인이 겪는 어려움과 슬픔을 담담하게 풀어내고, 그들의 삶 속에서 발견되는 작은 희망의 빛을 섬세하게 그려낸다. 나는 여러 단편 소설로 구성된 이 작품집을 읽으며 다양한 인물들의 목소리를 통해 작가가 우리에게 전하고자 하는 깊은 울림을 전달받을 수 있었다.

 

“희원씨가 앞으로 겪을 일들을 그런 식으로만 생각하지 않았으면 좋겠어서.”

그녀의 말이 내게는 자격지심이나 피해의식을 갖지 말라는 충고로 들렸다. 그런 식의 생각이 얼마나 어리고 미성숙한 것인지 왜 모르냐는 채근으로 들렸다. 나는 내가 그런 어린애가 아니라고 항변하고 싶었지만 어떻게 말해야 하는지 알수 없어서 그녀의 말에 그다지 타격을 입지 않았다는 듯이 선선히 고개를 끄덕였다.

 

소설 속 인물들은 각자의 일상 속에서 다양한 형태의 슬픔을 가지고 있다. 그러나 그들의 이야기는 단순히 고통에 그치지 않고, 그 속에서 피어나는 작은 희망과 연대의 순간들을 담아낸다. 또한, 주인공이 처음엔 이해하지 못했던 것이, 나중에 본인이 그 위치가 되고나서야 상대의 마음을 깨닫는 순간이 온다. 젊은 강사와 그를 동경하는 희원의 이야기, 교지편집부에서의 첨예하게 대립하는 해진과 희영, 정윤의 이야기, 인턴 다희와 정규직 주인공. 이들은 결국 서로의 입장에 대한 나름의 상처를 안고 있지만 끝내는 서로를 말없이 응원하고, 이해해주게 된다. 이야기 과정에서의 섬세한 문체와 따뜻한 시선은 나로 하여금 자신의 삶을 돌아보고, 그 속에서 작은 빛을 발견하게 만들었다.

 

가끔은...... 제가 커다란 스노볼 위를 기어다니는 달팽이 같아요. 스노볼 안에는 예쁜 집도 있고, 웃고 있는 사람들도 있고, 선물꾸러미도 있고, 다들 행복해 보이는데 저는 그걸 계속 바라보면서 들어가지는 못해요. 들어갈 방법도 없는 것 같고.

그녀는 어떻게 답해야 할지 몰라 말성이다 입을 열었다.

다희씨는 합격하겠지만, 아니더라도 더 좋은 곳에 갈 수 있다고 생각해요.

그 말을 뱉었을 때, 그녀는 뭔가가 잘못되었다는 것을 느꼈다.

변명을 하고 싶어 망설이는 동안 다희가 말했다.

선배는 빈말 안 하는 사람이라고 생각했어요.

 

"아주 희미한 빛으로도"는 희망과 회복의 가능성을 조용히 이야기한다. 이 책의 등장인물들은 고유한 상처와 아픔을 간직하고 있지만, 그 속에서도 희망의 빛을 잃지 않는다. 최은영 작가는 인물들이 어려움을 극복해 나가는 과정을 통해 우리에게 눈물과 함께 용기를 준다. 그들의 이야기를 따라가다 보면, 아무리 작은 빛이라도 그 빛이 우리의 길을 밝혀 줄 수 있다는 깨달음을 얻는다.

최은영 작가 특유의 문체는 이 책을 더욱 특별하게 만들어주었다고 생각한다. 그녀의 문장은 시적이고, 때로는 서정적이다. 복잡한 감정을 간결한 문장 속에 담아내는 그녀의 능력은 독자로 하여금 깊이 공감하게 한다. 특히 그녀의 비유와 은유는 나의 상상력을 자극하고 작품 속으로 더욱 빠져들게 했다. 마치 한 폭의 수채화처럼, 그녀의 문장은 부드럽고도 생생하게 독자의 마음을 물들인다.

"아주 희미한 빛으로도"는 현대 사회를 살아가는 우리에게 중요한 메시지를 던진다. 우리는 종종 삶의 고통 속에서 절망에 빠지기 쉽지만, 이 책은 그런 순간에도 희망을 잃지 말라고 속삭인다. 최은영 작가는 우리에게 아주 희미한 빛이라도 그 빛이 우리를 더 나은 곳으로 이끌 것이라고 말하는 것 같았다. 그녀의 글을 읽다 보면, 그 희미한 빛이 주는 따뜻함과 안도감을 느끼게 된다.

결론적으로, "아주 희미한 빛으로도"는 우리가 일상에서 겪게되는 상처의 깊이를 탐구하고, 그 속에서의 희망을 일깨워주는 작품이다. 이 책은 모든 이에게, 특히 삶의 고난 속에서 희망을 찾고자 하는 이들에게 커다란 위로와 용기를 줄 것이다. 그녀의 이야기는 우리 마음 속에 작은 등불을 켜주며, 그 빛이 우리의 삶을 조금 더 밝게 비춰줄 것이다.

 

나와 닮은 누군가가 등불을 들고 내 앞에서 걸어주고, 내가 발을 디딜 곳이 허공이 아니라는 사실만이라도 알려주기를 바랐는지 모른다. 어디로 가는지 모르지만, 적어도 사라지지 않고 계속 나아갈 수 있다는 걸 알려주는 빛, 그런 빛을 좇고 싶었는지 모른다. 그리고 나는 그 빛을 다른 사람이 아닌 그녀에게서 보고 싶었다. 그 빛이 사라진 후, 나는 아직 더듬거리며 내가 어디까지 왔는지 어림해보곤 한다. 그리고 어디로 가게 될 것인지도. 나는 그녀가 갔던 곳까지는 온 걸까. 아직 다다르지 않았나.

 

 

'독서' 카테고리의 다른 글

보건교사 안은영 (팬픽션)  (0) 2024.08.02
비행운  (0) 2024.07.27
이만큼 가까이  (4) 2024.06.09
재인, 재욱, 재훈  (0) 2024.05.18
피프티피플  (1) 2024.04.28

자바는 14버전부터 record라는 새로운 기능을 도입하여 데이터 객체(Data Object)를 보다 간결하고 명확하게 정의할 수 있게 되었다. 이번 포스팅에서는 record의 기본 사용법과 특징을 살펴보고, 기존의 DTO(Data Transfer Object)와의 차이점도 함께 알아보겠다.

record란 무엇인가?

record는 불변 객체(immutable object)를 쉽게 생성할 수 있도록 도와주는 자바의 새로운 타입이다. 주로 데이터 전달 객체(Data Transfer Object, DTO)나 값을 담는 컨테이너로 사용된다. record를 사용하면 클래스 작성 시 필수적인 반복 작업들을 자동으로 처리할 수 있다.

기본 사용법

다음은 record를 사용한 간단한 예제이다

public record Person(String name, int age) {}

위의 예제는 Person이라는 레코드를 정의한 것이다. Person 레코드는 두 개의 필드 name과 age를 가진다. 이렇게 정의된 레코드는 다음과 같은 작업들을 자동으로 처리한다.

  1. 필드 정의: String name, int age 필드가 자동으로 정의된다.
  2. 생성자: 모든 필드를 인수로 받는 생성자가 자동으로 생성된다.
  3. 접근자 메서드: name()과 age() 메서드가 자동으로 생성된다.
  4. equals() 및 hashCode(): 필드를 기반으로 한 equals() 및 hashCode() 메서드가 자동으로 생성된다.
  5. toString(): 필드 값을 포함하는 toString() 메서드가 자동으로 생성된다.

사용 예제

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);

        // 자동 생성된 메서드 사용
        System.out.println(person.name()); // 출력: Taeho
        System.out.println(person.age());  // 출력: 32
        System.out.println(person);        // 출력: Person[name=Taeho, age=32]
    }
}

커스터마이징

레코드 클래스는 커스터마이징할 수 있다. 예를 들어, 추가 메서드를 정의하거나 생성자를 커스터마이징할 수 있다.

public record Person(String name, int age) {
    // 추가 메서드
    public String greet() {
        return "Hello, " + name;
    }

    // 커스텀 생성자
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}

위 예제에서는 greet()라는 추가 메서드와 나이가 음수일 경우 예외를 던지는 커스텀 생성자를 정의하였다.

DTO와 record의 차이점

DTO(Data Transfer Object)와 record는 데이터 객체를 정의하는 데 사용되지만, 두 가지 방식에는 몇 가지 차이점이 있다.

  • 보일러플레이트 코드: DTO는 필드 정의, 생성자, getter/setter 메서드, equals(), hashCode(), toString() 메서드를 수동으로 작성해야 한다. 반면 record는 이러한 메서드들을 자동으로 생성하여 보일러플레이트 코드를 크게 줄여준다.
  • 불변성: DTO는 기본적으로 가변 객체(mutable object)로 설계되는 경우가 많다. 그러나 record는 불변 객체로 설계되어, 한 번 생성된 후 변경할 수 없다. 이는 멀티스레드 환경에서 안전성을 보장해준다.
  • 의도 표현: record는 데이터 객체의 의도를 명확하게 표현할 수 있으며, 데이터만 담고 있는 객체임을 쉽게 알 수 있다. 반면, DTO는 일반 클래스와 구별하기 어려울 수 있다.

 

결론

자바의 record는 데이터 중심의 클래스를 쉽게 정의하고 관리할 수 있게 해주는 강력한 도구이다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있다. DTO와 비교했을 때, record는 보일러플레이트 코드를 줄이고 불변성을 보장하는 등 여러 가지 장점을 제공한다. 앞으로 자바로 데이터 객체를 정의할 때 record를 적극적으로 활용해보자.


노래방에가면 녹음 기능이 있었는데 어릴 때 이걸 이용해서 친구들과 웃기는 노래들을 모아서 앨범으로 만든적이 있다.
반 친구들과 공유해서 들었는데 반응이 좋아서 2집, 3집까지 냈었다. `이만큼 가까이`는 그때의 기억들에 대한 유대감을 되살아나게하는 매력이 있는 책이다.
(가끔 친구들이 그 앨범을 그리워해서 자료를 찾는데 도무지 찾을 수가 없다..)

20대가 되고 나의 친한 친구들은 술을 잘 못마셨는데, 그 이유로 비교적 가볍게 즐길 수 있는 칵테일을 자주 마셨다.
당시 쌍용동에 있는 Wa bar에 자주 갔었는데, 화자가 비디오 영상을 수집하듯 친구들이 먹은 칵테일의 맛과 느낌을
최대한 노트북에 잘 정리하고자 노력했었다.
웃긴건 그걸 그 자리에서 실시간으로 칵테일 바 테이블에 노트북을 올려놓고 정리를 했다는 것이다 ㅋㅋ

그래서 칵테일을 먹을 때면 그 수집된 기록의 맛을 보며 추천을 해주곤 했다.

"블루 사파이어, 뭔가 상큼한 소다맛 같은거야 네가 저번에 맛있다고 했었네" 라고하면서 말이다.
그 중에서 내가 각별히 좋아했던 칵테일은 B-52였다. B-52는 폭격기의 이름에서 따온 것인데,
이름 그대로 강렬한 느낌을 그대로 살린 칵테일이라 할 수 있다.
초콜릿과 커피, 오렌지 리큐르가 들어가 있고 바텐더가 술을 내어주며 잔에 불을 붙인다,
불이 붙은 칵테일에 빨대를 넣고 한번에 빨아 마셔버린다. 그 화끈함에 상남자가 된 기분을 체험할 수 있다.
그 시절 단숨에 들이킨 칵테일에 몇초만에 7000원이 날아갔다고 생각한다면 하남자였다.

지난날을 회상해보면 마냥 이렇게 즐겁고 유쾌한 일들만 있었던 것은 아니었다.
고등학교 때는 참 힘든 시간을 보낸 경험도 있다. `주완`의 표현을 빌리자면 정말 나는 malfuntion했다.
기이한 표현이다. 기계에 쓰는 말인데, 이걸 사람한테 쓰자니 정말 문제가 있는 것처럼 느껴진다.
쉽게 털어놓기는 어려운 일이지만, 성인이 되고나서야 완전히 극복할 수 있었다.
스택오버플로우 개발자들의 표현을 빌려 요즘 나는 "It works for me." 라고 하고싶다. :)

나는 그런 상상을 해보았다. 화자 `나`는 `주완`이 죽은 것을 스스로에게 탓하는 장면이 있는데,
정말 다른 세계선이 있다 가정하고 '주완'이 다른 선택을 했으면 어땠을지에 대한 것이다.
가령 철망에 늘어진 채 처참해진 텁텁이를 보자마자 위기감을 느껴 도망을 갔다면?
애초에 떠돌이 개들을 찾아나서지 않았다면?
그랬다면 어쩌면 성인이 된 `주완`은 더이상 malfuntion하지 않았을지도 모른다.
"나는 나를 위해 잘 작동해~" 라며 과거일을 웃으며 이야기했을지도 모른다.
화자 `나`와의 관계도 더욱 발전하였을지도 모르고, 결국엔 조각가 부부 `인영`의 인정도 받아
함께 더블데이트를 즐겼을지도 모를 일이다.

내 과거를 떠올려보면 나는 소설 속 화자인 `나`이기도 했고, 한편으론 `주완`이기도하였고, `찬겸`이기도 하였으며 `민웅`이기도 했던 것 같다.
마음에 들었던 촉촉해지는 글귀들을 적고 글을 마무리 해야겠다.

 


귀가 뜨거워진 날은 후드를 쓰고 잤다.
비밀이 새어나가지 않도록, 머릿속의 따듯한 공기가 새어나가지 않도록.


"내 생각에, 인간은 잘못 설계된 것 같아."
"소중한 걸 끊임없이 잃을 수밖에 없는데, 사랑했던 사람들이 계속 죽어나갈 수밖에 없는데, 그걸 이겨내도록 설계되지 않았어."


사람 없는 정류장엔 풍선껌 향기만 남아 있었다. 익숙하면서도 이름을 알 수 없었다. 풍선껌 향기만 남겨놓은 사람이 누구일지 궁금했다. 어쩐지 아는 사람일 것만 같았다.

 


추가) 내가 지금까지 읽어본 정세랑 작가의 책과 같이, 여러가지 사회적 문제를 이야기한다.
이제와 생각한다면 사회에서 용인될 수 없는 행동들, 아동 폭력에 노출된 사람들과 애써 개입하지 않는 사람들이 그 예다.
사랑스러운 친구들과의 이야기 속에 잊어선 안 될 사회현상들을 잘 녹여내 우리에게 고민거리를 주시는 정세랑 작가님을 응원하게 된다 :)

 

★ ★ ★ ★ ★

 

 

'독서' 카테고리의 다른 글

비행운  (0) 2024.07.27
아주 희미한 빛으로도  (0) 2024.07.14
재인, 재욱, 재훈  (0) 2024.05.18
피프티피플  (1) 2024.04.28
[독서] 나는 매주 시체를 보러 간다  (0) 2024.04.01

https://www.acmicpc.net/problem/1520

2차원 Array가 주어졌을때 0,0에서 시작하여 상하좌우로 이동할 때, 항상 높은 값에서 낮은 값의 방향으로 이동 할 수 있는 모든 케이스에 대해 출력하라는 문제이다.

시간복잡도를 고려해야하는 문제로 dp를 이용해야한다.

dp를 이용하는 것은, 여러개의 경로를 계산하는 과정에서 중복된 경로를 고려해야 하기 때문이다.

 

 

/** 3번 내리막 길 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main{
    public static int N, M;

    static int graph[][];
    static int dp[][];

    static int[] dx = {0, 0, 1, -1};
    static int[] dy = {1, -1, 0, 0};

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        graph = new int[N][M];
        dp = new int[N][M];

        for(int i=0; i<N;i++) {
            for(int j=0; j<M; j++){
                graph[i][j] = sc.nextInt();
//                dp[i][j] = Integer.MIN_VALUE;
            }
        }
        sc.close();
/*
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String nm = br.readLine();
        N = Integer.parseInt(nm.split(" ")[0]);
        M = Integer.parseInt(nm.split(" ")[1]);

        graph = new int[N][M];
        dp = new int[N][M];

        for (int i = 0; i < N; i++) {
            nm = br.readLine();
            for (int j = 0; j < M; j++) {
                graph[i][j] = Integer.parseInt(nm.split(" ")[j]);
                // dp[i][j] = -1;
            }
        }

 */
        for (int i = 0; i < N; i++) {
            Arrays.fill(dp[i],Integer.MIN_VALUE);
        }
        System.out.println(dfs(0, 0));

    }

    public static int dfs(int x, int y) {
        if(x == N-1 && y == M-1) {
            return 1;
        }
        if  (dp[x][y] != Integer.MIN_VALUE) {
            return dp[x][y];
        }
        else {
            dp[x][y] = 0;
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (nx < N && nx >= 0 && ny < M && ny >= 0) {
                    if (graph[x][y] > graph[nx][ny]) {
                        dp[x][y] += dfs(nx, ny);
                    }
                }
            }
        }
        return dp[x][y];


    }
}

 

 

★★★☆☆

재인, 재욱, 재훈은 평범한(?) 삼남매이다.

가족과의 여행에서 형광빛이 나는 평범한 칼국수를 먹고는 각자만의 소소한 능력을 가지게 된다.

그 능력으로 각자들의 일상속에서 누군가를 구하는 일종의 SF장르의 소설이다.

 

다른 SF장르와는 달리 일상이 그 능력으로 인해 180 변화하거나, 그 능력이 초인적인 힘을 발휘하는 것도 아니다.

다소 특이한 능력정도다? 라는 느낌

나는 이러한 특징이 정세랑 작가님이 의도한 바일 것이라고 생각한다.

 

너무나도 사소한 초능력일지라도, 그들은 그 능력을 이용해 누군가들의 목숨을 구해낸다.

사실 현실에서도 위기와 위험에 빠진 이들을 구하기 위해 크게 대단한 초능력이 필요하지 않다.

나의 그저 소소한 관심과 마음만으로도 누군가에게는 커다란 긍정적 변화를 도출해낼 수 있다.

어쩌면 삼남매는 이런 능력이 아니었어도, 그들을 구해낼 수 있었을지도 모르겠다.

'독서' 카테고리의 다른 글

아주 희미한 빛으로도  (0) 2024.07.14
이만큼 가까이  (4) 2024.06.09
피프티피플  (1) 2024.04.28
[독서] 나는 매주 시체를 보러 간다  (0) 2024.04.01
쇼코의 미소  (0) 2024.03.25

50명의 사람들의 일상이 맞추어진 퍼즐처럼 엮여있는 책이다. 읽으면서 내 주변 사람들의 생각도 많이하게 되었는데,

내 가족, 친구, 회사 동료들은 나와 함께하지 않는 순간들에는 어떤 이야기로 살아가고 있을지도 상상하게 되었다.

사실 우리는 나를 중심으로 생활하고 생각하지, 내가 아닌 근처에 있는 타인의 삶을 이야기를 상상하기는 어렵고, 그럴 동기조차 없기 때문이다.

 

이호

슈크림 선생님이라 불리는 이호 할아버지는 내가 닮아가고 싶은 모습을 하고 있었다.

 '지금껏 너무 많이 가졌으니 잃어도 좋다'

비로소 스스로에 대한 만족과 행복을 느끼고 있는 사람이 할 수 있는 말이지 않을까 생각한다.

의사가 되고싶은 아이에게 운을 나누어주겠다며 악수를 청하는 할아버지,

나 또한 그런 여유를 가지고 살기위해 노력 해야겠다.

 

진선미

문영린 에피소드에서 진선미는 새엄마로서 등장한다.

또, 누군가의 아내로서 등장하며,

누군가의 고객이자, 함께 일하게 될 비즈니스 관계로 등장하게 된다.

사실 진선미라는 존재를 알게 되며, 이 사람에 대해 내가 기억을 못하는 것인지,

이 사람을 자세히 알아보기 위해(?) 책의 차례를 다시 되짚어보고 이름을 꼼꼼히 어디있는지 살펴보았지만 놀랍게도 꽤나 여러 이야기에 등장하는 것 치고는 본인의 에피소드가 수록되지 않는 인물이었다.

아마 진선미는 T일 것이고, 자유분방하며 나이스한 성격이다. 누구에게도 자신의 생각을 잘 전달할 수 있는 사람이고 자신의 단단한 가치관 아래 자유롭게 세상을 살아가는 진선미라는 인물은 굉장히 즐거워보인다. 지향하고싶은 삶을 가졌다고 해야할지..

특히 새엄마로서 매우 이성적인 어조로 조언하는 이야기는 나도 뜨끔하게 만들었다. ㅎㅎ

"마음은 내가 어떻게 해줄 수 있는 문제가 아니고 네가 크면서 해결해야겠지만, 몸무게 때문에 더 힘들면 그건 지금 해결해보자. 돈으로 못 빼는 살이 어딨니?"

 

이 책은 어 이사람 아는 사람인데..? 하고 그 사람이 다시 궁금해져 다시 책의 이곳저곳을 넘겨보게 만든다. 액자식 구성을 독자에게 맡긴 책 같다고해야 하는지 모르겠다. 개성있고 재미있게 읽고, 이러한 이유로 읽는데 참 오랜 시간이 들은 책이다. 인상깊었다! :)

 

 

그리고... 인물간의 관계도를 그려야 겠다고 생각을 하기도하였는데

똑똑한 독자들이 이미 만들어놓았다...

'독서' 카테고리의 다른 글

아주 희미한 빛으로도  (0) 2024.07.14
이만큼 가까이  (4) 2024.06.09
재인, 재욱, 재훈  (0) 2024.05.18
[독서] 나는 매주 시체를 보러 간다  (0) 2024.04.01
쇼코의 미소  (0) 2024.03.25

 

<그것이 알고싶다> 애청자이기도 한 나는 이 책의 저자가 법의학 분야에서 매우 저명한 사람인걸 알고 있었다. <그것이 알고싶다>에 출연하는 유성호 교수는 의학적인 측면에서 사인을 분석하고 시체에서 말해주는 이야기를 우리에게 전해주는 역할을 한다.

이 책은 일종의 어떠한 죽음을 맞이할 것인지 나의 죽음을 어떻게 준비할 것인지에 대한 고민거리를 던져준다. 대부분의 사람들은 죽음에 대한 준비 없이, 사회가 마련해둔 틀 안에서 맞이하게 된다. 50%를 초과하는 사람들이 본인의 집에서 죽기를 희망하지만, 대부분의 경우 별 준비없이 병원에서 의사가 생명연장을 시도하거나, 약물투여를 통해 연명하다가 죽게된다. 이게 정말로 우리가 바라는 죽음의 모습일까?

나는 지금까지 태어난 이후로 나의 죽는 과저에 대해서 진지하게 생각해본 적이 없다. 그 이유는 아마 죽음이라는 것 자체가 부정적이고, 회피하기 싫은, 거부감이 드는 단어라는 이유 때문일 것이다. 그러나 죽음은 사람으로 태어났으면 절대적으로 경험해야 할 피할 수 없는 것이다.

저자는 가족들에게 미리 자신의 장례가 어떻게 이루어졌으면 좋겠는지, 재산이나 금전적인 것은 어떻게 처리해야 할지 디테일하게 전달될수록 준비하는 가족들의 입장에서도 부담이 없고 좋다고 한다. 전혀 생각지도 못한 부분들이었기에 읽으면서 당황스러웠다. 내가 뇌사 상태에 빠진다면, 나는 그럼에도 불구하고 생명을 유지하기를 원할까...? 아마도 아닐 것 같다. 뇌가 죽었는데, 몸에 에너지만 공급해준들 그게 과연 나는 살아있다고 볼 수 있는걸까. 이러한 문제는 이를 결정할 가족들에게도 굉장히 부담스러운 딜레마로 다가올 것 같다는 생각이 들었다. 가족들의 선택에 따라 죽음이 결정되는 것은 너무 괴로운일 일테니까

책을 읽으며 죽음에 대한 여러가지 사회적 문제에 대해서도 깨닫게 되었다. 사람은 언제부터 사람으로서 인정받는 걸까? 엄마의 배속에서 나오는 순간? 수정란이 착상하는 순간? 이 밖에도 줄기세포에 대한 과학연구 분야의 윤리적 논쟁들.. 그뿐만이 아니다, 본인이 스스로 죽는 행동에 대해 어떠한 시각으로 판단해야 할지에 대한 것도 매우 심각한 이슈다. 내가 말하는 스스로 죽는 행동이란 치료를 해서 더 이상 의미있는 개선이 없을 것이라 판단 될 때 환자들이 본인의 운명을 선택하거나, 질병이 아니더라도 스스로의 환경에 대해 비관하고 죽는 행동을 의미한다.

미성숙한 생각이었다면, '본인의 선택인데 왜 문제인 걸까?'라고 되물었을지도 모른다. 그러나 책에서 설명한 사례와 연구에 따르면, 투신으로써 스스로 죽는 행동을 선택하였다가 살아난 사람의 인터뷰 내용으로 "그 순간, 나는 죽고 싶지 않았다"라고 말했으며, 고통받는 환자들이 안락사를 위해충분한 의사의 정신적 상담 및 동의를 구하고 스스로 죽는 행동을 위한 버튼을 제공했을 때, 결국 끝내 버튼을 누르지 못하는 자들은 약 60%가 넘는다고 한다. 사실 모두 죽고 싶어하지 않는다. 스스로 죽는 행동에 대해 우리는 단순히 본인의 선택이니 자유라거나, 종교적 이유로 어떠한 경우에도 절대 허용할 수 없다는 것은 사회적인 관점에서 본다면 지극히 1차원적 의견이며, 분명 그에 따른 부작용을 낳는 방향성일 것이다. 이러한 복잡한 인간의 존엄성, 생명에 대한 윤리적 문제는 국가마다의 국민들의 문화, 인식에 따라 달라지고 시대적 변화에도 민감하게 반응하여 끊임없이 변화한다.

나의 죽음은 어떻게 이루어져야 나의 마지막이 아름다울까, 그리고 만일 안락사가 고려해야 할 정도로 내가 극심히 고통받고 치유불가한 상태라면 어떤 선택을 해야 할까

'독서' 카테고리의 다른 글

아주 희미한 빛으로도  (0) 2024.07.14
이만큼 가까이  (4) 2024.06.09
재인, 재욱, 재훈  (0) 2024.05.18
피프티피플  (1) 2024.04.28
쇼코의 미소  (0) 2024.03.25

큐를 이용해서 구현하며, 기본적인 BFS 탐색 순서는 다음과 같다.

1. 큐를 하나 만든다

2. 시작할 노드를 넣는다

3. 시작할 노드를 꺼내고 출력한다

4. 인접한 노드를 큐에 넣는다

5. 이 때, 한번 큐에 넣었던 노드는 다시 큐에 넣지 않아야 한다

 

BFS 관련된 문제로 소스코드로 확인해보자

백준 토마토 문제이다.

https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main{
    public static int N, M, H;
    public static int[][][] box;

    public static int[] dx = {1, -1, 0, 0, 0, 0};
    public static int[] dy = {0, 0, 1, -1, 0, 0};
    public static int[] dz = {0, 0, 0, 0, 1, -1};

    public static Queue<Tomato> queue = new LinkedList<Tomato>();

    static class Tomato {
        int x, y, z;

        public Tomato(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        H = Integer.parseInt(st.nextToken()); /** 1번 문제는 변수 H를 1로 주면 해결된다.. */

        box = new int[H][N][M];

        for (int k = 0; k < H; k++) {
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < M; j++) {
                    box[k][i][j] = Integer.parseInt(st.nextToken());
                    if(box[k][i][j] == 1){
                        queue.offer(new Tomato(i, j, k));
                    }
                }
            }
        }

        bfs();
    }

    static int isPerfectlyRipe () {
        int max = -10000000;
        for (int k = 0; k < H; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (box[k][i][j] == 0) {
                        return 0;
                    }
                    max = max > box[k][i][j] ? max : box[k][i][j];
                }
            }
        }
        return max;
    }

    public static void bfs() {

        while (!queue.isEmpty()) {
            Tomato tomato = queue.poll(); // 큐에서 익은 토마토를 하나 꺼내자

            for (int i = 0; i < 6; i++) { // 상하좌우위아래 6개 방향으로 이동했을 때의 각 토마토 확인
                int _x = tomato.x + dx[i];
                int _y = tomato.y + dy[i];
                int _z = tomato.z + dz[i];
                if(0 <= _x && _x < N &&
                        0 <= _y && _y < M &&
                        0 <= _z && _z < H) { // 이동한 장소가 배열의 크기를 벗어나지 않도록 해야한다
                    if (box[_z][_x][_y] == 0) { // 아직 안익었다면 큐에 넣어준다
                        box[_z][_x][_y] = 1; //이제 익었으니까 1로 변환해주어야 다음 탐색을 이어나갈 수 있다
                        queue.add(new Tomato(_x, _y, _z));
                        box[_z][_x][_y] = box[tomato.z][tomato.x][tomato.y] + 1; // 날짜정보를 저장해준다 이 정보는 1부터 시작했으니 결과에서 1을 빼주어야한다
                    }
                }
            }
        }

        System.out.println(isPerfectlyRipe() - 1);

    }
}

 

 

이 책에서는 쇼코의 미소를 포함한 작가의 여러 중단편작 7편을 다룬다.

내용의 전개가 확 끌려들어간다던가 등의 느낌은 아닌 서정적인 분위기의 책인데, 장면에 대한 묘사는 그 장소와 분위기를 보다 생생하게 상상하게 만든다.

작가는 사회적인 여러 이슈들을 책에 잘 녹여내서 우리에게 생각할 거리들을 안겨준다. 나는 특히 이데올로기에 대해 표면적으로만 생각을 했었는데(정책이나, 정치적 성향이나... 등등), 그 안에서 살아가는 우리들의 모습에 투영되었을 때, 누군가에게는 큰 아픔이나 상처가 될 수 있다는 생각이 들었다. 작용이 있으면 부작용이 뒤따르는 법이다...

일부 몇개의 작품에서는 만남, 이별, 재회, 그리고 먼 훗날의 회상을 그리는 패턴을 가지는데, 재회의 과정에서는 항상 슬픈 감정이 들었다. 그 까닭은 그동안 생각했던 상대에 대한 긍정적인 모습이 모조리 부정되고, 미워지거나 다소 혐오스럽다는 불편한 감정이 들도록 함에 있다. 이 과정에서 상대에게 우월감을 느낀다던지, 이전과는 다른 내가 상대를 대하는 마음에 대해 너무나도 현실적으로 표현했기에 인간의 본성을 잘 그려냈다고 생각했다.

 

그때만 해도 나는 내가 다른 사람들과는 다른 삶을 살 수 있으리라고 생각했다. 나는 비겁하게도 현실에 안주하려는 사람들을 마음속으로 비웃었다. 그런 이상한 오만으로 지금의 나는 아무것도 아니게 되어버렸지만, 그때의 나는 삶이 속물적이고 답답한 쇼코의 삶과는 전혀 다른, 자유롭고 하루하루가 생생한 삶이 되리라도 믿었던 것 같다.

 

투이가 내게 선물한 스누피 만화책은 아직도 내 방 책장에 있다. 흑백 만화책이지만 우드스탁만은 샛노란색으로 칠해져 있다. 제대로 날지도 못하는 카나리아 우드스탁. 책을 펼쳐 그 노란색 카나리아를 볼 때면, 한 장 한 장 책장을 넘겨가며 그 작은 새에게 색을 입혀주려 했던 투이의 따듯한 마음이 가까이 다가왔다.

 

어쩌면 쇼코가 펜팔 친구(소유와 소유의 할아버지)를 친구로서 인정하고, 가까이 있는 사람들을 멀리하려던 이유는 가까이 있는 사람일 수록, 나의 내면을 드러냈을 때 더 큰 상처를 입히기 쉬운 사람들이어서가 아니었을까 싶다. 그런 두려움이 있어서 자신을 지켜주는, 그래서 보호하고픈 할아버지도 표면적으로 거리를 두고자했을거라 추측해본다.

'독서' 카테고리의 다른 글

아주 희미한 빛으로도  (0) 2024.07.14
이만큼 가까이  (4) 2024.06.09
재인, 재욱, 재훈  (0) 2024.05.18
피프티피플  (1) 2024.04.28
[독서] 나는 매주 시체를 보러 간다  (0) 2024.04.01

2.1 컨테이너 애플리케이션 개발의 흐름

스텝1 개발 환경의 준비

-       에디터나 IDE 등을 설치하고 개발 언어별로 필요한 런타임이나 라이브러리 도입

스텝2 컨테이너 이미지의 작성 및 공유

-       컨테이너 작동을 하려면 애플리케이션을 움직이기 위해 필요한 바이너리, OS, 네트워크와 같은 ㅇ니프라 설ㅈ어이 모두 포함되어 있는 컨테이너 이미지를 작성해야 한다. 도커의 경우 DOCKERFILE이라는 텍스트 파일에 구성을 기술, 그것을 빌드한 것을 실행 환경에서 이용가능한 레포지토리로 공유한다.

스텝3 클러스터 작성 (실제 환경의 작성)

실제로 컨테이너 애플리케이션을 작동시키는 서버를 셋업한다.

개발 환경이나 테스트 환경에서는 로컬 머신에서 작동시킬 수도 있지만 서비스를 공개할 때는 자신이 보유한 온프레미스 환경에서 시스템을 구축하거나 클라우드 서비스를 이용한다.

 

2.2 개발 환경 준비

Visual studio code 설치

MS가 제공하는 오픈소스 소스코드 에디터이며 무료이다. Windows, macOS, Linux에서도 작동된다.

비주얼 스튜디오 마켓플레이스에서 제공하는 확장 기능을 넣어 커스터마이징하여 사용 할 수 있다.

 

Vs code 주요 지원기능

-       디버그 기능

-       구문 하이라이트

-       intelliSense(입력 보완 기구)

-       Git 연동

-       태스크 자동 실행

-       확장 기능 임베디드

-       통합 터미널 가능

Vs code에서 [view] -> [extensions]

Docker support for visual studio 설치

Visual studio code kubernetes tools 설치

 

Azure CLI 명령의 설치

https://aka.ms/installazurecliwindows

CMD를 통해 AZURE에 로그인한다

as login

 

이어서 다음 명령을 실행하여 리소스 프로바이더를 활성화한다.

az provider register -n Microsoft.Network

az provider register -n Microsoft.Storage

az provider register -n Microsoft.Compute

az provider register -n Microsoft.ContainerService

 

-       Azure cli 설치 문서 : https://docs.microsoft.com/ko-kr/cli/azure/install-azure-cli

-       Kubectl 명령의 설치 : https://storage.googleapis.com/kubernetes-release/release/v1.11.4/bin/windows/amd64/kubelctl.exe

 

설치후 버전 체크

$ kubectl version

 

Azure cli를 이용하면 az명령어로 kubectl 명령을 설치 할 수 있다. Azure의 경우 이 방법으로 진행한다.

Sudo az install-cli

 

Azure cloud shell은 브라우저에서 azure를 명령으로 조작할 수 있는 웹 애플리케이션이다. 클라이언트 단말이나 az명령을 설치하는 것이 어려운 경우에 사용하면 좋다.

개요 : https://docs.microsoft.com/ko-kr/azure/cloud-shell/overview

 

2.3 azure container registry

Azure Container Registry(이하 ACR)는 애져가 제공하는 컨테이너 이밎 공유 서비스다. 쿠버네티스 뿐만 아니라 DC/OS, Docker Swarm, Azure가 제공하는 컨테이너 실행 환경에서 이용할 수 있다.

 

(1)   레지스트리 작성

$ ACR_NAM=sampleACRResgistry

Azure에서는 리소스 그룹이라는 논리적 단위로 리소스를 관리한다.

$ ACR_RES_GROUP=$ACR_NAME

 

그리고 다음 명령어를 통해 리소스 그룹을 작성한다 로케이션은 한국 중부 리전을 사용한다.

$ az group create –resource-group $ACR_RES_GROUP –location koreacentral

 

이제 리소스 그룹이 생성되었으니 acr의 레지스트리를 작성한다.

$ az acr create –resource-group $ACR_RES_GROUP –name $ACR_NAME –sku Standard –location koreacentral

여기서 LOGIN SERVER의 값을 확인해야 한다. 이것이 컨테이너 레지스트리의 액세스 위치가 된다.

 

(2)   샘플 다운로드

예시에서는 아래와 같은 샘플 프로젝트를 사용한다

$ git clone https://github.com/ToruMakabe/Understanding-K8s

$ cd Uderstanding-K8s/chap02/

 

(3)   이미지 빌드

다음 명령어를 통해 빌드한다 이미지 이름은 photo-view이며 이미지의 식별을 위해 ‘v1.0’ 태그를 설정한다 이 이미지의 빌드에는 시간이 조금 걸린다.

az acr build –registry $ACR_NAME –image photo-view:v1.0 v1.0/

 

2.4 azure를 사용한 쿠버네티스 클러스터 작성

Azure Kubernetes Service(이하 AKS)를 이용하여 설명을 진행한다

(1) ACR AKS 연결하기

좀 전에 ACR에서 작성한 컨테이너 이미지는 AKS에서 작성한 쿠버네티스 클러스터 상에서 pull하여 움직인다.

그러기 위해서는 ACR AKS 사이에 인증을 해야 하기 때문에 Azure Active Directory의 서비스 프린서플을 사용한다.

서비스 프린 서플이란 azure의 리소스를 조작하는 애플리케이션을 위한 ID이다.

먼저 az acr show 명령을 실행하여 ACR의 리소스 ID를 취득한다. 다음 명령어를 사용하여 취득한 리소스 ID를 쉘 환경변수 ACR_ID에 설정한다.

 

$ ACR_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

 

이후 서비스 프린서플 이름을 쉘 환경변수 SP_NAME에 설정한다.

(2) 클러스터 만들기

(3) 클러스터 연결을 위한 인증 정보 설정하기

 

KUBECTL 명령을 사용한 클러스터의 기본 조작

서비스 프린 서플이란 azure의 리

AKS를 사용하여 쿠버네티스 클러스터를 작성했으면 이제 kubectl 명령을 사용하여 클러스터를 조작할 수 있다.

kubectl은 기본적으로 다음과 같은 구문으로 사용한다.

kubectl  <명령> <타입> <이름> <플래그>

 

  • 명령
    • 클러스터에 대해 어떤 조작을 할지 지정
    • 자주쓰는 명령은 create / apply / get / delete, 상세보기 describe, 로그 확인은 logs
  • 타입
    • 쿠버네티스는 컨테이너 애플리케이션이든 네트워크 설정이든 잡 실행이든 모두 리소스라는 추상화된 개념으로 관리한다
    • 타입에는 단축명 이용할 수 있다
  • 이름
    • 리소스에는 식별을 위한 고유한 이름 존재
    • 이것을 리소스의 이름으로 지정, 이름은 대소문자 구분
    • 이름을 생략하면 모든 리소스의 상세정보가 표시된다
  • 플래그
    • 옵션으로 플래그를 지정한다.

 

 

 

 

'Develop Issue > Kubernetes' 카테고리의 다른 글

1. 컨테이너, 쿠버네티스란?  (1322) 2023.03.19

+ Recent posts