[AI 활용 신약개발(1)] 생성모델 이용한 분자설계
상태바
[AI 활용 신약개발(1)] 생성모델 이용한 분자설계
  • 데이터넷
  • 승인 2021.03.16 09:11
  • 댓글 1
이 기사를 공유합니다

RNN·VAE·GAN 등 AI 기반 모델 활용…효율적인 약물 찾고자 다양한 모델 연구 증가

[데이터넷] 최근 인공지능(AI)을 비롯한 기술의 발달로 여러 분야의 발전이 가속화되고 있다. 특히 신약개발 분야에서는 이러한 변화가 두드러지게 나타나는데 컴퓨터를 활용해 신약을 개발하고자 하는 시도가 활발하게 이뤄지고 있다. 이러한 방법은 전통적인 방법에 비해 신속하게 신약 후보군을 발굴함으로써 신약개발의 시간을 단축시키고 성공가능성을 향상시킬 수 있다. 본 글에서는 신약개발에서 사용되고 있는 인공지능을 활용한 약물 디자인, 자연어처리를 통한 데이터 마이닝, 네트워크 이론을 기반으로 한 독성예측과 같은 기술들을 살펴보고자 한다. <편집자>

이일구 박사(팜캐드 R&D센터)
▲이일구 박사(팜캐드 R&D센터)

신약개발은 모래사장에서 바늘 찾기에 비유된다. 그만큼 우리가 찾아야 하는 화학 공간(chemical space)이 넓다는 뜻이기도 하다.

광활한 화학 공간에서 우리가 원하는 특성을 가진 분자를 직접 만들거나 찾아내는 것은 시간과 노력이 굉장히 많이 드는 일이다. 그래서 컴퓨터의 도움으로 약물을 찾는 방법들이 많이 연구됐고, 그런 방법들을 CADD(Computer-aided drug design)라고 부른다.

대규모 가상 스크리닝(Virtual screening), 머신러닝(Machine learning)을 이용한 QSAR(Quantitative structure-activity relationship), 분자 도킹(Molecular docking), 분자 동역학(Molecular dynamics)과 같은 방법들로 약물을 찾는 연구를 활발히 진행하고 있다.

최근 10여년에 걸쳐 딥러닝(Deep learning) 기술이 급격한 발전을 이뤘다. 이미지 분류에서는 이미 사람의 능력을 뛰어넘었고, 물체 탐지 및 이미지 분할 기술도 자율주행차, 의료영상 등에서 널리 쓰이고 있다.

자연어처리(NLP) 분야도 BERT, GPT-3 등 혁신적인 기술들이 나오면서 많은 발전이 있었다. 특히 GPT-3는 사람 수준의 글짓기를 할 수 있을 뿐만 아니라 번역, 사칙연산, 코딩까지도 할 수 있을 정도로 발전했다.

신약개발의 전체 프로세스는 [그림 1]에 잘 나타나 있다. 임상시험 이전 단계인 신약개발 단계에서 시간과 비용을 줄이기 위해 인실리코 방식으로 많은 연구들이 이뤄지고 있다. 그리고 그중 제일 앞단이라 할 수 있는 분자생성에 딥러닝 기술을 적용하는 연구가 활발히 진행되고 있다. 특히 생성모델(Generative models)을 이용한 드노보(de novo) 분자 설계 연구가 많이 이뤄졌다. 이 글에서는 생성모델을 이용한 분자설계의 최근 연구 동향을 살펴보고자 한다.

[그림 1] 신약개발 프로세스
[그림 1] 신약개발 프로세스

생성모델
생성모델이 신약개발에 직접 적용되는 사례들을 알아보기 전에 생성모델에 대한 간단한 개념을 설명하고자 한다. 생성모델을 직관적으로 설명하자면 무언가를 만들어내는 모델이라고 생각할 수 있다. 조금 더 머신러닝 관점에서 이야기를 하면 트레이닝 데이터 셋의 분포를 학습하는 모델이라고 설명할 수 있다.

그렇게 학습된 모델(트레이닝 셋과 유사한 모델 데이터 분포)에서 샘플링을 하면 만들어진(sampled or generated) 데이터를 얻을 수 있는 것이다. 생성모델의 간략한 도식은 [그림 2]에 잘 나타나 있다.

생성모델은 다양한 모델들이 있지만 여기서는 신약개발에서 많이 이용된 모델인 RNN(Recurrent neural networks), VAE(Variational autoencoder), GAN(Generative Adversarial Networks)에 대해서 간략히 알아보도록 한다.

[그림 2] 생성모델 개념도
[그림 2] 생성모델 개념도

- RNN
RNN은 시퀀스 데이터를 다루기 적합한 모델이다. 시퀀스 데이터는 데이터의 순서가 정해져 있는 것을 의미한다. RNN은 이러한 시퀀스 데이터를 순차적으로 받아서 처리한다.

RNN의 가장 큰 특징은 과거의 데이터(이전 순서의 데이터)를 메모리의 형태로 기억하고 있다는 것이다. 입력으로 하나의 시퀀스를 받았을 때 RNN은 그 시퀀스의 전체 내용을 담고 있는 하나의 메모리(hidden state)를 가지게 되는 것이다.

하지만 RNN은 장기 의존성(앞쪽 시퀀스 데이터가 뒤쪽 시퀀스 데이터에 미치는 영향)을 잘 반영하지 못하는 단점이 있다. 이러한 장기 의존성 문제를 해결하기 위해 LSTM(Long Short-Term Memory)모델과 GRU(Gated Recurrent Unit) 모델이 만들어졌고 RNN보다 나은 성능을 보여줬다. RNN, GRU, LSTM 같은 모델을 이용하면 감정 분석, 번역, 이미지 설명, 질의응답, 챗봇 같은 응용 프로그램들을 만들 수 있다.

- VAE
RNN과 같은 학습방법은 해당 모델의 가능성을 구하기 쉽고 학습이 쉽다는 장점이 있지만 어떤 유용한 표현 또는 내재적인 성질을 학습하는 것이 아니라는 단점이 있다.

VAE는 연속 잠재변수(continuous latent variable)를 도입해 이러한 문제를 해결한다. 잠재변수 z를 이용해 데이터를 만들어 내는 확률모델과 실제 데이터로부터 추론되는 잠재변수 z를 찾아내는 후방(posterior) 확률모델을 둘 다 학습한다. 하지만 후방 자체를 구하는 것이 어렵기 때문에 이를 간단한 분포로 근사해 문제를 해결한다.

이렇게 복잡한 분포를 우리가 알고 있는 쉬운 분포로 근사하는 과정을 변분추론(variational inference)라고 한다. 최종적으로 이렇게 만들어진 모델이 오토인코더(autoencoder)와 외형적으로 유사해 이 모델을 변분 오토인코더(VAE: variational autoencoder)라 부른다.

- GAN
GAN은 앞서 두 가지 방법과는 달리 가능성을 바로 적용하는 모델이 아니다. GAN은 서로 다른 두 개의 네트워크가 존재한다. 첫 번째 네트워크는 생성기(Generator)이고 잠재 공간(latent space)에서 실 데이터로 매핑하는 과정을 학습한다.

두 번째 네트워크는 판별기(Discriminator)이고 입력으로 들어온 데이터가 진짜 데이터(훈련 데이터)인지 가짜 데이터(생성기가 만든 데이터)인지 구분하는 역할을 학습한다. 그리고 이 두 네트워크들이 서로 상대방을 속이기 위해 노력한다.

예를 들어 위조지폐범(Generator)이 경찰(Discriminator)을 속이기 위해 위조지폐를 진짜와 비슷하게 만들고 경찰은 위조지폐범을 잡기 위해 진짜와 가짜를 구분하는 능력을 발전시킨다. 최종적으로 위조지폐범(Generator)은 위조지폐를 진짜처럼 만들어 내는 것이다.

- RL
강화학습(RL: Reinforcement Learning)은 생성모델은 아니지만 생성모델과 결합해 다양하게 응용된다. RL은 어떤 환경 안에 있는 에이전트가 현재 상태에서 어떤 행동을 할지 결정하는 모델을 의미한다. 행동을 하게 되면 환경이 보상을 주는데 이 보상의 총합이 커지는 방향으로 학습을 하게 된다. 보상이 행동을 강화하는 역할을 하게 되는 것이다.

강화학습은 우리가 잘 알고 있듯이 게임에 많이 적용됐다. 아타리 게임에서 쓰인 강화학습 및 알파고, 알파스타 같은 모델들은 이제 사람보다 뛰어난 게임 실력을 보여준다. 그 외에도 자율주행차 등에서 응용되고 있다.

딥러닝 이용한 실제 모델들
지금까지 간단하게 생성모델과 강화학습에 대해서 알아봤다. 이제는 앞서 언급한 생성모델이 실제로 분자 설계에 어떻게 응용되고 있는지 알아보겠다.

분자 데이터를 분석하거나 생성모델에 적용하기 위해서는 적절한 방식의 표현 방법(representation)이 필요하다. 대표적으로는 SMILES(Simplified Molecular-Input Line-Entry System), InChI 또는 MACCS keys 같은 텍스트 기반의 표현 방식이 있다. 그리고 분자 구조 자체에서 원자를 노드로 연결 상태를 링크로 생각해서 그래프 구조로 다루는 방법이 있다.

물론 전통적인 방법으로 특정 하위 구조의 존재 유무를 가지고 벡터화 시키는 핑거프린트 방식도 많이 쓰고 있다.

최근 자연어처리에서 급격한 발전이 이뤄졌고 시퀀스 데이터를 다루기 좋은 모델들도 많이 나왔다. 그래서 분자 설계 분야에도 시퀀스 데이터인 SMILES를 다양한 딥러닝 모델에 적용시켜 여러 논문들이 출판됐다. 물론 그래프 구조 기반의 딥러닝 모델들을 이용한 분자 설계방법들도 많이 연구되고 있지만 이 글에서는 SMILES 기반의 모델들만 소개하도록 하겠다.

- RNN 계열
시퀀스 데이터는 순서를 갖는 데이터다. 자연어처리에서는 각각의 분절된 데이터들을 토큰(token)이라고 부른다. 예를 들어 문장이라는 하나의 시퀀스 데이터에서 각 어절을 토큰으로 생각할 수 있다.

SMILES는 분자구조를 특정 규칙에 따라 아스키 문자열로 표현한 것이다. 여기서 각각의 아스키 문자를 하나의 토큰으로 보고 SMILES 전체를 하나의 시퀀스로 보면 딥러닝 모델에 적용할 수 있다.

제일 처음 분자설계에 RNN을 적용한 논문은 Segler의 논문이다. Segler는 140만개의 ChEMBL 데이터에 3-layers LSTM을 적용해 학습을 시켰다. 97.7%의 유효성(validity)과 89.4%의 참신함(novelty)을 보여줬다. 그 후 관심 있는 특정 타깃에 대해 더 좋은 활성도(activity)를 갖는 분자를 만들기 위해 전이학습(Transfer learning) 기법을 도입했다.

전이학습은 큰 데이터 셋을 이용해 모델의 일반화 능력(generality)을 학습하고 그 후 작은 데이터 셋(특히 우리의 관심이 되는 데이터 셋을 의미)을 이용해 그 데이터 셋의 특성을 더 반영하는 모델을 학습하는 방법이다.

5-HT2A receptor(protein), Plasmodium falciparum(parasite), Staphylococcus aureus (bacteria) 등 대표적인 생물학적 타깃 세 가지를 이용해 전이학습을 수행했다. 학습 시 매 에포크(epoch)마다 분자를 샘플링해 학습 데이터 셋과 ECFP4를 이용한 타니모토 유사도(Tanimoto similarity)를 측정한 결과 학습이 진행될수록 특정 타깃의 데이터를 잘 반영하는 것을 유사도가 높아지는 것을 통해 확인할 수 있었다.

이와 비슷한 접근 방식으로 Gupta의 논문이 있다. 이 논문 역시 전이학습 방법을 이용했다. 먼저 ChEMBL 데이터로 사전 훈련(pre-training)을 하고 그 후 세 가지 타깃들(peroxisome proliferator-activated receptor gamma(PPARr) inhibitors, trypsin inhibitors, five structurally diverse transient receptor potential M8(TRPM8) blockers)에 대해 미세조정(fine-tuning)해 실제 타깃 데이터에 적용했다.

재미있는 것은 RNN 모델을 통한 드누보 생성기가 아닌 파편 정보를 미리 주고 그 파편을 기반으로 분자를 생성하는 새로운 시도를 했다는 점이다. 이는 잠재적으로 히트 투 리드(hit-to-lead) 최적화에 응용할 수 있는 가능성을 보여준 것이다.

여러 가지 RNN 기반의 모델들이 있고, 대부분 전이학습을 이용해 실제 관심 있는 타깃과 유사한 분자가 설계되도록 하는 연구를 진행했다. 이번에 소개할 논문은 전이학습 방법이 아닌 다른 방식으로 분자 설계 최적화를 수행한다. 분자 데이터(SMILES)를 RNN 인풋으로 넣기 전에 RDkit을 이용해, LogP, MW, QED 같은 분자 특징들(molecular properties)을 뽑아내고 동시에 QSAR 모델로 해당 분자의 생물활동(bioactivity)을 뽑아낸다.

이러한 분자 특징들에 밀도층(Dense layer)을 적용해 아웃풋 숨겨진 상태(hidden state)를 RNN의 초기 상태(initial state)로 같이 넣어 분자의 특성을 반영한 RNN 모델을 만들었다. 학습 후에는 원하는 분자의 특성을 초기 상태로 집어넣어 해당 성질이 반영되는 분자들을 생성할 수 있다.

RNN 기반의 여러 가지 모델들이 연구됐고, 최근 NLP 기술의 발달로 인해 성능도 고도화되고 있다. 하지만 RNN 모델 자체로는 잠재 공간을 학습하는 능력이 없고 광범위한 화학 공간에서 원하는 성질을 갖는 분자를 찾는 일은 여전히 어려운 문제이다. 다음에서 살펴볼 VAE 계열들의 모델은 이 문제점을 어느 정도 해결한다.

[그림 3] ChemicalVAE 아키텍처
[그림 3] ChemicalVAE 아키텍처

- VAE 계열
VAE 모델을 가장 먼저 적용한 논문은 Gomez-Bombarelli의 ChemicalVAE 논문이다. ChemicalVAE의 전체 구조는 [그림 3]에서 확인할 수 있다. 앞서 간단하게 설명했듯이 VAE는 인코더와 디코더로 이뤄져있다.

ChemicalVAE는 인코더-디코더 아키텍처를 RNN-RNN으로 하는 시퀀스 투 시퀀스 모델과 인코더와 디코더가 서로 다른 아키텍처를 가지는 CNN-RNN 모델의 두 가지를 테스트했다. 그 결과 CNN-RNN 모델에서 약간 더 나은 성능 향상을 확인했다. 그리고 분자의 특성을 제어하기 위해 인코딩된 연속 잠재 벡터(continuous latent vector)와 분자 특성의 관계를 학습하는 속성 예측 네트워크(property prediction network)를 VAE에 추가해 같이 학습했다.

VAE와 예측 네트워크가 같이 학습해 분자들의 성질을 잠재 공간에서 최적화했다. 그 후 가우시안(Gaussian) 프로세스를 이용해 예측 네트워크를 잠재 공간상에서 최적화해 원하는 분자구조를 찾아낸다.

ChemicalVAE 이후 VAE 기반의 모델 및 그의 변형 모델들도 많이 연구됐다. AAE(Adversarial Autoencoder)를 이용한 연구가 그 중 하나이다. AAE의 기본 아키텍처는 오토인코더이고 인코더의 아웃풋인 병목(bottleneck)을 가짜 데이터로, 주어진 사전(prior) 분포를 진짜 데이터로 간주해 대립하는(adversarial) 방법으로 잠재 공간을 학습한다.

Blaschke는 이 논문에서 총 4가지 아키텍처들(NoTeacherVAE, TeacherVAE, Gauss AAE, Uniform AAE)을 비교했다. (No)Teacher의 뜻은 디코더 RNN 학습 시 티처 포싱(teacher forcing) 기법을 이용했는지 안했는지를 나타내는 것이고, 가우스(Gauss), 유니폼(Uniform)은 AAE의 사전 분포로 어떤 분포를 사용했는지를 나타내는 표기법이다.

논문에서는 유니폼 AAE의 유효성 비율(validation rate)이 78.3%로 제일 좋은 성능을 보여줬다. 그리고 ChemicalVAE와 마찬가지로 잠재 공간상에서 최적 분자를 찾기 위해 가우시안 프로세스를 이용했다.

앞서 설명한 모델들은 원하는 분자의 특성을 제어하기 위해 베이지안 최적화를 도입해 잠재 공간상에서 최적화를 진행했다. 이후 소개할 다른 두 논문은 이와는 달리 분자의 특성 정보를 모델에 바로 적용한다.

Lim은 조건부(conditional) VAE를 이용해 분자의 성질을 직접적으로 조절하는 모델을 만들었다. VAE의 인풋으로 SMILES와 분자 성질들을 함께 넣어 인코딩하는 것이다. 그 후 디코더는 병목과 인코더에 넣었던 성질들을 함께 인풋으로 받아서 디코딩을 진행한다.

해당 논문에서는 MW(molecular weight), LogP(partition coefficient), HBD(number of hydrogen bond donor), HBA(number of hydrogen acceptor), TPSA(topological polar surface area), 이렇게 총 다섯 가지 성질들을 동시에 제어했다.

Kang은 SSVAE(Semi-supervised variational autoencoder) 아키텍처를 이용해 분자 생성모델을 만들었다. 이 논문도 Lim의 논문처럼 분자 성질을 직접 제어하는 모델이다. Lim은 분자의 성질을 RDKit에서 결정론적(deterministic)하게 계산된 값으로 사용했고 Kang은 준지도 학습(semi-supervised learning)을 통해 라벨링(labeling) 되지 않은 분자들도 직접 학습하게 만든 것이 둘의 가장 큰 차이점이다.

- GAN, RL 계열
GAN은 이미지 데이터에서 탁월한 성능을 보여줬다. 하지만 연속 데이터인 이미지와는 달리 불연속 데이터인 시퀀스 데이터에서 GAN을 바로 적용하기는 쉽지 않았다. 생성기가 만들어 내는 아웃풋(가짜 데이터)이 샘플링을 통해 나온 값인데, 샘플링 연산은 미분이 되지 않아 현재 딥러닝 쪽에서 가장 많이 쓰고 있는 최적화 방법인 경사하강법(gradient descent)으로는 생성기를 학습시킬 수 없기 때문이다.

SeqGAN 모델은 GAN과 RL을 결합해 이러한 문제를 해결했다. SeqGAN은 생성기를 RL의 에이전트로, 판별기를 보상을 주는 함수로 간주한다. 에이전트 역할을 하는 생성기는 현재까지 만들어진 (일부) 시퀀스를 상태(state)로 받고 어떤 토큰을 만들어낼지를 행동(action)으로 생각한다. 이런 방법으로 생성기를 학습하고 판별기는 기존 GAN 학습 방법을 이용해 대립적인 학습을 진행한다.

Guimaraes는 seqGAN을 기반으로 ORGAN(Objective-Reinforced Generative Adversarial Networks)을 만들었다. 판별기가 주는 아웃풋과 최적화하고자 하는 분자 성질의 선형결합을 생성기가 받는 보상으로 생각하면 원하는 분자의 성질을 제어할 수 있는 모델을 만들 수 있다. ORGAN에서는 용해성(solubility), 합성 가능성(synthetizability), 마약성(druglikeness)의 세 가지 성질들을 제어하는 모델을 만들었다.

RL은 RNN과 바로 결합해 모델을 만들 수도 있다. RNN으로 원하는 성질을 갖는 분자를 생성하기 위해서 전이학습 방법과 예측 모델을 도입해 직접 RNN의 최초 상태로 넣는 방법이 있었다. 여기서는 RL을 이용해 원하는 성질을 갖는 분자를 직접적으로 설계하는 모델을 알아보기로 한다. 대표적 모델로 REINVENT와 ReLeaSE가 있다.

Olivercrona가 만든 REINVENT는 사전 네트워크, 에이전트 네트워크 이렇게 두 개의 네트워크로 이뤄진다. 두 네트워크의 아키텍처는 3-layers GRU로 서로 같다. 사전 네트워크는 150만 개의 ChEMBL 데이터를 가지고 사전 훈련을 하고, 그 후 에이전트 네트워크 초기화에 쓰인다.

그리고 실제로 에이전트를 학습시키기 위해 원하는 분자의 성질인지를 판단하는 스코어링 함수를 정의해 강화학습의 보상으로 주고, 학습을 하면 사전 훈련으로 학습된 사전 네트워크의 일반적인 성질을 분포를 따르면서 원하는 성질을 갖는 분자를 생성할 수 있다.

Popova가 만든 ReLeaSe(Reinforcement Learning for Structural Evolution)는 분자를 생성하는 생성모델과 분자 성질을 예측하는 속성예측모델의 두 가지 네트워크로 이뤄져 있다. 좀 더 나은 표현력을 학습하기 위해 생성모델은 Stack-RNN을 사용했고 속성예측모델은 간단한 LSTM모델로 만들어져 QSAR와 비슷한 역할을 한다.

학습은 두 단계를 거쳐서 진행되는데, 첫 번째 단계에서는 두개의 모델을 각각 사전 훈련하고 두 번째 단계에서는 두 네트워크를 합쳐서 RL 방식으로 학습한다. RL 방식으로 학습할 때는 생성모델을 에이전트로 속성예측모델의 아웃풋을 보상으로 생각해 학습하게 된다. 이로써 원하는 성질을 갖는 모델을 만들 수 있다.

분자 성질을 직접 제어하고 싶을 때 RL을 많이 쓰게 된다. 보통 분자들의 특성은 SMILES 데이터로부터 미분이 되는 양들이 아니기 때문에 일반적인 모델에서는 학습이 힘들었지만, RL을 도입하면 미분 불가능 문제들이 해결되기 때문이다.

효율적인 약물 생성·찾기 도와
지금까지 생성모델을 이용한 다양한 분자 설계 모델들을 살펴봤다. RNN 계열, VAE 계열, GAN과 RL을 응용한 여러 모델들이 컴퓨터를 이용한 분자 설계 모델에 많이 응용됐다. 드누보 생성뿐만 아니라 원하는 성질을 갖는 분자를 생성하기 위해 전이학습, 베이지안 최적화, 조건부 모델 및 RL을 함께 사용했다. 다양한 모델들의 발달은 광활한 화학 공간상에서 원하는 화학 공간을 찾을 수 있게 도와주고, 효율적인 약물 생성 또는 찾기를 가능하게 해준다.

우리는 지금까지 SMILES 기반 모델에 대해서만 알아봤다. 하지만 분자를 표현할 수 있는 방법은 여러 가지가 있기 때문에 특정 태스크에 맞는 표현 방법을 잘 선택해서 모델링하면 더 좋은 성능을 얻을 수 있을 것이다. 특히 요즘은 비정형 데이터인 그래프 형태의 데이터를 분석할 수 있는 GNN(Graph Neural Networks) 기법도 많이 연구되고 있다. 그래서 분자 설계 쪽에서도 그래프 구조를 바로 이용한 모델들에 대한 연구도 증가하고 있다.

많은 모델에 대한 개괄적으로 설명했지만 특정 모델이 다른 모델에 비해 항상 우위에 있는 것은 아니다. 그만큼 분자 생성모델을 정량적으로 평가하는 것이 어렵기 때문이며, 또한 평가에 대한 의견이 아직 합의를 충분히 이루지 못했기 때문이다. 최근에는 모델을 서로 비교할 수 있는 벤치마크 데이터 셋 및 정량적인 평가방법에 대해서도 활발하게 논의 중이다.

필자가 근무하고 있는 ‘AI를 활용한 신약개발 스타트업 팜캐드’에서는 회사 이름 (PharmCADD)에서 드러나듯 컴퓨터를 이용한 신약개발을 하고 있다. 인공지능을 이용한 분자설계, 분자 도킹, 분자 시뮬레이션, 네트워크 이론 등 여러 방법론을 통해 신약개발에 힘을 쏟고 있다. 그중에서 신약개발 프로세스 중 제일 앞단인 드누보 분자설계 부분에 인공지능을 사용해 파이프라인을 구축했으며 고도화에 집중하고 있다. 앞서 소개한 SMILES 기반 모델들 이외에도 그래프 구조 기반 모델들도 연구 중에 있으며 분자설계 이외의 신약개발 프로세스에도 인공지능을 적용하는 연구를 진행 중이다.

컴퓨터 기반의 신약개발 기술이 빠르게 발전해 앞으로 개발되는 신약들은 시간과 비용을 획기적으로 줄일 수 있는 날이 오길 기대해본다.



댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 1
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.
배대훈 2021-04-25 23:07:43
좋은 기사 감사합니다. 관련 내용들을 쉽게 이해할 수 있었습니다!