맨위로가기

래킷 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

래킷은 1990년대 중반 마티아스 펠라이센에 의해 시작된 PLT 프로젝트에서 개발된 다목적 프로그래밍 언어이다. 초보 프로그래머를 위한 교육 자료 제작을 목표로 시작되었으며, Scheme을 기반으로 한 프로그래밍 환경인 DrRacket을 개발했다. 래킷은 매크로, 모듈, 클로저, 꼬리 재귀 등 다양한 특징을 가지고 있으며, 강력한 매크로 시스템을 통해 언어 확장이 가능하다. 또한, 자체 IDE인 DrRacket을 제공하며, 스크립팅 도구로도 활용된다. 2010년 PLT Scheme에서 래킷으로 이름이 변경되었으며, 현재는 Chez Scheme 런타임 시스템을 사용하는 Racket CS를 기본 구현으로 제공한다. 래킷은 프로그래밍 언어 연구, 상업 프로젝트, 웹 애플리케이션 등 다양한 분야에서 사용되고 있다.

2. 역사

마티아스 펠라이센이 1990년대 중반 초보 프로그래머를 위한 교육용 자료 제작을 위해 PLT Inc.를 설립하면서 래킷의 역사가 시작되었다. 1995년 1월, PLT는 교육용 프로그래밍 환경 개발을 결정하고, 매튜 플랫이 libscheme의 MrEd와 wxWidgets 등을 묶어 개발을 시작했다.

이후 로비 핀들러, Shriram Krishnamurthi, Cormac Flanagan 등이 팀에 합류하여 DrScheme을 개발했다. DrScheme은 Scheme 초보자를 위한 프로그래밍 환경이자 소프트 타이핑 실험 환경이었다. PLT 팀은 고등학교 교사 대상 워크숍을 통해 프로그램 디자인과 함수 프로그래밍을 교육하고, 교류를 통해 개발 방향을 설정했다.

2001년, 핵심 팀(Felleisen, Findler, Flatt, Krishnamurthi)은 프로그래밍 교육 철학을 담은 ''프로그램 디자인 방법''을 출판했다. 2010년 6월 7일, PLT Scheme은 Racket으로 개명되었다.[66]

2. 1. 개발

마티아스 펠라이센은 1990년대 중반, 초보 프로그래머를 위한 교육 자료를 제작하고 Scheme 기반 교육용 프로그래밍 환경을 개발하기 위해 PLT Inc.를 설립했다. 1995년 1월, PLT는 매튜 플랫이 libscheme,[18] wxWidgets 등을 이용하여 만든 Racket의 초기 가상 머신인 MrEd를 개발했다.[19]

이후 로버트 브루스 핀들러, 슈리람 크리슈나무르티 등 여러 개발자들이 참여하여 초보 Scheme 프로그래머를 위한 프로그래밍 환경이자 점진적 타이핑 연구 환경인 DrScheme (현 DrRacket)을 개발했다.[20] PLT는 고등학교 교사 대상 워크숍을 통해 현장 테스트를 진행하며 개발 방향을 설정했다.

2001년, PLT 핵심 팀은 교육 철학을 담은 첫 교과서인 ''프로그램 설계 방법''을 출판했다. 2010년 6월 7일, PLT Scheme은 Racket으로 이름이 변경되었다.[25]

2. 2. 버전 역사

PLT 프로젝트는 1990년대 중반 Matthias Felleisen에 의해 연구 그룹으로 처음 시작되었으며, 곧 초보 프로그래머를 위한 교육용 자료 제작에 주력했다. 1995년 1월, 이 그룹은 교육용 프로그램 환경을 개발하기로 결정했다. 매튜 플랫은 libscheme의 MrEd와 wxWidgets 등을 묶었다. 이후 몇 년에 걸쳐 플랫, 로비 핀들러, Shriram Krishnamurthi, Cormac Flanagan 등 여러 사람들의 팀에 의해 Scheme 초보자용 프로그래밍 환경이자 소프트 타이핑 실험 환경인 DrScheme이 만들어졌다.[66]

PLT 팀은 고등학교 교사를 위한 워크숍을 열어 프로그램 디자인과 함수 프로그래밍을 지도했으며, 교사와 학생들과의 교류는 개발 방향 설정에 중요한 단서를 제공했다.[66]

이후 교육용 언어, algebraic stepper, 투명한 REPL, constructor-based printer 등 많은 개선점이 DrScheme에 추가되어 애플리케이션으로서 충분한 질을 갖춘 교육적 프로그래밍 개발 환경이 완성되었다. 2001년에는 핵심 팀(Felleisen, Findler, Flatt, Krishnamurthi)에 의해 프로그래밍 교육 사상에 기반한 첫 교과서인 ''프로그램 디자인 방법''이 출판되었다.[66]

2010년 6월 7일, PLT Scheme은 Racket으로 이름을 변경했다.[66]

3. 특징

래킷의 핵심 언어는 매크로, 모듈, 렉시컬 클로저, 꼬리 재귀, 구분된 연속체, 파라미터(유동 변수), 소프트웨어 계약[36], 그린 스레드 및 OS 스레드[37][38][39] 등을 포함한다. 이벤트 공간 및 관리자와 같은 기본 요소를 통해 운영 체제처럼 작동하여 리소스 관리를 제어하고 다른 프로그램을 로드 및 관리할 수 있다.

강력한 매크로 시스템은 모듈 시스템 및 사용자 정의 파서와 함께 언어의 모든 측면을 제어하는 언어 확장을 생성할 수 있게 한다.[40] 래킷 언어 구성의 대부분은 기본 언어의 매크로로 구현된다. 여기에는 믹스인 클래스 시스템[13], ML 모듈 시스템에서 불투명한 할당만큼 표현력이 풍부한 구성 요소(또는 모듈) 시스템[14], 패턴 매칭이 포함된다.

고차 프로그래밍 언어를 위한 최초의 계약 시스템을 갖추고 있다.[41] 래킷의 계약 시스템은 Eiffel의 계약에 의한 설계 작업을 기반으로 하며, 일급 함수, 객체, 참조 셀 등과 같은 고차 값을 위해 작동하도록 확장되었다.

바이트코드 및 JIT (JIT) 컴파일러를 모두 포함한다. 바이트코드 컴파일러는 래킷 가상 머신에서 실행되는 내부 바이트코드 형식을 생성하고, JIT 컴파일러는 런타임에 바이트코드를 기계어로 변환한다.

2004년부터 2014년까지는 패키지 관리자 PLaneT과 함께 제공되어 타사 라이브러리를 투명하게 가져와 사용할 수 있었다. PLaneT에는 종속성 지옥을 방지하기 위한 내장된 버전 관리 정책이 있었다.[42] 2014년 이후에는 새로운 패키징 시스템으로 대체되었다.[43]

래킷은 확장성 기능을 통합하여 특정 도메인 및 범용 언어를 구축할 수 있다는 점에서 Lisp 계열의 다른 언어와 가장 뚜렷하게 구별된다. 래킷의 확장성 기능은 구문에 대한 컨텍스트 종속적이고 모듈 수준의 제어를 허용하도록 모듈 시스템에 내장되어 있다.[15]

모듈 수준 확장성 기능은 Scheme과 유사한 위생 매크로 시스템과 결합되어 Lisp의 s-표현식 조작 시스템보다 더 많은 기능을 제공한다.[44][45]

래킷의 ''매크로'' 시스템은 전체 언어 방언을 구성하는 데 사용되었다. 여기에는 타입이 지정되지 않은 코드에서 타입 코드로의 마이그레이션을 용이하게 하는 점진적으로 타입이 지정된 래킷 방언인 Typed Racket[46], 지연 평가를 사용하는 방언인 Lazy Racket[47], 그리고 Haskell과 Racket을 결합한 Hackett이 포함된다.[48] 교육용 프로그래밍 언어인 Pyret은 원래 Racket으로 구현되었다.[49][50]

다른 방언으로는 FrTime (함수형 반응형 프로그래밍), Scribble (문서 언어),[51] Slideshow (프레젠테이션 언어),[52] 및 교육용 언어 여러 개가 있다.[53][54]

래킷의 핵심 배포판은 프로그래밍 언어 개발을 돕는 라이브러리를 제공한다.[15] 이러한 언어는 s-표현식 기반 구문으로 제한되지 않는다. 기존의 readtable 기반 구문 확장 외에도, 지시어 #lang은 parser tools 라이브러리를 사용하여 구현할 수 있는 임의의 파서 호출을 가능하게 한다.[55]

4. 프로그래밍 환경

래킷 언어 플랫폼은 자체 IDE인 DrRacket과 웹 서버, 그래픽 사용자 인터페이스 등 다양한 도구들을 제공한다. 일반적인 스크립트 언어처럼 실행 가능한 스크립팅 도구로 사용될 수 있으며, 유닉스 셸 스크립팅에도 활용 가능하다. 또한 명령줄 인수를 파싱하고 외부 도구를 실행할 수 있다.

시간이 지나면서 래킷은 유용한 스크립팅 도구가 되었으며, 현재 다음과 같은 도구를 제공한다.

도구 종류
유닉스 셸 스크립팅
웹 서버
프레젠테이션 도구
그래픽 툴킷



래킷은 표준적인 스크립트 언어에 갖춰져 있는 라이브러리를 갖추고 있다. 2004년 이후, PLT는 표준 모듈 시스템과 연동된 웹 기반 코드 저장소인 PLaneT을 운영하고 있다.

4. 1. DrRacket IDE

DrRacket(이전 DrScheme)은 초급 컴퓨터 과학 강좌에서 널리 사용되는 IDE이다. 구문 강조, 괄호 일치, 디버거, 대수적 스텝퍼 등 다양한 기능을 제공한다.[20][21] 학생 친화적인 기능으로는 여러 "언어 레벨"(초급, 중급 등)을 지원하며, 통합 라이브러리 지원, 고급 프로그래머를 위한 정교한 프로그램 분석 도구도 제공한다. 모듈 브라우저, 윤곽 보기, 통합 소프트웨어 테스트 및 결함 커버리지 측정, 리팩토링을 지원하여 모듈형 프로그래밍을 돕는다. 또한, "Help Desk"라는 광범위한 하이퍼링크 도움말 시스템에 통합된 컨텍스트 감지 접근 방식을 제공한다.

DrRacket은 마이크로소프트 윈도우, macOS, 유닉스, 리눅스에서 X Window System과 함께 사용할 수 있으며, 모든 플랫폼에서 프로그램이 유사하게 작동한다.

5. 코드 예제

다음은 간단한 헬로 월드 프로그램이다.

```racket

#lang racket

"Hello, World!"

```

이 프로그램을 실행하면 다음과 같이 출력된다.

:"Hello, World!"

다음은 조금 덜 간단한 프로그램이다.

이 프로그램의 결과. DrRacket에서 표시한 모습.


```racket

#lang racket

(require 2htdp/image)

(let sierpinski ([n 8])

(if (zero? n)

(triangle 2 'solid 'red)

(let ([t (sierpinski (- n 1))])

(freeze (above t (beside t t))))))

```

래킷 웹사이트에서 가져온 이 프로그램은 심도 8까지 중첩(nested)된 시에르핀스키 삼각형을 그린다.

`#lang` 디렉티브를 사용하여 각기 다른 래킷으로 소스 파일을 생성할 수 있다. 다음은 래킷의 정적 타이핑 변종인 Typed Racket에서의 팩토리얼 프로그램의 예시이다.

```racket

#lang typed/racket

(: fact (Integer -> Integer))

(define (fact n)

(if (zero? n) 1 (* n (fact (- n 1)))))

6. 구현

래킷은 현재 두 가지 구현을 제공한다. 둘 다 다양한 아키텍처에서 리눅스, 윈도우, macOS를 지원하며, 버전 8.8 (2023)에서 지원된다. 기본 구현은 Chez Scheme 점진적 컴파일러와 런타임을 사용한다. 다른 구현은 플랫폼 독립적인 바이트코드를 생성하고 로드 시점에 기계 코드를 생성하기 위해 JIT 컴파일을 사용한다.[56]

실험적인 구현은 다음과 같다.


  • RacketScript는 Racket에서 JavaScript (ES6)로 컴파일하는 실험적인 컴파일러이다. 프로그래머가 JavaScript와 Racket의 생태계를 모두 사용할 수 있도록 하며, 이 상호 운용성을 최대한 원활하게 만드는 것을 목표로 한다.[57]
  • Pycket은 RPython 프레임워크를 사용하여 생성된 Racket 구현이다.[58]

7. 응용 및 실제 사용

래킷은 프로그래밍 언어 이론을 기반으로 하면서도 실용적인 시스템을 위한 다목적 언어로 설계되었다. 따라서 래킷 배포판은 시스템 및 네트워크 프로그래밍, 웹 개발,[59] 기본 운영 체제에 대한 통합 인터페이스, 동적 외부 함수 인터페이스,[60] 여러 종류의 정규 표현식, 렉서/파서 생성기,[55] 논리 프로그래밍, 그리고 완전한 GUI 프레임워크를 포괄하는 광범위한 라이브러리를 갖추고 있다.

래킷은 상업용 언어에 유용한 몇 가지 기능을 가지고 있는데, 여기에는 Windows, macOS 및 Unix에서 독립 실행형 실행 파일을 컴파일하는 기능, 프로파일러디버거통합 개발 환경(IDE)에 포함되어 있으며, 단위 테스트 프레임워크가 있다.

래킷은 상업 프로젝트 및 웹 애플리케이션에 사용되어 왔다. 주목할 만한 예로는 아크로 구동되는 해커 뉴스 웹사이트가 있는데, 아크는 래킷으로 개발되었다. 너티 독은 여러 비디오 게임에서 스크립팅 언어로 사용했다.[61]

래킷은 부트스트랩 프로그램에서 게임 디자인을 통해 학생들에게 대수학을 가르치는 데 사용된다.[62]

8. 연구

래킷은 함수형 코어 언어에 믹스인(mixin) 클래스 시스템, Standard ML과 같이 세련되고 표현력 있는 컴포넌트(모듈) 시스템, 고차 언어용으로는 최초의 컨트랙트 시스템[67], 메타 프로그래밍을 위한 강력한 매크로 시스템, 실용적인 시스템으로 처음으로 구현된 부분 연속 등을 자유롭게 통합하고 있다.

가장 주목할 만한 특징은 매크로 시스템이다. 래킷의 매크로 시스템은 전통적인 Lisp의 S식 조작 매크로 시스템[68][69]이나, Scheme 84의 하이진(hygiene)한 extend-syntax 매크로, R5RS의 syntax-rules 구문과 비교해도 강력한 표현력을 가지고 있다. 실제로 매크로는 주의 깊게 조정된 컴파일러 확장 API라고 해도 과언이 아니다. 이 컴파일러 API를 사용함으로써 프로그래머는 기능 추가와 도메인 특화 언어 자체의 추가를 할 수 있다. 그러한 기능은 내장된 언어 요소와 완전히 구별할 수 없을 정도로 환경에 통합된다. 예를 들어, 래킷의 라이브러리에서는 클래스 객체 시스템과 컴포넌트 시스템은 매크로로 구현되어 있다.

또한 래킷은 프로그래밍 언어에 관한 실험뿐만 아니라, 프로그래밍 패턴, 인터랙티브 웹 프로그래밍, 리팩토링 등의 토픽을 조사하기 위한 기반 환경으로 사용되었다.

9. 스크립트 언어로서의 래킷

래킷은 유닉스 셸 스크립팅, 웹 서버, 프레젠테이션 도구, 그래픽 툴킷 등 스크립팅 도구로 유용하게 사용된다.[1] 래킷은 표준적인 스크립트 언어가 갖추고 있는 라이브러리를 갖추고 있다.[1] 2004년 이후, PLT는 표준 모듈 시스템과 연동된 웹 기반 코드 저장소 PLaneT을 운영했었다.[1] (현재는 새로운 패키징 시스템으로 대체됨)

참조

[1] 웹사이트 DLS 2010: Contracts for First-Class Classes http://www.ccs.neu.e[...]
[2] 학위논문 A Practical Optional Type System for Clojure The University of Western Australia
[3] 웹사이트 Planet2 questions https://mail.mozilla[...]
[4] 웹사이트 Rust Bibliography https://github.com/r[...] 2022-11-23
[5] 웹사이트 Revised6 Report on the Algorithmic Language Scheme (R6RS) http://www.r6rs.org Scheme Steering Committee 2011-09-13
[6] 웹사이트 Completing Racket's relicensing effort https://blog.racket-[...] 2019-12-27
[7] 웹사이트 DrRacket Files https://docs.racket-[...] 2019-07-21
[8] 학술지 The Racket Manifesto https://www2.ccs.neu[...] 2015
[9] 웹사이트 Dialects of Racket and Scheme http://docs.racket-l[...] 2011-08-15
[10] 웹사이트 Welcome to Racket http://docs.racket-l[...] 2019-05-15
[11] 뉴스 The TeachScheme! Project: Computing and Programming for Every Student http://www.ccs.neu.e[...]
[12] 웹사이트 Overview http://programbydesi[...] Program by Design 2011-08-17
[13] 학술대회 Scheme with Classes, Mixins, and Traits http://www.ccs.neu.e[...]
[14] 학술대회 Units: Cool Modules for Hot Languages http://www.ccs.neu.e[...]
[15] 학술대회 Languages as Libraries http://www.ccs.neu.e[...]
[16] 학술지 A Programmable Programming Language https://cacm.acm.org[...] 2018
[17] 웹사이트 Racket: Software License http://download.rack[...] 2015-10-20
[18] 학술대회 libscheme: Scheme as a C Library https://www.usenix.o[...] USENIX Association 2013-07-07
[19] 웹사이트 Rebuilding Racket's Graphics Layer http://blog.racket-l[...] 2010-12-08
[20] 학술지 DrScheme: A Programming Environment for Scheme http://www.ccs.neu.e[...]
[21] 학술대회 Modeling an Algebraic Stepper http://www.ccs.neu.e[...]
[22] 웹사이트 Racket Core Release Notes http://docs.racket-l[...] 2012-04-15
[23] 학술대회 Composable and Compilable Macros
[24] 웹사이트 PLT Scheme version 4.0 http://blog.racket-l[...] 2012-08-07
[25] 웹사이트 From PLT Scheme to Racket http://racket-lang.o[...] Racket-lang.org 2011-08-17
[26] 웹사이트 Racket 5.2 http://blog.racket-l[...] PLT, Inc 2012-06-16
[27] 웹사이트 Submodules http://blog.racket-l[...] 2012-08-07
[28] 웹사이트 Racket 5.3 http://blog.racket-l[...] PLT, Inc 2012-08-07
[29] 웹사이트 Racket 5.3.1 http://blog.racket-l[...] PLT, Inc 2012-11-07
[30] 웹사이트 Racket 6.0 http://blog.racket-l[...] PLT, Inc 2016-02-23
[31] 웹사이트 Racket-on-Chez Status: January 2018 https://blog.racket-[...] 2018-04-13
[32] 웹사이트 building Racket on Chez Scheme (Experience Report) https://www.cs.utah.[...] 2019-07-25
[33] 웹사이트 Racket 7.5 release https://hub.packtpub[...] 2019-11-28
[34] 웹사이트 Racket v7.5 https://blog.racket-[...] 2019-11-28
[35] 웹사이트 Racket v8.0 https://blog.racket-[...]
[36] 웹사이트 Contracts http://docs.racket-l[...]
[37] 웹사이트 Threads http://docs.racket-l[...]
[38] 웹사이트 Futures http://docs.racket-l[...]
[39] 웹사이트 Places http://docs.racket-l[...]
[40] 뉴스 Creating Languages in Racket http://cacm.acm.org/[...] 2012-04-08
[41] 간행물 Contracts for Higher-Order Functions http://www.eecs.nort[...]
[42] 간행물 Component Deployment with PLaneT: You Want it Where?
[43] 웹사이트 The Racket package system and Planet http://blog.racket-l[...]
[44] 간행물 Composable and Compilable Macros, You Want it When? http://www.cs.utah.e[...]
[45] 문서 Macros that Work Together; Compile-Time Bindings, Partial Expansion, and Definition Contexts http://www.cs.utah.e[...]
[46] 간행물 The Design and Implementation of Typed Scheme
[47] 간행물 Laziness Without All the Hard Work: Combining Lazy and Strict Languages for Teaching
[48] 웹사이트 The Hackett Programming Language https://lexi-lambda.[...] 2019-06-16
[49] 웹사이트 The Pyret Code; or A Rationale for the Pyret Programming Language http://pyret.org/pyr[...] 2019-06-16
[50] 웹사이트 Programming and Programming Languages https://papl.cs.brow[...] 2019-06-16
[51] 간행물 Scribble: Closing the Book on Ad Hoc Documentation Tools
[52] 간행물 Slideshow: Functional Presentations
[53] 간행물 A Functional I/O System (or Fun for Freshman Kids) http://www.ccs.neu.e[...]
[54] 논문 The Structure and Interpretation of the Computer Science Curriculum http://www.ccs.neu.e[...]
[55] 웹사이트 Parser Tools: lex and yacc-style Parsing http://docs.racket-l[...] 2011-08-16
[56] 문서 Implementations https://docs.racket-[...]
[57] 문서 RacketScript https://docs.racket-[...]
[58] 문서 Pycket https://github.com/p[...]
[59] 논문 Implementation and Use of the PLT Scheme Web Server http://www.ccs.neu.e[...]
[60] 간행물 Foreign Interface for PLT Scheme http://www.ccs.neu.e[...]
[61] 웹사이트 Functional mzScheme DSLs in Game Development http://cufp.org/conf[...] 2012-05-08
[62] 웹사이트 Bootstrap http://www.bootstrap[...] 2015-08-11
[63] 블로그 Racket v8.11.1 https://blog.racket-[...] Racketブログ
[64] 문서 Program by Design: Overview http://programbydesi[...]
[65] 문서 PLaneT: Racket's centralized package distribution system http://planet.racket[...]
[66] 문서 From PLT Scheme to Racket http://racket-lang.o[...]
[67] 문서 Contracts for Higher-Order Functions http://www.eecs.nort[...]
[68] 문서 Composable and Compilable Macros, You Want it When? http://www.cs.utah.e[...]
[69] 문서 Macros that Work Together; Compile-Time Bindings, Partial Expansion, and Definition Contexts http://david.darais.[...]
[70] 웹인용 DLS 2010: Contracts for First-Class Classes http://www.ccs.neu.e[...]
[71] 학위논문 A Practical Optional Type System for Clojure The University of Western Australia
[72] 웹인용 Planet2 questions https://mail.mozilla[...] 2020-02-16
[73] 웹인용 Rust Bibliography https://github.com/r[...]
[74] 웹인용 Revised6 Report on the Algorithmic Language Scheme (R6RS) http://www.r6rs.org/ Scheme Steering Committee 2007-08
[75] 웹인용 Completing Racket's relicensing effort https://blog.racket-[...] 2019-11-15
[76] 웹인용 DrRacket Files https://docs.racket-[...] 2019-07-21
[77] 웹인용 Welcome to Racket http://docs.racket-l[...] 2011-08-15
[78] 웹인용 Dialects of Racket and Scheme http://docs.racket-l[...] 2011-08-15
[79] 컨퍼런스 Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine)
[80] 저널 DrScheme: A Programming Environment for Scheme http://www.ccs.neu.e[...]
[81] 뉴스 The TeachScheme! Project: Computing and Programming for Every Student http://www.ccs.neu.e[...]
[82] 웹인용 Overview http://programbydesi[...] Program by Design
[83] 웹인용 Macros Matter http://blog.racket-l[...] 2007-05-03
[84] 컨퍼런스 Scheme with Classes, Mixins, and Traits http://www.ccs.neu.e[...]
[85] 컨퍼런스 Units: Cool Modules for Hot Languages http://www.ccs.neu.e[...]
[86] 컨퍼런스 Languages as Libraries http://www.ccs.neu.e[...]
[87] 웹인용 Racket: Software License http://download.rack[...] 2015-10-20



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com