Skip to main content

4-12. PostgreSQL

About 2 minJavaSpringAWScrashcoursejavajdkjdk8streamspringspringframeworkspringbootawsaws-ec2

4-12. PostgreSQL κ΄€λ ¨


4-12. PostgreSQL

점프 투 μŠ€ν”„λ§λΆ€νŠΈ - WikiDocs

pahkey/sbb3 - 4-12open in new window

μ•žμ„œ μ–˜κΈ°ν–ˆλ“―μ΄ H2 λ°μ΄ν„°λ² μ΄μŠ€λŠ” 개발 λ‹¨κ³„μ—μ„œλŠ” μœ μš©ν•˜μ§€λ§Œ 운영 ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜κΈ°μ—λŠ” 많이 λΆ€μ‘±ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ΄λ‹€. λ”°λΌμ„œ 본격적으둜 μ‹œμŠ€ν…œμ„ μš΄μ˜ν•˜κΈ°λ‘œ λ§ˆμŒμ„ λ¨Ήμ—ˆλ‹€λ©΄ H2 보닀 μ„±λŠ₯이 쒋은 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€. 였라클과 같은 μƒμš© λ°μ΄ν„°λ² μ΄μŠ€λ„ μžˆμ§€λ§Œ μž‘μ€ 규λͺ¨μ˜ μ„œλΉ„μŠ€λ“€μ€ λŒ€μ²΄λ‘œ PostgreSQLμ΄λ‚˜ MySQL λ“±μ˜ 무료 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 주둜 μ‚¬μš©ν•œλ‹€.

이번 μž₯μ—μ„œλŠ” PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.


PostgreSQL μ„€μΉ˜

PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μ—λŠ” 두 가지가 μžˆλ‹€. ν•˜λ‚˜λŠ” AWS μ„œλ²„μ— 직접 PostgreSQL을 μ„€μΉ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” AWSκ°€ μ œκ³΅ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀. ν•˜μ§€λ§Œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 곡뢀할 λͺ©μ μ΄ μ•„λ‹ˆλΌλ©΄ PostgreSQL을 직접 μ„€μΉ˜ν•˜λŠ” 것은 ꢌμž₯ν•˜κ³  싢지 μ•Šλ‹€. λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 직접 μ„€μΉ˜ν•˜κ³  상황에 맞게 ν™˜κ²½μ„ μ„€μ •ν•˜λŠ” 것이 κ²°μ½” μ‰¬μš΄ 일이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

μš°λ¦¬λŠ” λ‘λ²ˆμ§Έ λ°©λ²•μœΌλ‘œ PostgreSQL을 μ‚¬μš©ν•΄ 보자.

AWS λΌμ΄νŠΈμ„ΈμΌμ„ μ΄μš©ν•˜μ—¬ PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μš΄μ˜ν•˜λ €λ©΄ ν•œλ‹¬μ— μ•½ 15λ‹¬λŸ¬μ˜ μΆ”κ°€ λΉ„μš©μ΄ λ°œμƒν•œλ‹€. (첫 세달은 무료둜 μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.)

λ¨Όμ € AWS에 λ‘œκ·ΈμΈν•œ ν›„ μ›ΉλΈŒλΌμš°μ €λ‘œ λ‹€μŒ URL에 μ ‘μ†ν•˜μž.

https://lightsail.aws.amazon.comopen in new window

<FontIcon icon="iconfont icon-select"/> 탭을 μ„ νƒν•˜κ³  <FontIcon icon="iconfont icon-select"/> λ²„νŠΌμ„ ν΄λ¦­ν•œλ‹€.
["λ°μ΄ν„°λ² μ΄μŠ€"] 탭을 μ„ νƒν•˜κ³  ["λ°μ΄ν„°λ² μ΄μŠ€ 생성"] λ²„νŠΌμ„ ν΄λ¦­ν•œλ‹€.
<FontIcon icon="iconfont icon-select"/>을 μ„ νƒν•œλ‹€.
["AWS 리전 및 κ°€μš© μ˜μ—­ λ³€κ²½"]을 μ„ νƒν•œλ‹€.
<FontIcon icon="iconfont icon-select"/>을 μ„ νƒν•œλ‹€.
["μ„œμšΈ"]을 μ„ νƒν•œλ‹€.
<FontIcon icon="iconfont icon-select"/>을 μ„ νƒν•œλ‹€.
["PostgreSQL"]을 μ„ νƒν•œλ‹€.

이 책을 μž‘μ„±ν•˜λŠ” μ‹œμ μ˜ PostgreSQL μ΅œμ‹  버전은 12.10이닀.

 ν”Œλžœμ„ μ„ νƒν•œλ‹€. ( ν”Œλžœμ€ 첫 세달은 무료둜 μ‚¬μš©ν•  수 μžˆλ‹€.)
$15 ν”Œλžœμ„ μ„ νƒν•œλ‹€. ($15 ν”Œλžœμ€ 첫 세달은 무료둜 μ‚¬μš©ν•  수 μžˆλ‹€.)
λ¦¬μ†ŒμŠ€ 이름에 "Database-1"을 μž…λ ₯ν•˜κ³  <FontIcon icon="iconfont icon-select"/> λ²„νŠΌμ„ ν΄λ¦­ν•œλ‹€.
λ¦¬μ†ŒμŠ€ 이름에 "Database-1"을 μž…λ ₯ν•˜κ³  ["λ°μ΄ν„°λ² μ΄μŠ€ 생성"] λ²„νŠΌμ„ ν΄λ¦­ν•œλ‹€.
그러면 λ‹€μŒ ν™”λ©΄μ²˜λŸΌ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μƒμ„±λœλ‹€. ν•˜μ§€λ§Œ μƒνƒœλŠ” "생성 쀑"으둜 아직 μ‚¬μš©ν•  수 μ—†λŠ” μƒνƒœμ΄λ‹€.
그러면 λ‹€μŒ ν™”λ©΄μ²˜λŸΌ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μƒμ„±λœλ‹€. ν•˜μ§€λ§Œ μƒνƒœλŠ” "생성 쀑"으둜 아직 μ‚¬μš©ν•  수 μ—†λŠ” μƒνƒœμ΄λ‹€.
ν•œμ°Έμ„ 기닀리면 λ‹€μŒμ²˜λŸΌ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœκ°€ "μ‚¬μš© κ°€λŠ₯"으둜 λ³€κ²½λœλ‹€.
ν•œμ°Έμ„ 기닀리면 λ‹€μŒμ²˜λŸΌ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœκ°€ "μ‚¬μš© κ°€λŠ₯"으둜 λ³€κ²½λœλ‹€.

β€» λ°μ΄ν„°λ² μ΄μŠ€ μƒμ„±μ—λŠ” λŒ€λž΅ 10~15λΆ„ μ •λ„μ˜ μ‹œκ°„μ΄ μ†Œμš”λ˜μ—ˆλ‹€.

그리고 이 ν™”λ©΄μ—μ„œ "Database-1"을 μ„ νƒν•˜μž.

그러면 λ‹€μŒκ³Ό 같은 "μ—°κ²° μ„ΈλΆ€ 정보"λ₯Ό 확인할 수 μžˆλŠ” 화면이 λ‚˜νƒ€λ‚œλ‹€.
그러면 λ‹€μŒκ³Ό 같은 "μ—°κ²° μ„ΈλΆ€ 정보"λ₯Ό 확인할 수 μžˆλŠ” 화면이 λ‚˜νƒ€λ‚œλ‹€.

μ—°κ²° μ„ΈλΆ€ μ •λ³΄μ—μ„œλŠ” μ€‘μš”ν•œ 정보 3가지λ₯Ό 확인할 수 μžˆλ‹€.

  • μ‚¬μš©μž 이름: dbmasteruserλ₯Ό 확인할 수 있음
  • μ•”ν˜Έ: <ν‘œμ‹œ>λ₯Ό λˆ„λ₯΄λ©΄ μ•”ν˜Έλ₯Ό λ³Ό 수 있음
  • λ°μ΄ν„°λ² μ΄μŠ€ μ£Όμ†Œ: "μ—”λ“œν¬μΈνŠΈ"둜 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 도메인 μ£Όμ†Œκ°€ μ ν˜€ 있음

이 μ •λ³΄λŠ” SBBμ—μ„œ PostgreSQL에 접속할 λ•Œ ν•„μš”ν•˜λ―€λ‘œ λ°˜λ“œμ‹œ κΈ°μ–΅ν•΄ 두어야 ν•œλ‹€.


λ°μ΄ν„°λ² μ΄μŠ€ 생성

AWS의 PostgreSQL μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ˜€λ‹€. 이제 μƒμ„±λœ PostgreSQL μΈμŠ€ν„΄μŠ€μ— SBB μ‹œμŠ€ν…œμ΄ μ‚¬μš©ν•  "sbb" λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 생성해 보자.

PostgreSQL ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜

PostgreSQL에 μ ‘μ†ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ²˜λŸΌ PostgreSQL ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ¨Όμ € μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€.

sudo apt install postgresql-client

postgresql-client νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. 이 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜λ©΄ createdbλ‚˜ psqlλ“±μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•  수 있게 λœλ‹€.

sbb λ°μ΄ν„°λ² μ΄μŠ€ 생성

이제 λ‹€μŒμ²˜λŸΌ createdb λͺ…령을 μ‹€ν–‰ν•˜μ—¬ sbb λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μƒμ„±ν•˜μž.

createdb sbb --username=dbmasteruser -h <λ°μ΄ν„°λ² μ΄μŠ€μ£Όμ†Œ>

<λ°μ΄ν„°λ² μ΄μŠ€μ£Όμ†Œ>λŠ” μœ„μ—μ„œ κΈ°μ–΅ν•΄ λ‘” "μ—”λ“œν¬μΈνŠΈ"에 ν•΄λ‹Ήλ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ£Όμ†Œμ΄λ‹€. (<, > κΈ°ν˜ΈλŠ” λΉΌκ³  μž…λ ₯ν•΄μ•Ό ν•œλ‹€.)

μ‚¬μš©μ˜ˆ

createdb sbb --username=dbmasteruser -h ls-be78fd2c2exxxxxxxxxxxxxxxx2c9.cqlcyugj7ibs.ap-northeast-2.rds.amazonaws.com 

createdb λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ•”ν˜Έλ₯Ό λ¬Όμ–΄λ³΄λŠ”λ° μœ„μ—μ„œ κΈ°μ–΅ν•΄ λ‘” μ•”ν˜Έλ₯Ό μž…λ ₯ν•˜λ©΄ λœλ‹€.


λ°μ΄ν„°λ² μ΄μŠ€μ— 접속

이제 μš°λ¦¬κ°€ λ§Œλ“  SBB μ„œλΉ„μŠ€μ—μ„œ sbb λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘μ†ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

PostgreSQL 라이브러리 μ„€μΉ˜

SBBμ—μ„œ PostgreSQL μ„œλ²„μ— μ ‘μ†ν•˜λ €λ©΄ PostgreSQL λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν•„μš”ν•˜λ‹€. λ‹€μŒκ³Ό 같이 build.gradle νŒŒμΌμ„ μˆ˜μ •ν•˜μ—¬ PostgreSQL 라이브러리λ₯Ό μ„€μΉ˜ν•˜μž.

// (... μƒλž΅ ...)

dependencies {
    // (... μƒλž΅ ...)
    runtimeOnly 'org.postgresql:postgresql'
}

// (... μƒλž΅ ...)

μœ„μ™€ 같이 μˆ˜μ • ν›„ ["Refresh Gradle Project"]λ₯Ό μ‹€ν–‰ν•˜μž.

λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ •

둜컬 μ„œλ²„λŠ” 기쑴의 H2 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κ³  μ„œλ²„λ§Œ PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ―€λ‘œ application-prod.properties 파일만 λ‹€μŒμ²˜λŸΌ μˆ˜μ •ν•˜μž.

파일λͺ…: /sbb/src/main/resources/application-prod.properties

# DATABASE
spring.datasource.url=jdbc:postgresql://<λ°μ΄ν„°λ² μ΄μŠ€μ£Όμ†Œ>:5432/sbb
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.username=dbmasteruser
spring.datasource.password=<μ•”ν˜Έ>

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true

# logging
// (... μƒλž΅ ...)

<λ°μ΄ν„°λ² μ΄μŠ€μ£Όμ†Œ>와 <μ•”ν˜Έ>λŠ” μœ„μ—μ„œ κΈ°μ–΅ν•΄ λ‘” 값을 μž…λ ₯ν•œλ‹€. (<, > κΈ°ν˜ΈλŠ” λΉΌκ³  μž…λ ₯ν•΄μ•Ό ν•œλ‹€.)


λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½ 확인

μœ„μ˜ 과정을 잘 μ§„ν–‰ν–ˆλ‹€λ©΄ μƒˆλ‘œμš΄ λ°°ν¬νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ μ„œλ²„μ— μ μš©ν•˜κ³  stop.sh, start.sh 을 μ‹€ν–‰ν•˜μ—¬ SBB μ„œλΉ„μŠ€λ₯Ό μž¬μ‹œμž‘ν•˜μž. λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ³€κ²½λ˜μ—ˆμœΌλ―€λ‘œ 기쑴의 λ°μ΄ν„°λŠ” 보이지 μ•Šμ„ 것이닀.

spring.jpa.hibernate.ddl-auto

ν˜„μž¬ application-prod.properties 파일의 spring.jpa.hibernate.ddl-auto 값은 update둜 λ˜μ–΄ μžˆλ‹€. update의 경우 μ—”ν‹°ν‹°κ°€ 변경될 λ•Œλ§ˆλ‹€ ν…Œμ΄λΈ” λ³€κ²½ 쿼리문(DDL λ¬Έ)이 μžλ™μœΌλ‘œ μ‹€ν–‰λœλ‹€. ν•˜μ§€λ§Œ 운영 ν™˜κ²½μ—μ„œλŠ” 쑰금 μœ„ν—˜ν•œ 방법이닀. μš΄μ˜ν™˜κ²½μ—μ„œλŠ” ν…Œμ΄λΈ” λ³€κ²½ 쿼리λ₯Ό μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  μˆ˜λ™μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” 것이 μ•ˆμ „ν•˜λ‹€. λ”°λΌμ„œ μœ„μ˜ ν•­λͺ©λ„ update λŒ€μ‹  none λ˜λŠ” validate둜 μ„€μ •ν•˜κΈ°λ₯Ό μΆ”μ²œν•œλ‹€.

λ‹€λ§Œ, none λ˜λŠ” validate둜 λ³€κ²½ν•˜λ©΄ ν…Œμ΄λΈ” 변경쿼리λ₯Ό 직접 μž‘μ„±ν•˜μ—¬ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.

  • none: μ—”ν‹°ν‹°κ°€ λ³€κ²½λ˜λ”λΌλ„ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • validate: 변경사항이 μžˆλŠ”μ§€ κ²€μ‚¬λ§Œ ν•œλ‹€.

pgAdmin

H2 λ°μ΄ν„°λ² μ΄μŠ€μ˜ GUI λ„κ΅¬λ‘œ "H2 Console"이 μžˆλ‹€λ©΄ PostgreSQLμ—λŠ” pgAdmin이 μžˆλ‹€. 둜컬 PC에 pgAdmin ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ„€μΉ˜ν•˜μ—¬ PostgreSQL μ„œλ²„μ— 접속해 보자.

퍼블릭 λͺ¨λ“œ

μ™ΈλΆ€μ—μ„œ PostgreSQL μ„œλ²„μ— μ ‘μ†ν•˜κΈ° μœ„ν•΄μ„œλŠ” AWS λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ„€νŠΈμ›Œν¬λ₯Ό 퍼블릭 λͺ¨λ“œλ‘œ λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

λ‹€μŒμ²˜λŸΌ <FontIcon icon="iconfont icon-select"/> 탭을 μ„ νƒν•˜κ³  "퍼블릭 λͺ¨λ“œ" μ˜΅μ…˜μ„ ν™œμ„±ν™”μ‹œν‚€λ©΄ λœλ‹€.
λ‹€μŒμ²˜λŸΌ ["λ„€νŠΈμ›Œν‚Ή"] 탭을 μ„ νƒν•˜κ³  "퍼블릭 λͺ¨λ“œ" μ˜΅μ…˜μ„ ν™œμ„±ν™”μ‹œν‚€λ©΄ λœλ‹€.

퍼블릭 λͺ¨λ“œλ₯Ό ν™œμ„±ν™” ν•  경우 μ‚¬μš©μž 이름과 μ•”ν˜Έλ§Œ μ•Œλ©΄ λˆ„κ΅¬λ‚˜ 접속할 수 있기 λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

pgAdmin μ„€μΉ˜μ™€ μ‚¬μš©

pgAdmin λ‹€μš΄λ‘œλ“œ URLopen in new windowμ—μ„œ pgAdmin을 λ‚΄λ €λ°›κ³  μ„€μΉ˜ν•˜μž.

μ„€μΉ˜ 과정은 κ°„λ‹¨ν•˜λ―€λ‘œ μƒλž΅ν•œλ‹€.

μ„€μΉ˜ν›„ pgAdmin을 μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ§ˆμŠ€ν„° νŒ¨μŠ€μ›Œλ“œ μ„€μ • 화면이 λ‚˜νƒ€λ‚œλ‹€.
μ„€μΉ˜ν›„ pgAdmin을 μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ§ˆμŠ€ν„° νŒ¨μŠ€μ›Œλ“œ μ„€μ • 화면이 λ‚˜νƒ€λ‚œλ‹€.

λ§ˆμŠ€ν„° νŒ¨μŠ€μ›Œλ“œλ₯Ό μ„€μ •ν•˜κ³  ["OK"]λ₯Ό λˆ„λ₯Έλ‹€.

λ§ˆμŠ€ν„° νŒ¨μŠ€μ›Œλ“œλŠ” pgAdminμ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” λΉ„λ°€λ²ˆν˜Έμ΄λ‹€.

그리고 메인화면 μ’ŒμΈ‘λ©”λ‰΄μ—μ„œ λ‹€μŒμ²˜λŸΌ Serversλ₯Ό μ„ νƒν•˜κ³  <FontIcon icon="iconfont icon-select"/>λ₯Ό λˆ„λ₯Έλ‹€.
그리고 메인화면 μ’ŒμΈ‘λ©”λ‰΄μ—μ„œ λ‹€μŒμ²˜λŸΌ Serversλ₯Ό μ„ νƒν•˜κ³  [Register -> Server]λ₯Ό λˆ„λ₯Έλ‹€.

그러면 λ‹€μŒμ²˜λŸΌ μ„œλ²„ 등둝창이 λ‚˜νƒ€λ‚œλ‹€.

<FontIcon icon="iconfont icon-select"/> νƒ­μ˜ 'Name' ν•­λͺ©μ— 'sbb'λ₯Ό μž…λ ₯ν•œλ‹€.
[General] νƒ­μ˜ 'Name' ν•­λͺ©μ— 'sbb'λ₯Ό μž…λ ₯ν•œλ‹€.
그리고 Connection 탭을 μ„ νƒν•˜κ³  μˆœμ„œλŒ€λ‘œ λ°μ΄ν„°λ² μ΄μŠ€ μ£Όμ†Œ, 포트 번호, λ°μ΄ν„°λ² μ΄μŠ€ λͺ…, μ‚¬μš©μž 이름, μ•”ν˜Έλ₯Ό μž…λ ₯ν•˜κ³  <FontIcon icon="iconfont icon-select"/> λ²„νŠΌμ„ 눌러 μ €μž₯ν•œλ‹€.
그리고 Connection 탭을 μ„ νƒν•˜κ³  μˆœμ„œλŒ€λ‘œ λ°μ΄ν„°λ² μ΄μŠ€ μ£Όμ†Œ, 포트 번호, λ°μ΄ν„°λ² μ΄μŠ€ λͺ…, μ‚¬μš©μž 이름, μ•”ν˜Έλ₯Ό μž…λ ₯ν•˜κ³  ["Save"] λ²„νŠΌμ„ 눌러 μ €μž₯ν•œλ‹€.
λ‹€μŒμ€ μƒμ„±ν•œ SBB λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘μ†ν•œ λͺ¨μŠ΅μ΄λ‹€.
λ‹€μŒμ€ μƒμ„±ν•œ SBB λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘μ†ν•œ λͺ¨μŠ΅μ΄λ‹€.

이찬희 (MarkiiimarK)
Never Stop Learning.