Ruby : 연결없이 여러 줄로 된 문자열을 쓸 수 있습니까?


397

좀 더 나아 보이게하는 방법이 있습니까?

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

연결을 암시하는 방법이 있습니까?


28
SQL 주입 공격에주의하십시오. :)
Roy Tinker

답변:


595

이 답변에는 내가 필요로하는 것을 얻는 데 도움이되는 조각이 있습니다 (추가 공백없이 쉬운 여러 줄 연결). 그러나 실제 답변이 없었기 때문에 여기에서 컴파일하고 있습니다.

str = 'this is a multi-line string'\
  ' using implicit concatenation'\
  ' to prevent spare \n\'s'

=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"

보너스로 재미있는 HEREDOC 구문을 사용하는 버전 있습니다 ( 이 링크 를 통해 ).

p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM     users
         ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"

후자는 대부분 처리에 더 많은 유연성이 필요한 상황에 적합합니다. 나는 개인적으로 그것을 좋아하지 않습니다. 문자열이 이상한 장소에 처리를합니다 (즉, 그 앞에 있지만 보통 이후에 오는 인스턴스 메소드를 사용합니다). 마지막 END_SQL식별자를 들여 쓰는 경우 (일반적으로 함수 또는 모듈에있을 수 있으므로) 하이픈이있는 구문 (즉, p <<-END_SQL대신 p <<END_SQL) 을 사용해야합니다 . 그렇지 않으면 들여 쓰기 공백으로 인해 식별자가 문자열의 연속으로 해석됩니다.

이것은 많은 타이핑을 저장하지는 않지만 + 기호를 사용하는 것보다 나아 보입니다.

또한 (몇 년 후 편집에서 말합니다) Ruby 2.3 이상을 사용하는 경우 << ~ 연산자 도 사용할 수 있으며 최종 문자열에서 들여 쓰기가 추가로 제거됩니다. .gsub이 경우 호출 을 제거 할 수 있어야합니다 (시작 들여 쓰기 및 최종 요구에 따라 다를 수 있음).

편집 : 하나 더 추가 :

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"

2
이것은 오래된 질문이지만 대답에 오류가 있거나 그 이후 구문이 변경되었습니다. p <<END_SQL해야한다 p <<-END_SQL그렇지 않으면이는 대답이다. 선택적으로 구불 구불 한 HEREDOC 연산자를 사용하여 선행 공백을 제거 할 수 있습니다.<<~END_SQL
jaydel

끝 식별자가 들여 쓰기되는 경우에만 오류입니다 (하이픈은 루비 인터프리터에게 끝 식별자를 결정하기 전에 공백을 자르도록 지시합니다). 그래도 언급하는 메모를 넣을 수 있습니다. 또한 ~는 불필요하며 gsub \ s + 및 strip은 이미 선행 공백을 제거합니다.
A. Wilson

<<~답변에 추가하면 좋을 것입니다. 개인적으로, 나는 <<~MSG.strip ... MSG또한 마지막을 제거합니다 \n.
Qortex

1
이 답변을 썼을 때 (9 년 전, sheesh!) Ruby는 1.9에 있었고 << ~ (분명히) 2.3까지 소개되지 않았습니다. 어쨌든 고대의 역사는 제쳐두고 그것을 가져 주셔서 감사합니다.
A. Wilson

바꿈을 추가하지 않는 몇 가지 답변 중 하나가되어 주셔서 감사합니다 .이 질문을 찾았을 때 피하려고했습니다.
Josh

174

루비 2.0에서는 이제 사용할 수 있습니다 %

예를 들면 다음과 같습니다.

SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}

14
Ruby 1.9.3에서도 작동합니다.
Andy Stewart

26
이 구문으로 작성된 문자열에는 줄 바꾸기 및 후속 줄에 추가 된 들여 쓰기가 모두 포함됩니다.
제임스

이것은 << EOT ...... EOT (여기 문서)보다 훨씬 좋습니다! 필요한 경우 보간도 수행합니다.
Nasser

1
@Nasser A heredoc도 보간을 수행합니다.
기금 모니카의 소송

3
Rails를 사용하는 경우 squish출력에 도움이됩니다.
Jignesh Gohel

167

예, 추가 줄 바꿈이 마음에 들지 않으면 :

 conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc,
            where etc etc etc etc etc etc etc etc etc etc etc etc etc'

또는 heredoc을 사용할 수 있습니다 .

conn.exec <<-eos
   select attr1, attr2, attr3, attr4, attr5, attr6, attr7
   from table1, table2, table3, etc, etc, etc, etc, etc,
   where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

87
당신은 또한 사용할 수 있습니다%Q(...)
BaroqueBobcat

3
@Zombies : 줄 바꿈은 일반적으로 SQL 문에서 허용되며 그냥 일반 공백으로 취급됩니다.
Mark Byers

2
예를 들어 아래의 대답을 참조하십시오. 지금 %를 사용할 수 있습니다.
Robbie Guilfoyle

4
당신은 또한 사용할 수 있습니다%(...)
제로 제수

1
의도적으로 후행 공백을 추가하고 이러한 솔루션 중 하나를 사용하는 경우 명심해야 할 중요한 점 은 파일을 저장할 때 편집기가 후행 공백을 자동으로 제거 할 수 있다는 입니다. 일반적으로이 동작을 선호하지만 몇 번이나 예기치 않은 문제가 발생했습니다. 해결책은 질문에서 OP가 한 것처럼 멀티 라인 문자열을 작성하는 것입니다.
Dennis

50

이미 읽은 것처럼 여러 줄 문자열에 대한 여러 구문이 있습니다. 내가 가장 좋아하는 것은 Perl 스타일입니다.

conn.exec %q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
      from table1, table2, table3, etc, etc, etc, etc, etc,
      where etc etc etc etc etc etc etc etc etc etc etc etc etc}

여러 줄로 된 문자열은 % q로 시작하고 그 뒤에 {, [또는 (가 들어간 뒤에 해당하는 반전 문자로 종료됩니다. % q는 보간을 허용하지 않습니다. % Q는 다음과 같이 쓸 수 있습니다.

conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
      from #{table_names},
      where etc etc etc etc etc etc etc etc etc etc etc etc etc}

실제로 이러한 종류의 여러 줄 문자열이 어떻게 호출되는지 전혀 알지 못하므로 Perl 여러 줄이라고 부르겠습니다.

그러나 Mark와 Peter가 제안한대로 Perl multiline 또는 heredocs를 사용하든 잠재적으로 불필요한 공백이 생길 수 있습니다. 필자의 예제와 예제에서 "from"및 "where"줄에는 코드에서 들여 쓰기로 인해 선행 공백이 포함됩니다. 이 공백이 바람직하지 않은 경우 지금하는 것처럼 연결된 문자열을 사용해야합니다.


4
% q {}를 사용한 것처럼이 예제에서는 # {table_names}에서 작동하지 않습니다. % q [] 또는 ()를 사용하면 작동합니다.
MatthewFord

2
이 정맥에서 내가 가장 좋아하는 것은 보간법 지원 % {super multiline string}
Duke

%q패밀리 에서 생성 된 문자열 은 원래 코드와 동일하지 않은 개행을 포함합니다.
조쉬

29

때때로 \n다음과 같은 줄 바꾸기 문자를 제거 할 가치가 있습니다 .

conn.exec <<-eos.squish
 select attr1, attr2, attr3, attr4, attr5, attr6, attr7
 from table1, table2, table3, etc, etc, etc, etc, etc,
 where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

5
이것은 루비가 아닌 레일을 기반으로합니다
a14m

23

큰 따옴표를 사용할 수도 있습니다

x = """
this is 
a multiline
string
"""

2.3.3 :012 > x
 => "\nthis is\na multiline\nstring\n"

줄 바꿈 "\ n"을 제거해야하는 경우 각 줄 끝에 백 슬래시 "\"를 사용하십시오.


5
단수 큰 따옴표로 동일한 결과를 얻을 수 있습니다. 루비에는 삼중 큰 따옴표와 같은 것이 없습니다. 그냥로 해석합니다 "" + "double quotes with some content" + "".
rakvium

예, 그러나` ""+ "\ n hello \ n"+ ""이상하게 보입니까
juliangonzalez

1
그렇습니다. 이상하게 보이므로 동일한 결과로 단수 큰 따옴표를 사용할 수있을 때 여분의 큰 따옴표를 추가 할 이유가 없습니다.
rakvium

예, 더하기 부호를 의미했습니다. 작은 따옴표는 작은 따옴표 대신 잘 읽히고 쉽게 읽을 수 있으며 작은 줄 문자열에 사용해야합니다.
juliangonzalez

1
나는 ( "x"보다 """x"""기본적으로 같은 ""+"x"+"") 또는 """""x"""""( 와 같은 ) 보다 더 잘 보이고 더 빨리 작동 한다는 것을 의미합니다 "" + "" + "x" + "" + "". 여러 줄 문자열이 필요할 때 """대신 사용 하는 Python이 아닌 Ruby "입니다.
rakvium

15
conn.exec = <<eos
  select attr1, attr2, attr3, attr4, attr5, attr6, attr7
  from table1, table2, table3, etc, etc, etc, etc, etc,
  where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

1
'<<-eos'에서와 같이 '-'없이 heredoc을 사용하면 추가 리더 공간이 포함됩니다. Mark Byers의 답변을 참조하십시오.
아이브스

heredoc은 원래 코드와 다른 개행을 포함합니다.
Josh

15

다른 옵션:

#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM

puts multiline_string

#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF

puts message

1
변경 안 <<EOM<<-EOM더?
kingPuppy

어쩌면 그것은 내 <<-EOF예 에서 효과가있는 것처럼 보였습니다 . 내 생각 엔 어느 쪽이든 작동합니다.
Alex Cohen

heredoc은 원래 코드와 다른 개행을 포함합니다.
Josh

11

최근 Ruby 2.3의 새로운 기능을 squiggly HEREDOC사용하면 최소한의 변경으로 여러 줄 문자열을 멋진 방식으로 작성할 수 있으므로 .squish(레일을 사용하는 경우)이 줄을 사용하면 여러 줄을 멋진 방식으로 작성할 수 있습니다! 루비를 사용 <<~SQL.split.join(" ")하는 경우 거의 동일한 작업을 수행 할 수 있습니다

[1] pry(main)> <<~SQL.squish
[1] pry(main)*   select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)*   from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)*   where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 from table1, table2, table3, etc, etc, etc, etc, etc, where etc etc etc etc etc etc etc etc etc etc etc etc etc"

심판 : https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc


squish는 루비가 아닌 레일입니다
Josh

1
@ 조쉬, 그래 맞아 대답을 업데이트, 응원.
Mark Jad

6
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' <<
        'from table1, table2, table3, etc, etc, etc, etc, etc, ' <<
        'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

<<는 문자열의 연결 연산자입니다


2
+일반 연결 연산자이다 <<는 IS 현재 위치에서 APPEND 연산자. 리터럴에 부작용을 사용하면 여기에서 작동하지만 (첫 번째 문자열은 두 번 수정되어 반환됩니다) IMHO 그것은 이상하고 이중 복용을 +할 수있게 해줍니다. 하지만 어쩌면 나는 ... 루비에 단지 새로운이야
베니 Cherniavsky-Paskin

frozen_string_literal활성화 하면 작동하지 않습니다
Raido

6

당신이 경우에 마음 여분의 공백과 줄 바꿈을, 당신은 사용할 수 있습니다

conn.exec %w{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
  from table1, table2, table3, etc, etc, etc, etc, etc,
  where etc etc etc etc etc etc etc etc etc etc etc etc etc} * ' '

(보간 된 문자열에 % W 사용)


나는 훨씬 더 많은 조합을 사용할 수 있기 때문에 이것을 매우 좋아합니다.
schmijos

1
이것은 인접한 여러 공간을 하나로 묶습니다. (줄 바꿈 + 뒤 따르는 들여 쓰기의 마무리는 여기에서 승리하지만 줄 중간에 놀랍습니다.)
Beni Cherniavsky-Paskin

5

각 줄의 괄호를 닫지 않으려면 백 슬래시와 함께 큰 따옴표를 사용하여 개행을 이스케이프 처리하면됩니다.

"select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
from table1, table2, table3, etc, etc, etc, etc, etc, \
where etc etc etc etc etc etc etc etc etc etc etc etc etc"

이것은이 페이지에서 실제로 질문에 대한 몇 가지 답변 중 하나입니다!
Josh

4
conn.exec [
  "select attr1, attr2, attr3, ...",
  "from table1, table2, table3, ...",
  "where ..."
].join(' ')

이 제안은 자동 들여 쓰기가 문자열의 각 부분을 적절하게 들여 쓸 수있는 여기 문서 및 긴 문자열보다 이점이 있습니다. 그러나 효율성 비용이 발생합니다.


@ Aidan, 쉼표를 백 슬래시 (la C)로 바꿀 수 있으며 조인 (또는 배열)이 필요하지 않습니다. 인터프리터는 구문 분석 시간에 문자열을 연결하여 대부분의 대안에 비해 매우 빠릅니다. . 그러나 문자열 배열을 결합 할 때의 이점 중 하나는 일부 자동 들여 쓰기가 예를 들어 here-doc 문자열이나 \보다 더 나은 작업을 수행한다는 것입니다.
Wayne Conrad

1
heredoc 구문 <<-은 적절한 들여 쓰기를 허용합니다.
A. Wilson

2

Ruby 2.3 이후의 Ruby-way (TM) : 줄 바꿈과 적절한 식별로 여러 줄 문자열을 정의하려면 구불 구불 한 HEREDOC를 사용하십시오 <<~.

conn.exec <<~EOS
            select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc
            where etc etc etc etc etc etc etc etc etc etc etc etc etc
          EOS

# -> "select...\nfrom...\nwhere..."

적절한 식별이 중요하지 않은 경우 Ruby에서 작은 따옴표와 큰 따옴표는 여러 줄에 걸쳐있을 수 있습니다.

conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 
           from table1, table2, table3, etc, etc, etc, etc, etc, 
           where etc etc etc etc etc etc etc etc etc etc etc etc etc"    

# -> "select...\n           from...\n           where..."

작은 따옴표 나 큰 따옴표가 많은 이스케이프가 필요하기 때문에 번거로울 경우 퍼센트 문자열 리터럴 표기법 %이 가장 유연한 솔루션입니다.

conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc
            where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n            from...\n            where..."

줄 바꿈을 피하는 것이 목표라면 (뒤틀린 HEREDOC, 따옴표 및 퍼센트 문자열 리터럴로 인해 발생할 것입니다), 공백이 아닌 마지막 문자가 줄을 계속 유지하므로 루비가 문자열을 다시 연결합니다. (인용 문자열 안에있는 공백에주의하십시오) :

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' \
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' \
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

# -> "select...from...where..."

Rails를 사용하면 String.squish선행 및 후행 문자열을 제거하고 연속 된 모든 공백 (줄 바꿈, 탭 및 모두)을 단일 공간으로 축소합니다.

conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 
           from table1, table2, table3, etc, etc, etc, etc, etc, 
           where etc etc etc etc etc etc etc etc etc etc etc etc etc".squish

# -> "select...from...where..."

자세한 내용은:

루비 HEREDOC 구문

Here Document Notation for Strings 작품은 코드에서 긴 텍스트 블록을 인라인으로 지정하는 방법입니다. 그 <<다음에 사용자 정의 문자열 (문자열 끝 종결 자)이옵니다. 문자열 터미네이터의 끝은에 발견 될 때까지 모든 다음 줄이 연결됩니다 매우 시작 라인의 :

puts <<HEREDOC 
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"

문자열 끝 종결자는 자유롭게 선택할 수 있지만 "EOS"(문자열 끝)와 같은 것 또는 "SQL"과 같은 문자열의 도메인과 일치하는 것을 사용하는 것이 일반적입니다.

HEREDOC는 기본적으로 또는 EOS 종료자가 큰 따옴표로 묶인 경우 보간 을 지원합니다 .

price = 10
print <<"EOS"  # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."

EOS 터미네이터가 작은 따옴표로 묶인 경우 보간을 비활성화 할 수 있습니다.

print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."

의 한 가지 중요한 제한 사항은 <<HEREDOC문자열 끝 종결자가 줄의 시작 부분에 있어야한다는 것입니다.

  puts <<EOS 
    def foo
      print "foo"
    end
  EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS

이 문제를 해결하기 위해 <<-구문이 작성되었습니다. EOS 터미네이터를 들여 들여 코드를 더 멋지게 보이게 할 수 있습니다. <<-EOS 터미네이터 사이의 줄 은 여전히 ​​모든 들여 쓰기를 포함하여 완전히 확장되어 사용됩니다.

puts <<-EOS # Use <<- to indent End of String terminator
  def foo
    print "foo"
  end
EOS
# -> "..def foo\n....print "foo"\n..end"

Ruby 2.3부터는 HEREDOC이 뒤 따르는 <<~공백을 제거했습니다.

puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
  def foo
    print "foo"
  end
EOS
# -> "def foo\n..print "foo"\nend"

탭과 공백 만 포함 된 빈 줄과 줄은 << ~에서 무시됩니다.

puts <<~EOS.inspect 
  Hello

    World!
EOS
#-> "Hello\n..World!"

탭과 공백이 모두 사용되는 경우 탭은 8 개의 공백과 같은 것으로 간주됩니다. 들여 쓰기가 가장 적은 줄이 탭 가운데 있으면이 탭은 제거되지 않습니다.

puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"

HEREDOC은 백틱을 사용하여 명령을 실행하는 것과 같은 미친 일을 할 수 있습니다.

puts <<`EOC`            
echo #{price}
echo #{price * 2}
EOC

HEREDOC 문자열 정의는 "스택"될 수 있습니다. 즉, 첫 번째 EOS 터미네이터 (아래 EOSFOO)는 첫 번째 문자열을 종료하고 두 번째 문자열 (아래 EOSBAR)을 시작합니다.

print <<EOSFOO, <<EOSBAR    # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR

나는 아무도 그것을 그렇게 사용하지 않을 것이라고 생각하지만, <<EOS실제로는 문자열 리터럴이며 일반적으로 문자열을 넣을 수있는 곳에 넣을 수 있습니다.

def func(a,b,c)
  puts a
  puts b
  puts c
end

func(<<THIS, 23, <<THAT) 
Here's a line
or two.
THIS
and here's another.
THAT

Ruby 2.3이 없지만 Rails >=3.0 이 있다면 다음 String.strip_heredoc과 같은 기능을 사용할 수 있습니다<<~

# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
  def strip_heredoc
    gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
  end
end

puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
  This command does such and such.

  Supported options are:
    -h         This message
    ...
USAGE

문자열 리터럴 백분율

퍼센트 기호와 ,, 등의 괄호 쌍으로 문자열을 사용하는 방법에 대해서는 RubyDoc 을 참조하십시오 .%(...)%[...]%{...} 등 또는 영숫자가 아닌 문자 한 쌍의 등을%+...+

마지막 말

마지막으로 원래 질문에 대한 답을 얻으려면 "연결을 암시하는 방법이 있습니까?" 답변 : 루비는 두 개의 문자열 (단일 및 큰 따옴표)이 연속적으로 발견되면 항상 연결을 암시합니다.

puts "select..." 'from table...' "where..."
# -> "select...from table...where..."

루비가 문장의 끝을 해석하고 결과 라인 만 문자열의 행만으로는 아무 것도하지 않기 때문에 이것은 줄 바꿈에서 작동하지 않는다는 점에주의해야합니다.


1

우아한 답변 오늘 :

<<~TEXT
Hi #{user.name}, 

Thanks for raising the flag, we're always happy to help you.
Your issue will be resolved within 2 hours.
Please be patient!

Thanks again,
Team #{user.organization.name}
TEXT

<<-TEXT와 차이가 있습니다<<~TEXT 전자는 블록 내부의 간격을 유지하지만 후자는 그렇지 않습니다.

다른 옵션도 있습니다. 연결 등과 같지만 일반적으로 더 의미가 있습니다.

내가 틀렸다면 어떻게하는지 알려주십시오.


heredoc은 원래 코드와 다른 개행을 포함합니다.
Josh

1

당신처럼, 나는 또한 개행을 포함하지 않는 해결책을 찾고있었습니다 . (SQL에서 안전 할 수는 있지만 제 경우에는 안전하지 않으며 처리 할 큰 텍스트 블록이 있습니다)

이것은 추악한 것 같지만 heredoc에서 줄 바꿈을 이스케이프 처리하여 결과 문자열에서 생략 할 수 있습니다.

conn.exec <<~END_OF_INPUT
    select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
    from table1, table2, table3, etc, etc, etc, etc, etc, \
    where etc etc etc etc etc etc etc etc etc etc etc etc etc
  END_OF_INPUT

보간 (IE <<~'END_OF_INPUT') 없이는이 문제를 해결할 수 없으므로 주의하십시오. #{expressions}원래 코드에는없는 반면 여기에서 평가됩니다. A. 윌슨의 대답 은 그런 이유로 더 나을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.