๊ฐœ๋ฐœ์ผ์ง€

[๋„์ปค] ๋„์ปค ์ตœ์ ํ™” - ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ข‹์„๊นŒ?(alpine, musl libc, JNI) ๋ณธ๋ฌธ

Backend๐Ÿงฑ/์ธํ”„๋ผ

[๋„์ปค] ๋„์ปค ์ตœ์ ํ™” - ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ข‹์„๊นŒ?(alpine, musl libc, JNI)

doublejune 2025. 4. 24. 15:09

 

ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์— ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ํ•˜๋ฉฐ, ๊ณผ์ •์„ ์ข€ ๋” ์ตœ์ ํ™”ํ•˜๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋„์ปค๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์ด ์ˆ˜ ์—†์ด ๋ฐ˜๋ณต๋ ํ…๋ฐ,

์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ๋นŒ๋“œ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„๊ณผ ์ปดํ“จํŒ… ์ž์›์˜ ๋‚ญ๋น„๋ฅผ ์—†์• ์ค„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ, ๋„์ปค ์ตœ์ ํ™”๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์ฒซ ๋ฒˆ์งธ๋กœ ์†๋Œ€ ๋ณผ ๊ฒƒ์€ JDK, JRE ์ด๋ฏธ์ง€ ๊ฒฝ๋Ÿ‰ํ™”์˜€๋‹ค.

์ž๋ฐ”๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” JDK์™€ JRE์˜ ๋„์ปค ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๊ณ , ์ด ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•˜๋Š”๊ฒŒ ํ•ฉ๋ฆฌ์ ์ธ์ง€๋ฅผ ๋”ฐ์ ธ๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถ”๋Š”๋ฐ์„œ ์˜ค๋Š” ์žฅ์ ๋ณด๋‹ค ๋‹จ์ (์„ฑ๋Šฅ์ด์Šˆ, ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ)์ด ํฌ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์šฉ๋Ÿ‰์˜ ์ œํ•œ์ด ์ค‘์š”ํ•œ(์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๊ฐ™์€) ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋ƒฅ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

 

1. JDK, JRE ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ๋ณด์ž!

 

# ๋นŒ๋“œ ๋‹จ๊ณ„
# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ƒ์„ฑ. ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŠน์ • ์ดˆ๊ธฐ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธํŒ….
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /back
COPY . .
RUN ./gradlew clean build 

# ์‹คํ–‰ ๋‹จ๊ณ„ 
FROM eclipse-temurin:21-jre
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar /back/weddy.jar 
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์„ ์–ธ 
EXPOSE 8080 
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๊ธฐ๋ณธ ๋ช…๋ น์–ด
CMD ["java", "-Dspring.profiles.active=local", "-jar", "weddy.jar"]

 

์œ„๋Š” ํ˜„์žฌ ๋‚ด ๋„์ปคํŒŒ์ผ ์ด๋‹ค.

 

๋งจ ์ฒซ์งธ์ค„์„ ๋ณด๋ฉด, eclipse-temurin:21-jdk ๋ฅผ ๋นŒ๋”๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋„์ปคํ—ˆ๋ธŒ์—์„œ ์ œ๊ณตํ•˜๋Š” jdk ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ pull๋ฐ›๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ jdk, jre์˜ ๊ฒฝ๋Ÿ‰ ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๋„ ์กด์žฌํ•œ๋‹ค. ๋ฐ”๋กœ alpine๋ฒ„์ „์ด๋‹ค.

 

๋„์ปคํ—ˆ๋ธŒ ๊ณต์‹๋ฌธ์„œ https://hub.docker.com/_/eclipse-temurin

 

๋„์ปคํ—ˆ๋ธŒ์—์„œ eclipse-temurin ์ด๋ฏธ์ง€์—์„œ alpine๋ฒ„์ „ ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

 

์„ค๋ช…์„ ๋ณด๋ฉด, ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด eclipse-temurin์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.

 

์ฐธ๊ณ ๋กœ, ๋ฆฌ๋ˆ…์Šค๋Š” ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋ˆ…์Šค์˜ ํ•ต์‹ฌ์ ์ธ ์˜๋ฏธ๋Š” '์ปค๋„'์ด๋‹ค. ๊ทธ ์ปค๋„์— ์ด๊ฒƒ์ €๊ฒƒ(ํŒŒ์ผ ์‹œ์Šคํ…œ, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋“ฑ) ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด๋‹ค.

  • Ubuntu: Canonical(ํšŒ์‚ฌ)์ด ๊ฐœ๋ฐœ.
  • Debian: ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ.
  • Red Hat Enterprise Linux (RHEL): Red Hat(ํšŒ์‚ฌ)์ด ๊ฐœ๋ฐœ.
  • Alpine Linux: ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ, ํŠน์ • ํšŒ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ์ž ๊ทธ๋ฃน์ด ์ฃผ๋„.

alpine์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ํŠน์ง•์€ small, simple, secure์ด๋‹ค. ๊ณต์‹๋ฌธ์„œ ์ฐธ์กฐ

 

ํŠน์ง• ๊ทธ๋Œ€๋กœ, ๋‹ค๋ฅธ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘๊ณ  ๊ฐ€๋ณ๋‹ค. ๋ฆฌ๋ˆ…์Šค ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๊ฐ€ 5MB๋ฏธ๋งŒ์ด๋‹ค.

Alpine Linux ~5-8 MB alpine:latest. musl libc, BusyBox ์‚ฌ์šฉ. ์ปจํ…Œ์ด๋„ˆ์— ์ตœ์ ํ™”๋œ ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€.
Ubuntu ~70-80 MB ubuntu:latest. glibc ๊ธฐ๋ฐ˜. ์ตœ์†Œ ์„œ๋ฒ„ ๊ตฌ์„ฑ, ์ถ”๊ฐ€ ํŒจํ‚ค์ง€๋กœ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ.
Debian ~50-60 MB debian:slim. glibc ๊ธฐ๋ฐ˜. Slim ๋ฒ„์ „ ๊ธฐ์ค€, ๊ธฐ๋ณธ Debian์€ ~100 MB ์ด์ƒ.
Fedora ~150-200 MB fedora:minimal. glibc ๊ธฐ๋ฐ˜. ์ตœ์†Œ ๊ตฌ์„ฑ์ด๋ผ๋„ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์›€.
CentOS Stream ~200-220 MB centos:stream9. glibc ๊ธฐ๋ฐ˜. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์— ๋งž์ถ˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ํฌํ•จ.

 


 

2. ์ž‘์œผ๋‹ˆ๊นŒ ์จ๋„ ๋ ๊นŒ?

 

์œ„๋ฅผ ๋ณด๋ฉด jre-alpine์ด๋ฏธ์ง€์™€ ์ผ๋ฐ˜ jre-alpine์ด๋ฏธ์ง€(์šฐ๋ถ„ํˆฌ๋ฅผ ์‚ฌ์šฉํ•œ)์˜ ์ฐจ์ด๋ฅผ ๋ณด๋ฉด ์šฉ๋Ÿ‰์ด 82mb์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

 

์šฉ๋Ÿ‰์ด ์ž‘๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ฃผ๋Š” alpine๋ฒ„์ „์„ ์“ฐ๊ณ  ์‹ถ์ง€๋งŒ,

 

์šฐ๋ฆฌ๋Š” ๋‹จ์ ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ• ๋งŒํ•œ์ง€ ํŒ๋‹จํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด, ์ด alpine๋ฒ„์ „์ด ๋‹ค๋ฅธ OS(Ubuntu, debian ๋“ฑ)๋“ค๊ณผ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•ด๋ณด์ž.

 

 


 

 

3. alpine ๋ฒ„์ „์€ ๋‹ค๋ฅธ ๋ฒ„์ „๋“ค๊ณผ์˜ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

๊ฒฐ๋ก : ์•ŒํŒŒ์ธ ๋ฒ„์ „์€ glibc ๋Œ€์‹  musl libc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ฐ€๋ณ๋‹ค.

 

alpine๋ฒ„์ „๊ณผ ๋‹ค๋ฅธ OS์™€์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€

 

C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(libc, standard C library)์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(libc, standard C library)
: C์–ธ์–ด๋ฅผ ์œ„ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž.
- ํŒŒ์ผ ์ž…์ถœ๋ ฅ: ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ(fopen, fwrite ๋“ฑ).
- ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(malloc, free ๋“ฑ).
- ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ž˜ํผ: ์šด์˜ ์ฒด์ œ์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(์˜ˆ: open, read)์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต.

 

(์•ž์œผ๋กœ Cํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ libc๋ผ๊ณ  ํ•˜๊ฒ ๋‹ค.)

libc๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ ์žˆ๋Š” stdio.h, string.h, stdlib.h ๋“ฑ์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค.

 

์ด libc๋Š” ISO(๊ตญ์ œ ํ‘œ์ค€ํ™”๊ธฐ๊ตฌ)์—์„œ ์ฑ„ํƒ์ด ๋˜์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ‘œ์ค€ ๋•๋ถ„์—, ๊ฐœ๋ฐœ์ž๊ฐ€ mac os์—์„œ printf๋ฅผ ์‚ฌ์šฉํ•˜๋“  window os์—์„œ prinf๋ฅผ ์‚ฌ์šฉํ•˜๋“  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์‹์„ฑ์ด ์ข‹์•„์กŒ๋‹ค.

 

๋‹ค๋งŒ, mac์—์„œ printf๋ฅผ ํ–ˆ์„ ๋•Œ์™€ window์—์„œ printf๋ฅผ ํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ๋‚ด๋ถ€์—์„œ ์ž‘๋™๋˜๋Š” ๋ฐฉ์‹์€ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒ๋ฉด, mac์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๋ช…๋ น์–ด ์‹คํ–‰ ๊ตฌ์กฐ ๋“ฑ window์˜ ๊ทธ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ OS๋ณ„๋กœ libc์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ค๋ฅด๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด

- Windows: Visual C++ Runtime

- mac :libSystem

- linux : glibc, musl libc

 

์ด๋ ‡๋‹ค.

 

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋ฆฌ๋ˆ…์Šค์šฉ libc ๊ตฌํ˜„์ฒด๋Š” glibc์™€ musl libc๊ฐ€ ์žˆ๋Š”๋ฐ,

๋‘˜์˜ ์ฐจ์ด์ ์„ ์ •๋ง ๊ฐ„๋žตํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด,

- glibc : ๋ฌด๊ฑฐ์›€. / ์„ฑ๋Šฅ ์ตœ์ ํ™”. ์•ˆ์ •์ .

- musl libc: ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ฒผ์›€. ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์œ„์ฃผ./ ์„ฑ๋Šฅ์ด ์กฐ๊ธˆ ๋А๋ฆผ. ํ˜ธํ™˜์„ฑ ์ด์Šˆ ์žˆ์Œ.

glibc vs musl libc

 

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ(Ubuntu, Debian Fedora ๋“ฑ)์ด glibc๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

linux alpine์€ ๋ฐ”๋กœ ์ด musl libc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์€ ์šฉ๋Ÿ‰์œผ๋กœ ๋ฐฐํฌํŒ์„ ๋งŒ๋“ค์–ด๋ƒˆ๋‹ค.

 


 

4. ๋‹จ์ ์ด ๋ญ๊ณ , ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ?

musl libc๋ฅผ ์ด์šฉํ•œ Linux alpine์€ ๊ฐ€๋ณ๊ณ  ์ข‹์ง€๋งŒ, ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋‹จ์ ์ด ์žˆ๋‹ค.

ํฌ๊ฒŒ 2๊ฐ€์ง€๋ฅผ ๊ผฝ์ž๋ฉด,

 

1. ์„ฑ๋Šฅ ์ด์Šˆ

2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์Šˆ

 

๊ฐ€ ์žˆ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ๋กœ, ์„ฑ๋Šฅ ์ด์Šˆ์™€ ๊ด€๋ จํ•ด์„œ๋Š” ์–ด๋–ค ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

musl libc๊ฐ€ glibc๋ณด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์—์„œ ๋œ ์ตœ์ ํ™” ๋˜์—ˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์ข…์ข… ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ํ™•์ธํ–ˆ์„ ์‹œ ๊ฐ๊ด€์ ์ด๊ณ  ๋ช…ํ™•ํ•œ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ฐจ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•œ ์ž๋ฃŒ๋Š” ํ™•์ธํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ์„œ๋„ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ glibc์™€ musl libc๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋‚ด ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด๋ณด์•„์•ผ ์ •ํ™•ํ•˜๋‹ค.

 

๋‘ ๋ฒˆ์งธ๋กœ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์Šˆ์ด๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ,

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡๋ช‡ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘, ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ libc์— ์˜์กดํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ glibc์— ์˜์กดํ•ด์žˆ๋‹ค๋ฉด 'UnsatisfiedLinkError (๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ ์‹คํŒจ)' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Native Library)๋ž€?

์ž๋ฐ”๊ฐ€ "์ด๊ฑฐ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•ด์ค˜!"๋ผ๊ณ  ๋ถ€ํƒํ•˜๋ฉด C๋กœ ์ง  ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ OS์™€ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์คŒ.
ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(java, python)์ด ์•„๋‹Œ, ์šด์˜ ์ฒด์ œ์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š” ๊ธฐ๊ณ„์–ด(๋ฐ”์ด๋„ˆ๋ฆฌ)๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ. ์ฃผ๋กœ C๋‚˜ C++๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ์ฃผ๋กœ C๋‚˜ C++๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, OS ์ €์ˆ˜์ค€ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๊ณ ์„ฑ๋Šฅ ์ž‘์—… ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ.

 

์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ž๋ฐ” ๊ฐ™์€ ๊ฒฝ์šฐ JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด .so(๋ฆฌ๋ˆ…์Šค)๋‚˜ .ddl(์œˆ๋„์šฐ) ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋˜๋Š” DB ๋“œ๋ผ์ด๋ฒ„, ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์— ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ผ๋ถ€ ๊ตฌํ˜„ ๋˜์–ด์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ž๋ฐ”์—์„œ Thread๋ฅผ ์ƒ์„ฑ์‹œ์— ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์‹œ OS์— ์ตœ์ ํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ธก๋œ๋‹ค. ์ฐธ๊ณ 

 

Java์˜ Thread๊ฐ™์€๊ฒฝ์šฐ,

Thread.start0 -> JNI ๋ฅผ ํ†ตํ•ด JVM์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ(libjvm.so, libjava.so)ํ˜ธ์ถœ

์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”๋ฐ JVM์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” alpine ํ™˜๊ฒฝ์— ๋งž๊ฒŒ musl libc๋กœ ์ปดํŒŒ์ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

ํ•˜์ง€๋งŒ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ glibc์— ์˜์กดํ•˜๋Š”๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด Oracle JDBC Driver๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ DB์—ฐ๊ฒฐ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. ์ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” glibc์— ์˜์กดํ•ด์žˆ๋‹ค.

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ, ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ ์ƒํƒœ๋กœ ๋ฐฐํฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์žฌ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋•Œ, ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 


5. ๊ทธ๋Ÿฌ๋ฉด ์“ฐ์ง€๋ง๊นŒ?

์šฉ๋Ÿ‰์„ ์ค„์—ฌ์„œ ์–ป๋Š” ์ด์ ์ด

 

- ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ์ด์Šˆ

- glibc๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋А๋ฆด ์ˆ˜ ์žˆ๋Š” ์ด์Šˆ.

 

๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ๋‚˜๋Š” ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค๊ณ  ๋ณธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์šฉ๋Ÿ‰ ์ œํ•œ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ์šฉ๋Ÿ‰ ์ตœ๋Œ€ ๋ช‡ GB๋ฅผ ์ค„์ด์ž๊ณ  ์œ„์™€๊ฐ™์€ ๋ฆฌ์Šคํฌ๋ฅผ ์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋ƒฅ glibc๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํ•œ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ์•ˆ์ •์ ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์ด๋“œํ”„๋กœ์ ํŠธ๋กœ์„œ๋Š” ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

- ์ด์Šˆ๊ฐ€ ๋ ๋งŒํ•œ ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์ ์Œ.

- ํ”„๋ฆฌํ‹ฐ์–ด ์ปดํ“จํŒ… ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์ด ์ ์€๊ฒŒ ์œ ๋ฆฌ.

- ์„ฑ๋Šฅ์ด ๋А๋ ค๋„ ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Œ.

 

 

๊ทธ๋ž˜์„œ, ๋‚ด ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—๋Š” ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค.

 

์ฐธ์กฐ

https://jofestudio.tistory.com/138

https://bcho.tistory.com/1356

https://blog.lablup.com/en/posts/2023/09/20/diet-of-containers/

https://martinheinz.dev/blog/92

https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#high-level-differences-between-glibc-and-musl