• 작가 : 우스이 유키 / 정재혁(역)
  • 쪽수 : 288쪽
  • 가격 : 13,800원
  • 출판사 : 꼼지락
  • 출판일 : 2020년 3월 16일
  • 독서일 : 2025년 6월 23일

 

필자가 느낀 점

 

일주일을 인식하는 방식은 나라마다 조금씩 다릅니다. 월요일이 한 주의 시작인지, 일요일이 시작인지에 대한 논쟁처럼 말입니다. 하지만 그런 논쟁과 무관하게 사람들이 가장 좋아하는 요일을 꼽으라면 단연 주말(토요일, 일요일)과 그 주말을 앞둔 금요일일 것입니다. '불금'이라는 단어가 괜히 있는 것이 아니듯, 금요일은 월요일부터 이어진 평일의 노고를 보상받는 도피처와도 같은 시간이라고 할 수 있습니다.

 

그런 금요일에 한 주의 일과가 시작된다는 이 책의 제목은 저에게 꽤 자극적으로 다가왔습니다. 표지의 커다란 시계를 보고 시간 관리에 관한 책이라는 것은 알 수 있었지만, '금요일에 일주일을 시작한다'는 것이 과연 관점의 전환을 의미하는 것인지, 아니면 정말 업무 구조를 그렇게 만들라는 것인지 궁금증을 자아냈습니다. '하고 싶은 일은 전부 할 수 있는 시간 관리법'이라는 부제 또한, 누구에게나 공평하게 주어지는 24시간이라는 한정된 자원의 제약에서 벗어날 수 있게 해주는 문장처럼 보여 마음이 갔던 것 같습니다.

 

이 책의 저자인 우스키 유키는 30대라는 젊은 나이에 사별한 남편을 대신해 경영자가 된 인물입니다. 그녀는 현재 경영자, 컨설턴트, 강사, 작가 등 다방면에서 활동하며 일본 내에서는 시간 관리 전문가로 저명한 것으로 보입니다. 저 역시 그녀의 다른 저서인 [지금 당장 써먹는 대화의 기술]을 예전에 재미있게 읽었던 기억이 있습니다. 책은 총 7장으로 구성되어 있습니다.

  • 1장. 시간 관리의 기본은 '시간 밀도 높이기' : 본 장은 멀티태스킹처럼 여러 일을 한꺼번에 처리하는 것을 논하는 것이 아니라, 지정된 시간에 압축적으로 고품질의 결과물을 만들어 내는 방법에 대해 논의합니다. 투자한 시간 대비 집중할 수 있는 환경을 조성하고, 그에 따른 시간의 효율성을 '시간 밀도'라는 용어를 통해 풀이합니다.
  • 2장. 시간을 지배하는 사람의 인간관계 : 본 장은 1장에서 시작된 '시간 밀도' 이야기에 이어, 시간을 빼앗아가는 주변인들과 그들의 행동을 원천적으로 차단하고 시간의 주도권을 가져오는 방법에 대해 설명합니다. 이곳에서 마음에 드는 몇몇 구절을 기록해 둘 수 있었습니다.
  • 3장. 시선을 사로잡는 메일과 SNS 기술 : 업무를 하면서 SNS나 메일과 같은 소통 채널은 빠질 수 없습니다. 특히 비즈니스 세계에서는 사람 간의 소통이 핵심이기에 더더욱 그러합니다. 본 장에서는 시간을 압축적으로 사용하는 메일 작성법과 SNS를 목적과 성과에 맞게 올바른 시간 관리 도구로 사용하는 방법에 대해 이야기합니다.
  • 4장. 일주일은 금요일부터 시작하라 : 이 책의 제목이 되는 장이자, 실제로도 책의 정중앙에 위치한 핵심적인 장입니다. 월요일부터 수요일까지를 집중 업무일로 정해 고밀도의 업무 성과를 달성하고, 소통과 같이 사람과의 대화를 통해 해결할 수 있는 일은 주의 후반부로 배치하는 법을 다룹니다. 또한 작심삼일(作心三日)을 방지하도록 자체적인 마감 시한을 정하는 등, 목표를 이룰 수밖에 없는 환경을 만드는 방법에 대해 이야기합니다.
  • 5장. 생각은 15분 안에 끝내라 : 우리는 생각보다 일상 속에서 '뇌정지'가 오거나 멍하니 있는 순간들을 자주 겪습니다. 그 모든 시간을 합치면 상당한 시간이 낭비되고 있는데, 본 장에서는 그런 '생각 시간'을 줄여야 한다는 점과 그럴 수 있는 구체적인 기술에 대해 이야기합니다.
  • 6장. 시간 효율을 높이는 사소한 습관 : 본 장에서는 일상생활 속에서 가볍게 따라 하며 시간 밀도를 높일 수 있는 기술들을 설명합니다. 특히 습관의 중요성, 미라클 모닝, 아침 시간 활용법 등을 강조합니다.
  • 7장. 일 잘하는 사람의 시간 활용법 : 책의 대미를 장식하는 장으로, 일 잘하는 사람(책의 맥락에서는 '시간을 잘 관리하는 사람')이 시간을 어떻게 활용하는지에 대해 이야기합니다. 자투리 시간 활용법이나 동선 최적화와 같은 기법들이 이 장에서 소개됩니다.

여러모로 비즈니스 세계에서 시간을 엄격하고 철저하게, 또 효율적으로 관리하는 방법에 대한 한 편의 강의를 들은 기분입니다. '시간의 주도권을 가져온다'는 주장은 다른 시간 관리 도서에서도 종종 찾아볼 수 있지만, 이 책은 그 주도권을 타인과의 관계 속에서 구체적으로 어떻게 가져와야 하는지 설명한다는 점에서 특히 인상적이었습니다. 이 책에서 배운 기술들을 잊지 않고, 저의 시간 관리에 좋은 영양분으로 사용하고 싶다는 다짐과 함께 독후감을 마칩니다.

안녕하세요! GoF 디자인 패턴 연재, 이번 시간에는 **생성 패턴(Creational Patterns)**의 가장 유명하고 단순한 패턴 중 하나인 싱글턴(Singleton) 패턴에 대해 알아보겠습니다.


정의

싱글턴 패턴어떤 클래스의 인스턴스가 오직 하나만 생성되도록 보장하고, 그 인스턴스에 대한 전역적인 접근점(Global Point of Access)을 제공하는 패턴입니다. 쉽게 말해, "이 클래스로는 객체를 딱 하나만 만들 수 있어! 그리고 누구든 그 하나뿐인 객체를 쉽게 가져다 쓸 수 있게 해줄게." 라는 개념입니다.

 

예를 들어, 시스템의 환경 설정을 관리하는 객체나, 데이터베이스 연결을 관리하는 커넥션 풀 객체는 여러 개가 존재하면 설정값이 꼬이거나 자원이 낭비될 수 있습니다. 이런 경우, 시스템 전체에서 단 하나의 인스턴스만 존재하도록 강제하여 일관성을 유지하고 자원을 효율적으로 사용하기 위해 싱글턴 패턴을 사용합니다.

 

싱글턴 패턴의 구조는 매우 간단합니다. 핵심은 '외부에서 새로운 인스턴스를 생성하지 못하게 막고, 이미 만들어진 인스턴스가 있다면 그것을 반환하는 것'입니다.

  • 비공개(private) 생성자: 외부에서 new 키워드로 새로운 인스턴스를 생성하는 것을 막습니다.
  • 정적(static) 변수: 클래스 내부에서 유일한 인스턴스를 저장하기 위한 변수를 선언합니다.
  • 정적(static) 메서드: 유일한 인스턴스를 반환하는 getInstance()와 같은 공개 메서드를 제공합니다. 이 메서드는 인스턴스가 없으면 생성하고, 이미 있다면 기존 인스턴스를 반환합니다.

사용예시

1. 가장 기본적인 구현 (Lazy Initialization)

getInstance()가 처음 호출될 때 인스턴스를 생성하는 방식입니다.

public class Settings {
    // 1. 유일한 인스턴스를 저장할 정적 변수
    private static Settings instance;

    // 2. 외부에서 생성을 막기 위한 비공개 생성자
    private Settings() {
        // 설정 로딩 등 초기화 로직
        System.out.println("Settings 인스턴스가 생성되었습니다.");
    }

    // 3. 인스턴스를 얻기 위한 정적 메서드
    public static Settings getInstance() {
        if (instance == null) {
            instance = new Settings();
        }
        return instance;
    }

    // 예시 메서드
    public void showMessage() {
        System.out.println("현재 설정 값은...");
    }
}

// --- 클라이언트 코드 ---
public class Client {
    public static void main(String[] args) {
        Settings settings1 = Settings.getInstance();
        Settings settings2 = Settings.getInstance();

        if (settings1 == settings2) {
            System.out.println("settings1과 settings2는 같은 인스턴스입니다.");
        } else {
            System.out.println("settings1과 settings2는 다른 인스턴스입니다.");
        }
        
        settings1.showMessage();
        
        // 실행 결과:
        // Settings 인스턴스가 생성되었습니다.
        // settings1과 settings2는 같은 인스턴스입니다.
        // 현재 설정 값은...
    }
}

* 주의: 위 코드는 멀티스레드 환경에서 동시에 getInstance()를 호출할 경우, 인스턴스가 여러 개 생성될 수 있는 문제가 있습니다.

2. 멀티스레드 환경에서 안전한 구현 (Thread-Safe)

방법 1: Eager Initialization (이른 초기화)

클래스가 로드될 때 미리 인스턴스를 생성하는 방식으로, 가장 간단하고 안전합니다.

public class Settings {
    // 클래스 로딩 시점에 바로 인스턴스 생성
    private static final Settings INSTANCE = new Settings();

    private Settings() {}

    public static Settings getInstance() {
        return INSTANCE;
    }
}

방법 2: synchronized 키워드 사용

getInstance() 메서드에 synchronized를 붙여 한 번에 하나의 스레드만 접근하도록 보장합니다. 하지만 매번 동기화 오버헤드가 발생하여 성능 저하의 원인이 될 수 있습니다.

public class Settings {
    private static Settings instance;

    private Settings() {}

    // 동기화 처리로 스레드 안전성 보장
    public static synchronized Settings getInstance() {
        if (instance == null) {
            instance = new Settings();
        }
        return instance;
    }
}

결론

그럼 싱글턴 패턴은 언제 사용하는 걸까요?

  • 시스템 전체에서 단 하나의 인스턴스만 존재해야 할 때
  • 인스턴스가 하나만 있음을 보장하여 자원을 절약하고 데이터 일관성을 유지하고 싶을 때
  • 전역 변수처럼 사용하지만, 객체 생성 시점을 제어하고 싶을 때 (Lazy Initialization)

단순성과 이해가능성이 높은 실무적으로 효율적인 패턴이지만 다음과 같은 조건을 고려해야합니다

  • 단일 책임 원칙(SRP) 위배: 싱글턴 클래스는 인스턴스 관리와 본래의 비즈니스 로직 두 가지 책임을 갖게 됩니다.
  • 테스트의 어려움: 전역 상태를 갖기 때문에 단위 테스트를 수행하기 어렵습니다. 의존성 주입(DI)이 힘들어 테스트 코드 작성이 까다로워집니다.
  • 유연성 저하: 싱글턴은 '구체 클래스'에 직접 의존하므로, 코드의 유연성이 떨어질 수 있습니다.

싱글턴 패턴은 구현이 간단하고 명확한 목적을 가지고 있어 널리 사용되지만, 위와 같은 단점 때문에 안티 패턴(Anti-Pattern)으로 불리기도 합니다. 따라서 사용하기 전에 정말로 이 클래스의 인스턴스가 단 하나만 필요한지, 그리고 싱글턴으로 인해 발생할 수 있는 문제점은 없는지 신중하게 고민해야 합니다. 다음 시간에는 Builder 패턴에 대해서 알아보겠습니다!

  • 작가 : 정해연
  • 쪽수 : 312쪽
  • 가격 : 16,800원
  • 출판사 : 엘릭시르
  • 출판일 : 2024년 7월 26일
  • 독서일 : 2025년 6월 22일

 

필자가 느낀 점

 

정해연 작가님의 소설 읽기, 오늘은 그 네 번째 시간으로 [2인조]라는 소설을 가지고 왔습니다. 책의 표지는 다른 정해연 작가님의 책들보다 팝아트 느낌이 강해서, 비교적 가벼운 분위기의 소설일 것이라는 첫인상을 받았습니다. 첫인상은 그러했지만, '과연 이번에는 어떤 입체적인 인물들로 저에게 강렬한 재미를 선사할까' 하는 기대를 품고 독서를 시작했습니다.

 

이 책은 [2인조]라는 제목에 걸맞게, 교도소에서 만난 두 명의 사기꾼이 이야기를 이끌어 갑니다. 교도소에서 이들은 원대한 사기(소위 '대업'이라고 부릅니다)를 통해 인생 역전을 꿈꿨고, 출소 후에 실제로 다시 만나게 됩니다. 그리고 부유한 동네로 향하던 중, 한 미스터리한 노인과 접촉사고를 내게 됩니다. 그런데 그 노인은 돈이나 보험 처리를 원하는 대신, 자신의 집 나간 아들과 손녀를 찾아달라는 이상한 부탁을 합니다. 보상으로 1억 원을 주겠다는 말에 마음이 동한 사기꾼 2인조는, 그렇게 그의 아들과 손녀를 찾는 여정을 시작합니다.

 

이 책은 결론부터 말하자면 재미있었습니다. 인물들이 입체적이라기보다는 노골적으로 자신의 욕망을 드러내는 유형으로 구성되어 있고, 그들이 만들어가는 이야기는 마치 인간 말종의 끝을 보는 듯합니다. 그러면서도 2인조 중 양심의 가책을 더 많이 느끼는 '형래'를 통해, 세상을 진심으로 위하는 사람도 있다는 생각을 하게 만듭니다. 인물에 대한 반전이 숨어 있기는 하지만, 이전 [용의자들]만큼 충격적인 반전은 아니라고 생각했는데... 다시 생각해보니 그에 못지않은 반전이 있었던 것 같기도 합니다.

 

아무쪼록 소설 속 인물에 깊이 이입하여 '나라면 어떤 선택을 했을까'를 고민하며 몰입해서 읽을 수 있는 책이었다고 생각합니다. 어쩌면 지난번에 읽었던 [선택의 날]이라는 제목은, 끊임없는 선택의 기로에 놓이는 이 책에 더 어울리지 않았을까 하는 생각을 하며 독후감을 마무리합니다.

 

안녕하세요! 디자인 패턴 연재 시리즈, 이번 시간에는 생성 패턴(Creational Patterns)의 한 종류인 추상 팩토리(Abstract Factory) 패턴에 대해 알아보겠습니다.


정의 

추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고도, 서로 관련성이 있거나 의존적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공하는 패턴입니다. 비유로 설명을 해보겠습니다 예를 들어 가구 공장이 있다고 상상해봅시다. 이 공장은 '모던 스타일'과 '앤티크 스타일' 두 가지 테마의 가구를 생산할 수 있습니다.

  • 모던 가구 공장(ConcreteFactory)에 가서 가구를 주문하면 '모던 의자'와 '모던 테이블'을 받게 됩니다.
  • 앤티크 가구 공장(ConcreteFactory)에 주문하면 '앤티크 의자'와 '앤티크 테이블'을 받게 되죠.

여기서 중요한 점은, 클라이언트(가구를 주문하는 사람)는 어떤 스타일의 가구를 원할지(모던 or 앤티크)만 결정하면, 그에 맞는 한 세트의 가구들이 알아서 생성된다는 것입니다. 클라이언트는 의자나 테이블이 어떻게 만들어지는지에 대한 구체적인 과정을 알 필요가 없습니다. 이처럼 '관련된 객체들의 묶음'을 일관성 있게 생성하는 것이 바로 추상 팩토리 패턴의 핵심입니다.

 

추상 팩토리 패턴은 다음과 같은 요소들로 구성됩니다.

  • AbstractFactory (추상 팩토리)
    • 관련된 제품 객체들을 생성하기 위한 인터페이스를 정의합니다. (예: createProductA(), createProductB())
  • ConcreteFactory (구체적인 팩토리)
    • AbstractFactory 인터페이스를 구현하며, 구체적인 제품 객체들을 생성합니다. (예: ConcreteFactory1ProductA1ProductB1을 생성)
  • AbstractProduct (추상 제품)
    • 제품 객체의 인터페이스를 정의합니다. (예: AbstractProductA, AbstractProductB)
  • ConcreteProduct (구체적인 제품)
    • ConcreteFactory에 의해 생성될 구체적인 제품 객체입니다. AbstractProduct 인터페이스를 구현합니다. (예: ProductA1, ProductB1)
  • Client (클라이언트)
    • AbstractFactoryAbstractProduct 인터페이스에만 의존합니다. 구체적인 클래스 이름 없이 제품군을 생성하고 사용합니다.

사용예시

'모던 스타일'과 '앤티크 스타일'의 가구(의자, 테이블)를 생성하는 가구 공장 예제를 코드로 살펴보겠습니다.

// 제품군 중 하나인 의자에 대한 추상 제품
interface Chair {
    void sitOn();
}

// 제품군 중 다른 하나인 테이블에 대한 추상 제품
interface Table {
    void putOn();
}

위 코드는 생성할 가구들에 대한 공통된 인터페이스를 우선 정의합니다.

// 모던 스타일의 의자
class ModernChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("모던한 의자에 앉습니다.");
    }
}

// 모던 스타일의 테이블
class ModernTable implements Table {
    @Override
    public void putOn() {
        System.out.println("모던한 테이블에 물건을 올려놓습니다.");
    }
}

// 앤티크 스타일의 의자
class AntiqueChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("앤티크한 의자에 앉습니다.");
    }
}

// 앤티크 스타일의 테이블
class AntiqueTable implements Table {
    @Override
    public void putOn() {
        System.out.println("앤티크한 테이블에 물건을 올려놓습니다.");
    }
}

각 스타일에 맞는 구체적인 가구들을 구현합니다.

 

// 모던 스타일 가구를 생성하는 팩토리
class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }

    @Override
    public Table createTable() {
        return new ModernTable();
    }
}

// 앤티크 스타일 가구를 생성하는 팩토리
class AntiqueFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new AntiqueChair();
    }

    @Override
    public Table createTable() {
        return new AntiqueTable();
    }
}

각 스타일에 맞는 가구들을 생성하는 구체적인 팩토리를 구현합니다.

 

위처럼 팩토리를 정의해두면 client 단에서는 다음과 같은 방식으로 Factory Method를 호출할 수 있습니다

class FurnitureStore {
    private Chair chair;
    private Table table;

    // 클라이언트는 추상 팩토리 인터페이스에만 의존한다.
    public FurnitureStore(FurnitureFactory factory) {
        chair = factory.createChair();
        table = factory.createTable();
    }

    public void arrangeFurniture() {
        System.out.println("새로운 가구를 배치합니다.");
        chair.sitOn();
        table.putOn();
    }
}

public class Client {
    public static void main(String[] args) {
        // 고객이 원하는 가구 스타일을 결정 (예: "Modern")
        String style = "Modern"; // 또는 "Antique"
        FurnitureFactory factory;

        // 스타일에 따라 적절한 팩토리를 선택
        if ("Modern".equalsIgnoreCase(style)) {
            factory = new ModernFurnitureFactory();
        } else if ("Antique".equalsIgnoreCase(style)) {
            factory = new AntiqueFurnitureFactory();
        } else {
            throw new IllegalArgumentException("지원하지 않는 스타일입니다.");
        }

        // 선택된 팩토리를 사용하여 가구점을 구성
        FurnitureStore store = new FurnitureStore(factory);
        store.arrangeFurniture();
        
        // 실행 결과 (style = "Modern"일 경우):
        // 새로운 가구를 배치합니다.
        // 모던한 의자에 앉습니다.
        // 모던한 테이블에 물건을 올려놓습니다.
    }
}

클라이언트는 ModernFurnitureFactoryAntiqueFurnitureFactory 같은 구체적인 클래스를 직접 다루지 않고, FurnitureFactory라는 인터페이스를 통해 객체를 생성합니다. 덕분에 클라이언트 코드의 변경 없이도 가구 스타일을 쉽게 교체할 수 있습니다.


결론

그럼 지난 Factory Method에 비교해보면 생성객체를 묶어주는(군체) 인터페이스를 만들어준다는 큰 차이가 있는데, 이걸 언제 사용할까요?

  • 객체가 생성되는 방식에 구애받지 않고, 관련된 객체들로 이루어진 '제품군'을 만들어야 할 때
    • 예제처럼 가구 스타일(모던, 앤티크)에 따라 일관된 디자인의 가구(의자, 테이블)들을 생성해야 할 때 유용합니다.
  • 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고, 한번 설정한 후에는 다른 제품군으로 쉽게 교체할 수 있어야 할 때
    • 클라이언트 코드를 변경하지 않고 팩토리만 교체하면 전체 제품군이 바뀌므로 유연성이 높아집니다.
  • 구체적인 클래스는 숨기고 인터페이스만 노출하여 시스템의 결합도를 낮추고 싶을 때
    • 클라이언트는 구체적인 제품 클래스를 알 필요가 없으므로 시스템의 확장성과 유지보수성이 향상됩니다.

결론적으로는 Factory 구체 class는 숨기면서 제품의 Style별 여러 객체를 한번에 생성하고 싶을때 라고 정의할 수 있겠습니다.

기술사 공부할때는 Abstract Factory / Concreate Factory, Class Group 반환 등의 keyword를 사용하면 되겠네요. 추가로 Factory Method와의 비교도 같이 있으면 좋을거 같습니다. 팩토리 메서드하나의 제품을 만드는 방법을 서브클래스에게 위임하는 것이고, 추상 팩토리관련된 여러 제품들로 이루어진 세트를 만드는 공장을 제공하는 것입니다. 실제로 추상 팩토리 패턴의 내부는 종종 팩토리 메서드 패턴으로 구현되기도 합니다.

 

이번 시간에는 추상 팩토리 패턴에 대해 알아보았습니다. 관련된 객체들을 일관성 있게 생성해야 하는 복잡한 시스템에서 매우 유용하게 사용될 수 있는 강력한 패턴입니다. 다음 시간는 현대 프로그래밍의 객체 생성방식의 De-Facto처럼 사용되는 Singleton Pattern을 알아보겠습니다

 

  • 작가 : 정해연
  • 쪽수 : 280쪽
  • 가격 : 15,500원
  • 출판사 : 위즈담하우스
  • 출판일 : 2024년 5월 16일
  • 독서일 : 2025년 6월 20일

 

필자가 느낀 점

 

[홍학의 자리], [선택의 날]에 이어, 세 번째로 정해연 작가님의 장편 소설을 읽게 되었습니다. 이번 책의 제목은 [용의자들]입니다. 제목을 통해 이 책이 일련의 사건을 기반으로 진행될 것을 예측할 수 있었고, '용의자(단수)'가 아닌 '용의자들(복수)'이라는 점에서 여러 사람이 용의선상에 오르며 그들 중에서 진짜 범인을 찾아내는 이야기가 될 것이라고 짐작했습니다.

 

자연스레 [홍학의 자리]가 떠올랐습니다. 그 소설에서 주인공 다현은 자살로 생을 마감했지만, 실제로는 주변 상황과 여러 사람에 의해 죽음으로 내몰린 '사회적 타살'의 성격을 띠었습니다. 어쩌면 이 책에서도 비슷한 내용이 나오지 않을까 생각했습니다. 또한, 표지의 어두운 분위기로 보아 경쾌하기보다는 미스터리하고 진중한 분위기가 이어질 것 같다는 예감이 들었습니다.

 

소설은 비닐하우스에서 목이 졸린 채 발견된, 품행이 단정했던 여학생 '유정'의 죽음을 추리하는 방식으로 진행됩니다. 각 장이 명확하게 구분되기보다는, 여러 등장인물의 시점에서 상황이 서술되고 독자들은 그 사건을 쫓는 경찰의 발자취를 따라가게 됩니다. 주요 등장인물은 다음과 같습니다.

  • 한수연: 유정의 가장 친한 친구로, 소설의 시작과 끝을 알리는 인물입니다. 이혼 가정에서 살고 있으며, 무뚝뚝한 아버지에게 인정받고 싶은 마음과 유정에 대한 은근한 질투심을 가지고 있습니다.
  • 민혜옥: 유정의 담임 선생님입니다. 무능력한 남편과 함께 살면서 금전적, 정신적인 스트레스를 많이 받고 있습니다. 살인 당일 유정에게서 저녁 10시 상담 신청을 받았지만, 깊은 스트레스로 응답하지 못했다가 그 후에도 마음이 쓰여 다시 통화해 상담을 진행합니다.
  • 현강수: 유정의 아버지로 현재 이혼 상태입니다. 사업 실패로 가족에게 피해를 주기 싫어 위장 이혼을 한 상태이며, 무기력한 엄마에게 의지하지 못하는 유정의 유일한 안식처나 다름없었습니다.
  • 김근미: 유정의 남자친구 '승원'의 어머니입니다. 남편과 사별한 안타까운 사연의 소유자이지만, 부유한 시어머니 밑에서 아들 '승원'을 최고의 아들로 키우기 위해서라면 무엇이든 할 수 있는 집념을 가지고 있습니다.
  • 허승원: 살해당한 '유정'의 남자친구입니다. 살해당하기 며칠 전 헤어진 상태였다고 하며, 경찰은 승원과의 관계에서 벌어진 어떤 일이 모든 사건의 기점이라고 생각합니다.

모든 인물은 소설이 끝나기 직전, 즉 작가가 허락하는 그 순간까지 누가 진짜 '유정'을 죽인 범인인지 확신할 수 없도록 교묘하게 설계되어 있습니다. 모두가 유정을 미워할 만한 동기를 가지고 있었고, 이 중 누가 범인이라고 밝혀져도 전혀 이상하지 않을 것이라는 느낌을 소설 내내 받게 됩니다.

 

새삼 다시 한번 정해연 작가님의 인물 설정 능력에 감탄하게 되는 책이었습니다. [선택의 날]에서도 인물들을 입체적으로 해석하게 만들었던 그 필력이, 여러 용의자를 의심하게 만드는 이 책과 같은 구성에서는 그야말로 빛을 발하는 것 같습니다. 각 인물은 모두 추악한 비밀을 하나씩 품고 있습니다. 누군가의 비밀은 중반부에, 또 다른 누군가의 비밀은 마지막 순간에 밝혀집니다. 그래서 '아, 이 사람이 범인이구나'라고 생각하다가도, 다음 인물의 이야기가 나오면 '아니, 이 사람이 범인이었네'라며 계속해서 의심의 대상을 바꾸게 되는, 아주 흥미로운 경험을 하게 됩니다.

 

스포일러가 되지 않는 선에서 이야기하자면, 이 책의 최종적인 피해자는 '유정'과 '유정의 어머니'입니다. 하지만 한편으로 이런 생각도 해봅니다. 만약 책이 50페이지만 더 길었다면, 작가님은 그들의 비밀 또한 준비해두지 않았을까? 논리적 흐름이 만족되는 선에서 인물에 대한 새로운 관점을 끊임없이 부여하는 대가(大家)라면 당연히 그러지 않았을까 하는 생각을 하니, 피해자에 대한 안타까움마저 조금은 희미해지는 듯한 기묘한 느낌도 들었습니다.

 

아직 리뷰할 정해연 작가님의 책이 몇 권 더 남아 있습니다. 다음 독후감에서 다시 뵙겠습니다.

  • 작가 : 정해연
  • 쪽수 : 280쪽
  • 가격 : 15,800원
  • 출판사 : 시공사
  • 출판일 : 2023년 8월 29일
  • 독서일 : 2025년 6월 19일

 

필자가 느낀 점

 

[홍학의 자리]에 이어, 이번에 다시 정해연 작가님의 소설을 읽게 되었습니다. 이번 소설은 유괴를 다루는 '날' 시리즈의 세 번째 이야기, [선택의 날]입니다. 책 표지에서 고혹적인 표정을 짓고 있는 여성과 그 앞에 선 두 남성의 뒷모습을 볼 때, 이 세 사람의 관계가 소설의 중심이 될 것이라고 생각하며 책장을 넘겼습니다. 책을 읽기 전에 왜 제목이 '선택'일까 생각해 본 것은 물론입니다. '인생은 B(Birth)와 D(Death) 사이의 C(Choice)다'라는 유명한 말처럼, 이 소설 역시 중요한 선택의 분기점들을 통해 이야기가 전개될 것이라고 예상하며 책을 펼쳤습니다.

 

이 장편 소설의 주인공은 착실한 보험 설계사인 '종현'입니다. 아내 '현아'와 행복하게 살던 그는 어느 날 아내의 갑작스러운 가출이라는 믿을 수 없는 사건과 마주하게 됩니다. 며칠 뒤, 현아에게 받을 돈이 있다는 거구의 남자 '구남'이 찾아오고, 종현은 아내의 행방을 좇기 위해 그와 기묘한 동행을 시작합니다. 한편, 뉴스에서는 6세 여아 실종 사건의 용의자 실루엣이 공개되는데, 놀랍게도 그 모습이 아내 현아와 꼭 닮아 있었습니다.

 

가출한 현모양처 아내가 유력한 용의자가 되어 그녀를 찾아 나서는 이야기, [선택의 날]은 유괴 범죄의 무게감을 잃지 않으면서도 정해연 작가님 특유의 경쾌한 문체로 아내의 실종과 그녀가 숨겨온 비밀, 그리고 유괴를 할 수밖에 없었던 사연을 풀어냅니다. 작가님 소설의 특징인 후반부에 몰아치는 반전의 연속이 일품인 책으로, 마지막 한 페이지에 이르기까지 긴장의 끈을 놓을 수 없게 만드는 반전들이 가득합니다. 특히 그 반전들이 개연성을 갖추도록 책의 초반부부터 복선과 장치를 착실하게 심어두어([홍학의 자리]에서도 느꼈던 점입니다), 마지막에 뒤통수를 강하게 맞는 듯한 충격을 느낄 수 있었습니다.

 

읽다 보니 소설의 구성을 넘어, 정해연 작가님의 문체와 집필 스타일 자체가 마음에 든다는 생각이 들었습니다. 모든 인물을 입체적으로 설정하고, 미워할 수밖에 없는 인물에게조차 행동의 정당성을 부여하는 정보를 몇 스푼 더하여, 과연 이 이야기 속 선과 악의 구분은 무엇인지 생각하게 만듭니다. 정해연 작가님의 소설을 몇 권 더 읽었는데, 그중에서도 이 책 [선택의 날]이 가지는 가장 큰 장점은 단연 '생동감'이 아닐까 싶습니다. 다른 소설보다 유난히 글자들이 머릿속에서 한 편의 영화처럼 펼쳐지는 듯한 책이었습니다. 일상을 섬세하게 묘사하는 필력과 높은 스토리 몰입감이 가져다준 경험이라고 생각해 봅니다.

 

과학 기술의 발전 덕분에, 현재 유괴 사건의 검거율은 100%에 달한다고 합니다. 지금 이 순간에도 아이를 기다리며 마음 졸이고 있을 많은 부모님을 응원하며, 모든 아이가 안전하게 집으로 돌아가기를 바라는 마음으로 독후감을 마무리합니다.

+ Recent posts