[Linux] Java ์‹ค์ œ ์„ค์น˜ ๊ฒฝ๋กœ ํ™•์ธ ๋ฐฉ๋ฒ•: which vs readlink ์ฐจ์ด์  ๋ฐ JAVA_HOME ์„ค์ •

๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ java ๋ช…๋ น์–ด์˜ ์‹ค์ œ ์„ค์น˜ ์œ„์น˜(Absolute Path)๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœ ๊ฒฝ๋กœ ํ™•์ธ์šฉ์ธ which์™€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ์›๋ณธ์„ ์ฐพ์•„์ฃผ๋Š” readlink -f์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด JAVA_HOME์„ ์„ค์ •ํ•˜๋Š” ํŒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋ฆฌ๋ˆ…์Šค(ํŠนํžˆ CentOS/RHEL ๊ณ„์—ด)๋Š” alternatives ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— /usr/bin/java๋Š” ์‹ค์ œ ์‹คํ–‰ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๋ฐ”๋กœ๊ฐ€๊ธฐ(Symbolic Link)๋กœ ์—ฐ๊ฒฐ๋œ ๊ป๋ฐ๊ธฐ์ผ ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • Package: OpenJDK 1.8

1. ๋ช…๋ น์–ด ๊ฒฝ๋กœ ํ™•์ธ (which)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ $PATH์— ๋“ฑ๋ก๋œ ๊ฒฝ๋กœ ์ค‘ ์–ด๋””์— ์žˆ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

[wasadm@localhost ~]$ which java
/usr/bin/java
ํ•œ๊ณ„์ : ์œ„ ๊ฒฐ๊ณผ์ธ /usr/bin/java๋Š” ์‹ค์ œ ํŒŒ์ผ์ด ์•„๋‹Œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์„œ, ์ด ๊ฒฝ๋กœ๋ฅผ JAVA_HOME์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

2. ์›๋ณธ ๊ฒฝ๋กœ ์ถ”์  (readlink -f)

์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๊ผฌ์—ฌ ์žˆ์–ด๋„, ์ตœ์ข… ์›๋ณธ ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ•œ ๋ฒˆ์— ์ฐพ์•„์ฃผ๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

# ๊ตฌ๋ฌธ: readlink -f [์‹ฌ๋ณผ๋ฆญ_๋งํฌ_๊ฒฝ๋กœ]
[wasadm@localhost ~]$ readlink -f /usr/bin/java

# ์ถœ๋ ฅ ๊ฒฐ๊ณผ (์‹ค์ œ ์„ค์น˜ ์œ„์น˜)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre/bin/java

์œ„ ๊ฒฐ๊ณผ์—์„œ ๋งˆ์ง€๋ง‰ /bin/java๋ฅผ ์ œ์™ธํ•œ ์•ž๋ถ€๋ถ„์ด ๋ฐ”๋กœ JAVA_HOME์ด ๋ฉ๋‹ˆ๋‹ค.


3. ๋งํฌ ๊ตฌ์กฐ ๋‹จ๊ณ„๋ณ„ ํ™•์ธ (ls -l)

readlink๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ls -l ๋ช…๋ น์–ด๋กœ ํ•œ ๋‹จ๊ณ„์”ฉ ์ถ”์ ํ•ด๋ณด๋ฉด ๋ฆฌ๋ˆ…์Šค์˜ alternatives ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 1: ์‹คํ–‰ ํŒŒ์ผ ํ™•์ธ

[wasadm@localhost ~]$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Feb  5 01:36 /usr/bin/java -> /etc/alternatives/java

/usr/bin/java๋Š” /etc/alternatives/java๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Step 2: alternatives ํ™•์ธ

[wasadm@localhost ~]$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 71 Feb  5 01:36 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre/bin/java

/etc/alternatives/java๊ฐ€ ๋น„๋กœ์†Œ ์‹ค์ œ JDK๊ฐ€ ์„ค์น˜๋œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. readlink -f๋Š” ์ด ๊ณผ์ •์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.


4. ํ™œ์šฉ: JAVA_HOME ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

์œ„์—์„œ ์ฐพ์€ ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. (/etc/profile ๋˜๋Š” ~/.bash_profile)

# ์›๋ณธ ๊ฒฝ๋กœ: /usr/lib/jvm/java-1.8.0-.../jre/bin/java
# bin/java ์•ž๋ถ€๋ถ„๊นŒ์ง€๋งŒ ๋ณต์‚ฌ

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre
export PATH=$JAVA_HOME/bin:$PATH

Next Step:
๋งŒ์•ฝ ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ Java๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด ๊ธฐ๋ณธ ์‹คํ–‰ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, alternatives --config java ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์Šค์œ„์นญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[Linux] ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ๊ด€๋ฆฌ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: chmod ๋ช…๋ น์–ด์™€ 755, 777์˜ ์˜๋ฏธ

๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ(CentOS 7)์—์„œ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•˜๋Š” chmod ๋ช…๋ น์–ด ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ชจ๋“œ(755, 644)์™€ ๋ฌธ์ž์—ด ๋ชจ๋“œ(u+x)์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ , -R ์˜ต์…˜์„ ํ†ตํ•ด ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ผ๊ด„ ์ ์šฉํ•˜๋Š” ์‹ค๋ฌด ์˜ˆ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹: ๊ถŒํ•œ์˜ ๊ตฌ์กฐ (Permission Structure)

๋ฆฌ๋ˆ…์Šค์˜ ํŒŒ์ผ ๊ถŒํ•œ์€ ์†Œ์œ ์ž(User), ๊ทธ๋ฃน(Group), ๊ธฐํƒ€(Other) ์„ธ ๊ฐ€์ง€ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ฝ๊ธฐ(r), ์“ฐ๊ธฐ(w), ์‹คํ–‰(x) ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๊ถŒํ•œ ํ™•์ธ (ls -l)

ls -l
# ๊ฒฐ๊ณผ ์˜ˆ์‹œ: drwxr-xr-x (755)
# d(๋””๋ ‰ํ† ๋ฆฌ) | rwx(์†Œ์œ ์ž) | r-x(๊ทธ๋ฃน) | r-x(๊ธฐํƒ€)

1. ๊ถŒํ•œ ๋ณ€๊ฒฝ (chmod)

chmod(Change Mode) ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ƒ์„ฑ๋œ ํŒŒ์ผ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

์˜ต์…˜ ์„ค๋ช…

  • -R (--recursive): ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ(์ผ๊ด„) ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ)

์‹ค๋ฌด ์‚ฌ์šฉ ์˜ˆ์‹œ

# 1. WAS ๋””๋ ‰ํ† ๋ฆฌ: ์†Œ์œ ์ž๋งŒ ๋ชจ๋“  ๊ถŒํ•œ(7), ๋‚˜๋จธ์ง€๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€(0)
chmod -R 700 ./was

# 2. ์›น ๋ฃจํŠธ ๋ฐ ๋ฐ”์ด๋„ˆ๋ฆฌ: ์†Œ์œ ์ž(7), ๊ทธ๋ฃน/๊ธฐํƒ€๋Š” ์ฝ๊ธฐ/์‹คํ–‰๋งŒ(5) - ์ผ๋ฐ˜์ ์ธ ์„ค์ •
chmod -R 755 ./web
chmod -R 755 ./bin

# 3. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํด๋”: ๋ˆ„๊ตฌ๋‚˜ ์“ฐ๊ณ  ์ฝ๊ธฐ ๊ฐ€๋Šฅ (๋ณด์•ˆ ์ฃผ์˜!)
chmod -R 777 ./img

2. ๊ถŒํ•œ ์„ค์ • ๋ฐฉ์‹ A: ์ˆซ์ž ๋ชจ๋“œ (Octal Mode)

๊ฐ€์žฅ ์ง๊ด€์ ์ด๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ถŒํ•œ์— ํ• ๋‹น๋œ ์ ์ˆ˜(4, 2, 1)๋ฅผ ๋”ํ•ด์„œ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ (Permission) ๊ธฐํ˜ธ (Symbol) ์ˆซ์ž ๊ฐ’ (Octal)
Read (์ฝ๊ธฐ) r 4
Write (์“ฐ๊ธฐ) w 2
Execute (์‹คํ–‰) x 1

์กฐํ•ฉ ์˜ˆ์‹œ

  • 7 (rwx): 4 + 2 + 1 (๋ชจ๋“  ๊ถŒํ•œ)
  • 6 (rw-): 4 + 2 (์ฝ๊ธฐ/์“ฐ๊ธฐ - ์ผ๋ฐ˜ ํŒŒ์ผ)
  • 5 (r-x): 4 + 1 (์ฝ๊ธฐ/์‹คํ–‰ - ์‹คํ–‰ ํŒŒ์ผ, ๋””๋ ‰ํ† ๋ฆฌ)
  • 0 (---): ๊ถŒํ•œ ์—†์Œ

3. ๊ถŒํ•œ ์„ค์ • ๋ฐฉ์‹ B: ๋ฌธ์ž์—ด ๋ชจ๋“œ (Symbolic Mode)

ํŠน์ • ๋Œ€์ƒ์˜ ๊ถŒํ•œ๋งŒ ์ฝ• ์ง‘์–ด์„œ ์ถ”๊ฐ€(+)ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ(-)ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ƒ (Who) ์—ฐ์‚ฐ์ž (Op) ๊ถŒํ•œ (Permission)
u: User (์†Œ์œ ์ž)
g: Group (๊ทธ๋ฃน)
o: Other (๊ธฐํƒ€)
a: All (์ „์ฒด, ugo)
+: ์ถ”๊ฐ€
-: ์ œ๊ฑฐ
=: ์ง€์ •
r: ์ฝ๊ธฐ
w: ์“ฐ๊ธฐ
x: ์‹คํ–‰

์‚ฌ์šฉ ์˜ˆ์‹œ

# run.sh ํŒŒ์ผ์— ์‹คํ–‰(x) ๊ถŒํ•œ ์ถ”๊ฐ€ (๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ)
chmod +x run.sh

# ๊ทธ๋ฃน(g)์—๊ฒŒ ์“ฐ๊ธฐ(w) ๊ถŒํ•œ ์ œ๊ฑฐ
chmod g-w file.txt

# ๊ธฐํƒ€ ์‚ฌ์šฉ์ž(o)์—๊ฒŒ ์ฝ๊ธฐ(r) ๊ถŒํ•œ๋งŒ ํ• ๋‹น
chmod o=r file.txt

Next Step:
ํŒŒ์ผ์˜ ๊ถŒํ•œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ๋Š” chown(Change Owner) ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. chown user:group filename ํ˜•์‹์„ ํ•จ๊ป˜ ์ตํ˜€๋‘์„ธ์š”.

[JBoss EAP 7] Datasource ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ๊ฐ€์ด๋“œ: Picketbox Security Domain ์„ค์ •

๋ณด์•ˆ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์ค€์ˆ˜๋ฅผ ์œ„ํ•ด JBoss EAP 7์˜ standalone.xml ๋˜๋Š” domain.xml ํŒŒ์ผ ๋‚ด์— ์ €์žฅ๋˜๋Š” DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. org.picketbox ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ , Security Domain์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค์™€ ์—ฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ค€๋น„ (Context)

JBoss ์„ค์ • ํŒŒ์ผ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜๋ฉด ๋ณด์•ˆ ๊ฐ์‚ฌ ์‹œ ์ง€์  ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด JBoss๋Š” Security Domain์„ ํ†ตํ•ด ์ธ์ฆ ๊ณผ์ •์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • WAS: JBoss EAP 7.2
  • JDK: 1.8

1. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ๋ฌธ์ž์—ด ์ƒ์„ฑ (Encryption)

๊ฐ€์žฅ ๋จผ์ € ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JBoss ๋‚ด๋ถ€ ๋ชจ๋“ˆ์ธ picketbox๋ฅผ Java๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ์Šคํฌ๋ฆฝํŠธ (create_encrypt_pw.sh)

JBoss ํŒจ์น˜(CP)๊ฐ€ ์ ์šฉ๋˜๋ฉด .overlays ๋””๋ ‰ํ† ๋ฆฌ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ํŒจ์น˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ์ ์ ˆํ•œ jar ํŒŒ์ผ์„ ์ฐพ์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

#!/bin/sh

# 1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ • ํ•„์ˆ˜)
export JAVA_HOME="/SW/was/java1.8"
export PATH="$JAVA_HOME/bin:$PATH"
JBOSS_HOME="/SW/was/JBoss7.2"

# 2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ํƒ์ƒ‰ (Overlay ์ง€์›)
OVERLAY_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/.overlays"
SEARCH_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/org/picketbox/main"

if [ -d "$OVERLAY_DIRECTORY" ]; then
    # ์ตœ์‹  ํŒจ์น˜ ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ
    PATCH_SUBDIRECTORY=$(ls -dt $OVERLAY_DIRECTORY/* | grep "CP" | head -n 1)
    if [ -n "$PATCH_SUBDIRECTORY" ]; then
        echo "Info: Patch directory detected: $PATCH_SUBDIRECTORY"
        SEARCH_DIRECTORY="$PATCH_SUBDIRECTORY/org/picketbox/main"
    fi
fi

# 3. Classpath ์„ค์ •
export CLASSPATH=$(find "$SEARCH_DIRECTORY" -name "*.jar" -print | tr '\n' ':')$CLASSPATH

# 4. ์•”ํ˜ธํ™” ์‹คํ–‰
echo ""
read -p "Enter Database Password : " PASSWORD
echo ""
echo "####################################################"
java org.picketbox.datasource.security.SecureIdentityLoginModule "$PASSWORD"
echo "####################################################"
echo ""

์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

Encoded password: 9fdd42c2a7390d3

์ถœ๋ ฅ๋œ Encoded password ๊ฐ’์„ ๋ณต์‚ฌํ•ด ๋‘ก๋‹ˆ๋‹ค.


2. Security Domain ์„ค์ • (standalone.xml)

์ƒ์„ฑํ•œ ์•”ํ˜ธํ™” ํŒจ์Šค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. security ์„œ๋ธŒ์‹œ์Šคํ…œ ๋‚ด์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋‚ด์šฉ

<subsystem xmlns="urn:jboss:domain:security:2.0">
    <security-domains>
        
        <security-domain name="encryptedSecurityDB" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="sa"/>
                    <module-option name="password" value="9fdd42c2a7390d3"/> <!-- ์•”ํ˜ธํ™”๋œ ๊ฐ’ -->
                    <module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM"/>
                </login-module>
            </authentication>
        </security-domain>
        
    </security-domains>
</subsystem>
์˜ต์…˜ ์„ค๋ช…:
  • username: DB ์ ‘์† ๊ณ„์ • ID (ํ‰๋ฌธ)
  • password: ์œ„์—์„œ ์ƒ์„ฑํ•œ ์•”ํ˜ธํ™”๋œ ํŒจ์Šค์›Œ๋“œ
  • managedConnectionFactoryName: jboss.jca:service=LocalTxCM (๊ณ ์ •๊ฐ’ ์‚ฌ์šฉ)

3. Datasource ์—ฐ๋™ ์„ค์ •

์ด์ œ ๋ฐ์ดํ„ฐ์†Œ์Šค๊ฐ€ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋Œ€์‹  ์œ„์—์„œ ๋งŒ๋“  Security Domain์„ ๋ฐ”๋ผ๋ณด๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ์ „ (Before)

<datasource ...>
    ...
    <security>
        <user-name>sa</user-name>
        <password>admin1234</password>
    </security>
</datasource>

์ˆ˜์ • ํ›„ (After)

user-name๊ณผ password ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•˜๊ณ  security-domain ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
    <driver>h2</driver>
    
    <security>
        <security-domain>encryptedSecurityDB</security-domain>
    </security>
</datasource>

4. ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ์ €์žฅ ํ›„ JBoss ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™(Reload)ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ด€๋ฆฌ ์ฝ˜์†” ๋˜๋Š” CLI์—์„œ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์—ฐ๊ฒฐ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์—ฐ๊ฒฐ ์„ฑ๊ณต ์‹œ, ์„ค์ • ํŒŒ์ผ์— ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‰๋ฌธ์ด ๋‚จ์•„์žˆ์ง€ ์•Š์€์ง€ ์žฌํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Next Step:
๋งŒ์•ฝ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‚ค์Šคํ† ์–ด ํŒจ์Šค์›Œ๋“œ ๋“ฑ JBoss ์„ค์ • ์ „๋ฐ˜์˜ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด, Vault(๋ณผํŠธ) ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€๋กœ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[JBoss EAP 7] Windows ํ™˜๊ฒฝ ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode) ๊ตฌ์ถ•: Master/Slave ๊ตฌ์„ฑ ๋ฐ CLI ์ œ์–ด

JBoss EAP 7.2๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋“œ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. Windows Server ํ™˜๊ฒฝ์—์„œ ๋งˆ์Šคํ„ฐ(Master)์™€ ์Šฌ๋ ˆ์ด๋ธŒ(Slave) ํ˜ธ์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ , add-user๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ์ธ์ฆ(Secret Value)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  CLI๋ฅผ ์ด์šฉํ•œ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋„๋ฉ”์ธ ๋ชจ๋“œ๋Š” Domain Controller(Master)๊ฐ€ ์ „์ฒด ์ •์ฑ…์„ ๊ด€๋ฆฌํ•˜๊ณ , Host Controller(Slave)๋“ค์ด ์‹ค์ œ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • Master: ์„ค์ • ๋ฐ ๋ฐฐํฌ ์ค‘์•™ ๊ด€๋ฆฌ (์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋„์šฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ)
  • Slave: ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋˜๋Š” ์„œ๋ฒ„ ๊ทธ๋ฃน ๊ด€๋ฆฌ

Test Environment

  • OS: Windows NT (10/Server)
  • Version: JBoss EAP 7.2
  • Topology: One-Box ๊ตฌ์„ฑ (ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— Master/Slave ๋””๋ ‰ํ† ๋ฆฌ ๋ถ„๋ฆฌ)

1. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ์ธ์ฆ ํ† ํฐ ํ™•๋ณด

๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ(Master)์™€ ํ˜ธ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Slave) ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” ๋ณด์•ˆ ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. add-user.bat๋ฅผ ํ†ตํ•ด ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  Secret Value๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ ˆ์ฐจ

F:\app\Redhat\JBoss7.2\bin> add-user.bat

# 1. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์„ ํƒ
What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a): a

# 2. ๊ณ„์ • ์ •๋ณด ์ž…๋ ฅ (Username: admin / Password ์„ค์ •)
# ... (์ค‘๋žต) ...

# 3. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์—ฐ๊ฒฐ ์Šน์ธ (์ค‘์š”!)
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master ...
yes/no? yes

# 4. ๊ฒฐ๊ณผ๊ฐ’ ๋ณต์‚ฌ
To represent the user add the following to the server-identities definition
Check Point: ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅ๋œ <secret value="..." /> ๋ฌธ์ž์—ด์„ ๋ฐ˜๋“œ์‹œ ๋ณต์‚ฌํ•ด ๋‘์‹ญ์‹œ์˜ค. Slave ์„ค์ • ์‹œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. ์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (Configuration)

Master์™€ Slave ๊ฐ๊ฐ์˜ host.xml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์—ญํ• ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

1) Master ์„ค์ • (host-master.xml)

์ž์‹ ์ด ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

<host xmlns="urn:jboss:domain:8.0" name="test-master">
    
    <domain-controller>
       <local/>
    </domain-controller>
    ...
</host>

2) Slave ์„ค์ • (host-slave.xml)

Master์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ ์ •๋ณด์™€ ๊ณ ์œ ํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์žฅ๋น„์—์„œ ๋„์šธ ๊ฒฝ์šฐ ํฌํŠธ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ด€๋ฆฌ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<host xmlns="urn:jboss:domain:8.0" name="slave-node01">

    <server-identities>
        <secret value="YWRtaW4xMiMk" />
    </server-identities>

    <domain-controller>
        <remote security-realm="ManagementRealm">
            <discovery-options>
                <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
            </discovery-options>
        </remote>
    </domain-controller>

    <management-interfaces>
        <http-interface security-realm="ManagementRealm">
            <http-upgrade enabled="true"/>
            <socket interface="management" port="${jboss.management.http.port:19990}"/>
        </http-interface>
    </management-interfaces>
</host>

3. ๋„๋ฉ”์ธ ๊ธฐ๋™ (Start Scripts)

๋””๋ ‰ํ† ๋ฆฌ(domain/base/dir)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•œ ๊ธฐ๋™ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

Master ๊ธฐ๋™

F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\master" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-master.xml

Slave ๊ธฐ๋™ (Node 01 & 02)

Slave๋Š” --master-address ์˜ต์…˜์œผ๋กœ Master๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉฐ, -Djboss.socket.binding.port-offset์œผ๋กœ ์„œ๋น„์Šค ํฌํŠธ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

:: Slave Node 01 (Port Offset: 1000)
F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\node01" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-slave.xml ^
 --master-port=9990 ^
 --master-address=192.168.0.6 ^
 -Djboss.socket.binding.port-offset=1000

:: Slave Node 02 (Port Offset: 2000)
F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\node02" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-slave.xml ^
 --master-port=9990 ^
 --master-address=192.168.0.6 ^
 -Djboss.socket.binding.port-offset=2000

4. CLI๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ์ œ์–ด (Management)

๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” jboss-cli๋ฅผ ํ†ตํ•ด ํŠน์ • ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ๋ฌธ

/host=[HOST_NAME]/server-config=[SERVER_NAME]:[start|stop|restart]

์‹คํ–‰ ์˜ˆ์‹œ

:: ์ ‘์† (Master Controller IP๋กœ ์ ‘์†)
F:\app\Redhat\JBoss7.2\bin> jboss-cli.bat --connect controller=192.168.0.6:9990

:: ํŠน์ • ์„œ๋ฒ„(test01) ์ •์ง€
[domain@192.168.0.6:9990 /] /host=slave-node01/server-config=test01:stop
{
    "outcome" => "success",
    "result" => "STOPPING"
}

:: ํŠน์ • ์„œ๋ฒ„(test01) ๊ธฐ๋™
[domain@192.168.0.6:9990 /] /host=slave-node01/server-config=test01:start
{
    "outcome" => "success",
    "result" => "STARTING"
}

Next Step:
๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๊ด€๋ฆฌ ์ฝ˜์†”(http://192.168.0.6:9990)์— ์ ‘์†ํ•˜์—ฌ Runtime ํƒญ์—์„œ Topology๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ธ์‹๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[JBoss EAP 7] MS SQL Server Non-XA ๋ฐ์ดํ„ฐ์†Œ์Šค ์—ฐ๊ฒฐ ์˜ค๋ฅ˜: connection-url ๋ฌด์‹œ ํ˜„์ƒ ํ•ด๊ฒฐ

JBoss EAP 7์—์„œ MS SQL Server์šฉ Non-XA Datasource๋ฅผ ์„ค์ •ํ•  ๋•Œ, <datasource-class> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด <connection-url> ์„ค์ •์ด ๋ฌด์‹œ๋˜์–ด "Connection refused" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ (Issue)

MS SQL Server์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ์œผ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์€ Connection refused ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋กœ๊ทธ

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 
The TCP/IP connection to the host localhost, port 1433 has failed. 
Error: "Connection refused. Verify the connection properties. ... Make sure that TCP connections to the port are not blocked by a firewall."

๋ฐฉํ™”๋ฒฝ์ด๋‚˜ DB ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์ •์ƒ์ด์ง€๋งŒ, JBoss๊ฐ€ localhost:1433(๊ธฐ๋ณธ๊ฐ’)์œผ๋กœ๋งŒ ์ ‘์†์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ URL ์ •๋ณด๋ฅผ ์ „ํ˜€ ์ฝ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.


2. ์›์ธ ๋ถ„์„ (Root Cause)

์ด ๋ฌธ์ œ๋Š” JBoss์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ์šฐ์„ ์ˆœ์œ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • Non-XA ํ™˜๊ฒฝ์˜ ํŠน์„ฑ: JDBC 4 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ java.sql.Driver ๋ฉ”์ปค๋‹ˆ์ฆ˜(URL ๋ฐฉ์‹)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ถฉ๋Œ ๋ฐœ์ƒ: ์„ค์ • ํŒŒ์ผ(standalone.xml)์— <datasource-class>๊ฐ€ ๋ช…์‹œ๋˜๋ฉด, JBoss๋Š” ์ด๋ฅผ ์šฐ์„ ์‹œํ•˜์—ฌ javax.sql.DataSource ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ: ์ด ๊ณผ์ •์—์„œ <connection-url> ์†์„ฑ์€ ๋ฌด์‹œ(Ignored)๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ JDBC URL ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์•„ ์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution)

Non-XA ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •์—์„œ๋Š” datasource-class๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , driver-class์™€ connection-url ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (standalone.xml)

<datasource-class> ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๋ผ์ธ์„ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค.

<datasource jndi-name="java:/mssql" pool-name="mssqljdbc" statistics-enabled="true">
    
    <connection-url>jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ucpost</connection-url>
    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
    
    <driver>sqlserver</driver>
    ...
</datasource>

4. ์ ์šฉ ๋ฐ ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ํŒŒ์ผ ์ €์žฅ ํ›„ JBoss๋ฅผ ์žฌ๊ธฐ๋™(Reload)ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ด€๋ฆฌ ์ฝ˜์†” ๋˜๋Š” CLI์—์„œ ๋ฐ์ดํ„ฐ์†Œ์Šค ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ(Test Connection)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ •์ƒ์ ์œผ๋กœ Success ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
Tip: ๋งŒ์•ฝ XA Datasource(๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์šฉ)๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋Œ€๋กœ xa-datasource-class ์„ค์ •์ด ํ•„์ˆ˜์ ์ด๋ฉฐ URL ๋ฐฉ์‹์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๋ ค๋Š” ํƒ€์ž…(XA vs Non-XA)์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ด์Šˆ ํ•ด๊ฒฐ: Apache CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถฉ๋Œ (WFLYWS0059)

JBoss EAP 6.4์—์„œ 7.x๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋œ Apache CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ JBoss ๋‚ด๋ถ€์˜ WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ์ถฉ๋Œํ•˜์—ฌ ๋ฐฐํฌ๊ฐ€ ์‹คํŒจํ•˜๋Š” ํ˜„์ƒ(WFLYWS0059)์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. jboss-deployment-structure.xml์„ ํ†ตํ•œ ๋ชจ๋“ˆ ์ œ์™ธ(Exclude) ์„ค์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ๋กœ๊ทธ ๋ถ„์„ (Issue)

๊ธฐ์กด EAP 6์—์„œ๋Š” ์ž˜ ๋Œ๋˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด EAP 7 ๋ฐฐํฌ ์‹œ PARSE ๋‹จ๊ณ„์—์„œ ์‹คํŒจํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด๋ƒ…๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋กœ๊ทธ

WFLYSRV0153: Failed to process phase PARSE of deployment "sso.war"
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: 
WFLYWS0059: Apache CXF library (cxf-api-2.7.8.jar) detected in ws endpoint deployment; 
either provide a proper deployment replacing embedded libraries with container module dependencies 
or disable the webservices subsystem for the current deployment adding a proper jboss-deployment-structure.xml descriptor to it.

์›์ธ ๋ถ„์„

  • JBoss EAP 7: ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์‹  Apache CXF ๊ธฐ๋ฐ˜์˜ WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜: WEB-INF/lib ์•ˆ์— ์ž์ฒด์ ์ธ CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: cxf-api-2.7.8.jar)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถฉ๋Œ: JBoss๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ค‘๋ณต์ด ๊ฐ์ง€๋˜๋ฉด ๋ฐฐํฌ๋ฅผ ์ค‘๋‹จ์‹œํ‚ต๋‹ˆ๋‹ค.

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JBoss์˜ WebServices ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , "๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ฒ ๋‹ค"๊ณ  ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด jboss-deployment-structure.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜

  • WAR ํŒŒ์ผ: WEB-INF/jboss-deployment-structure.xml
  • EAR ํŒŒ์ผ: META-INF/jboss-deployment-structure.xml

์ž‘์„ฑ ๋‚ด์šฉ

JBoss์˜ webservices์™€ jaxrs ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ œ์™ธ(exclude)ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋ณธ API๋งŒ ์˜์กด์„ฑ(dependencies)์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        
        <!-- 1. JBoss ๋‚ด๋ถ€ ์„œ๋ธŒ์‹œ์Šคํ…œ ๋น„ํ™œ์„ฑํ™” -->
        <exclude-subsystems>
            <!-- JBoss์˜ CXF ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จ -->
            <subsystem name="webservices" />
            <!-- RESTful ์„œ๋น„์Šค ์ถฉ๋Œ ๋ฐฉ์ง€ (ํ•„์š” ์‹œ) -->
            <subsystem name="jaxrs" />
        </exclude-subsystems>
        
        <!-- 2. ํ•„์ˆ˜ API ์˜์กด์„ฑ ์ถ”๊ฐ€ -->
        <!-- ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ๋บ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ Java EE API๋Š” ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ช…์‹œ์  ๋กœ๋“œ -->
        <dependencies>
            <module name="javax.xml.ws.api"/>
            <module name="javax.jws.api"/>
        </dependencies>
        
    </deployment>
</jboss-deployment-structure>

3. ์ ์šฉ ๊ฒฐ๊ณผ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  • ๊ฒฐ๊ณผ: ์œ„ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•˜๋ฉด, JBoss๋Š” ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  WEB-INF/lib ๋‚ด์˜ jar ํŒŒ์ผ๋“ค์„ ์šฐ์„ ์ ์œผ๋กœ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜: ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด JBoss ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์ด๋‚˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์ธ Spring-CXF ๋“ฑ์ด ์ „์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ)

[JBoss EAP 7.2] Windows Service ๋“ฑ๋ก ๋ฐ ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ (Jsvc, Port Offset)

JBoss EAP 7.2๋ฅผ Windows ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Apache Jsvc๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐฉ๋ฒ•, ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ์„ ์œ„ํ•œ ํฌํŠธ ์˜คํ”„์…‹(Port Offset) ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ํŠน์ˆ˜๋ฌธ์ž ํŒจ์Šค์›Œ๋“œ ์ฒ˜๋ฆฌ ํŒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

JBoss EAP 7๋ถ€ํ„ฐ๋Š” ์„œ๋น„์Šค ๋“ฑ๋ก์„ ์œ„ํ•ด JBoss Core Services (JBCS) - Apache Jsvc ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Red Hat ํฌํ„ธ์—์„œ ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๋‹ค์šด๋กœ๋“œ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

  • JBoss EAP 7.2: ์„ค์น˜ ํŒŒ์ผ ์••์ถ• ํ•ด์ œ
  • Apache Jsvc: Windows์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ (sbin ํด๋” ๋‚ด prunsrv.exe ๋“ฑ ํฌํ•จ)
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
    • JAVA_HOME: JDK ์„ค์น˜ ๊ฒฝ๋กœ
    • NOPAUSE=1: ์„œ๋น„์Šค ์ข…๋ฃŒ ์‹œ ๋ฐฐ์น˜ ํŒŒ์ผ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ํ•„์ˆ˜ ์„ค์ •

1. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์„œ๋น„์Šค ๋“ฑ๋ก

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” service.bat ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก ๋ช…๋ น์–ด

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ CMD ์ฐฝ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ๊ฒฝ๋กœ(/logpath)๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

:: JBoss bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd %JBOSS_HOME%\bin

:: ์„œ๋น„์Šค ๋“ฑ๋ก ์‹คํ–‰
service.bat install /name "JBoss7-Server01" ^
 /controller "localhost:9990" ^
 /config "standalone-ha.xml" ^
 /jbossuser "admin" ^
 /jbosspass "admin1@34" ^
 /logpath "E:\app\Redhat\waslog\testsvr01"
์ฃผ์˜ (Password Special Characters):
๋น„๋ฐ€๋ฒˆํ˜ธ์— &, <, >, | ๋“ฑ์˜ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ CMD ์ฐฝ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํ”ผํ•˜๊ฑฐ๋‚˜, ์Œ๋”ฐ์˜ดํ‘œ(")๋กœ ๊ฐ์‹ธ๊ณ  ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž(^)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค(Multi-Instance) ๊ตฌ์„ฑ

ํ•˜๋‚˜์˜ ์žฅ๋น„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ JBoss ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•  ๋•Œ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„, ํฌํŠธ, ๋กœ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 1: Port Offset ์„ค์ • (XML ์ˆ˜์ •)

service.bat์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํฌํŠธ ์˜คํ”„์…‹์„ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ๋ถˆ์•ˆ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„ค์ • ํŒŒ์ผ(standalone.xml) ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

<socket-binding-group name="standard-sockets" default-interface="public" 
    port-offset="${jboss.socket.binding.port-offset:100}">
    </socket-binding-group>

Step 2: Jsvc ๊ฒฝ๋กœ ์ˆ˜์ • (ํ•„์š” ์‹œ)

๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ ๊ฐ ์„œ๋ฒ„๋ณ„๋กœ ๋‹ค๋ฅธ Jsvc ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๋กœ๊ฐ€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ, service.bat ํŒŒ์ผ์„ ์—ด์–ด PRUNSRV ๊ฒฝ๋กœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rem service.bat ํŒŒ์ผ ํŽธ์ง‘
set PRUNSRV=

rem ์ปค์Šคํ…€ ๊ฒฝ๋กœ ์šฐ์„  ํ™•์ธ ๋กœ์ง ์˜ˆ์‹œ
if exist "%JBOSS_HOME%\..\test01-jbcs-jsvc-1.1\sbin\prunsrv.exe" (
  set PRUNSRV="%JBOSS_HOME%\..\test01-jbcs-jsvc-1.1\sbin\prunsrv.exe"
) else if exist "%JBOSS_HOME%\bin\prunsrv.exe" (
  set PRUNSRV="%JBOSS_HOME%\bin\prunsrv.exe"
) else (
  echo Please install native utilities into expected location...
  goto cmdEnd
)

Step 3: ์ถ”๊ฐ€ ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก

์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ์ปจํŠธ๋กค๋Ÿฌ ํฌํŠธ, ๋กœ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

service.bat install /name "JBoss7-Server02" ^
 /controller "localhost:10090" ^
 /config "standalone-ha.xml" ^
 /jbossuser "admin" ^
 /jbosspass "admin1@34" ^
 /logpath "E:\app\Redhat\waslog\testsvr02"

3. ์„œ๋น„์Šค ์ œ์–ด ๋ฐ ์‚ญ์ œ

๋“ฑ๋ก๋œ ์„œ๋น„์Šค๋Š” Windows ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž(services.msc) ๋˜๋Š” ๋ช…๋ น์–ด๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์‚ญ์ œ (Uninstall)

์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์žฌ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. /name ์˜ต์…˜์— ๋“ฑ๋กํ–ˆ๋˜ ์„œ๋น„์Šค๋ช…์„ ์ •ํ™•ํžˆ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

:: ์„œ๋น„์Šค ์ค‘์ง€
sc stop JBoss7-Server01

:: ์„œ๋น„์Šค ์‚ญ์ œ (service.bat ์ด์šฉ)
service.bat uninstall /name "JBoss7-Server01"

4. ๊ฒ€์ฆ (Verification)

  1. ์„œ๋น„์Šค ์‹คํ–‰: net start JBoss7-Server01
  2. ํฌํŠธ ํ™•์ธ: netstat -an | findstr "9990" (๋˜๋Š” ์˜คํ”„์…‹์ด ์ ์šฉ๋œ ํฌํŠธ)
  3. ๋กœ๊ทธ ํ™•์ธ: ์ง€์ •ํ•œ /logpath ๊ฒฝ๋กœ์— ๋กœ๊ทธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] JSESSIONID ํ˜•์‹ ๋ณ€๊ฒฝ ์ด์Šˆ ๋ถ„์„ ๋ฐ jvmRoute(Instance-ID) ์„ค์ • ๊ฐ€์ด๋“œ

JBoss EAP 7 ๋„์ž… ์‹œ JSESSIONID ๋’ค์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ž์—ด(์„œ๋ฒ„๋ช…, ๊ทธ๋ฃน๋ช… ๋“ฑ)์ด ๋ถ™๊ฑฐ๋‚˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ํ˜„์ƒ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Undertow ์—”์ง„์˜ JvmRouteHandler ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋ฉฐ, ์ด๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์ด์Šˆ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„ (Context)

EAP 6์™€ EAP 7์€ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ™˜๊ฒฝ์—์„œ Sticky Session(์„ธ์…˜ ๊ณ ์ •)์„ ์œ„ํ•ด ID ๋’ค์— ๋ถ™์ด๋Š” ์‹๋ณ„์ž(Route)์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ฒ„์ „๋ณ„ ์ฐจ์ด์ 

๊ตฌ๋ถ„ JBoss EAP 6.x (JBossWeb) JBoss EAP 7.x (Undertow)
Engine Apache Tomcat Fork Undertow
Format [ID].[jvmRoute] [ID].[instance-id]
Default ์„ค์ • ์—†์œผ๋ฉด ID๋งŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Hostname ๋ถ€์ฐฉ ๊ฐ•์ œ๋กœ jboss.node.name ๋ถ€์ฐฉ

๊ธฐ์ˆ ์  ์›์ธ (Undertow JvmRouteHandler)

EAP 7์˜ ์›น ์—”์ง„์ธ Undertow๋Š” io.undertow.server.JvmRouteHandler๋ฅผ ํ†ตํ•ด ์„ธ์…˜ ID๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค์ • ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด, ์„ค์ •๋œ instance-id๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์„ธ์…˜ ID ๋’ค์— ๋ถ™์ด๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ๊ฐ’์€ null์ด๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”(disable)ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ ์ด๋ฆ„์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.


2. ํ•ด๊ฒฐ ๋ฐ ์„ค์ • ๋ฐฉ๋ฒ• (Configuration)

JSESSIONID ๋’ค์— ๋ถ™๋Š” ๊ฐ’์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” undertow ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ instance-id ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (standalone.xml / domain.xml)

Undertow ์„œ๋ธŒ์‹œ์Šคํ…œ ์„ค์ •์—์„œ instance-id ๊ฐ’์„ ์›ํ•˜๋Š” ์‹๋ณ„์ž(๊ธฐ์กด jvmRoute์™€ ๋™์ผํ•œ ์—ญํ• )๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

<subsystem xmlns="urn:jboss:domain:undertow:3.1">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <ajp-listener name="ajp" socket-binding="ajp"/>
        <host name="default-host" alias="localhost">
            ...
        </host>
    </server>
    
    <servlet-container name="default" default-session-timeout="30" instance-id="${jboss.node.name}" />
    
</subsystem>

CLI๋ฅผ ์ด์šฉํ•œ ๋ณ€๊ฒฝ

์šด์˜ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

# instance-id๋ฅผ 'node1'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์‹œ
/subsystem=undertow/servlet-container=default:write-attribute(name=instance-id, value="node1")

# ์„ค์ • ์ ์šฉ์„ ์œ„ํ•ด ๋ฆฌ๋กœ๋“œ ํ•„์š”
reload
์ฃผ์˜ (Warning):
instance-id๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ธฐ์กด์— ๋ฐœ๊ธ‰๋œ ์„ธ์…˜ ID์™€ ๋งคํ•‘์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ๊ธฐ์กด ์‚ฌ์šฉ์ž๋“ค์˜ ์„ธ์…˜์ด ๋Š๊ธธ(Invalidate) ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ ๊ฒ€ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

3. ๊ฒ€์ฆ (Verification)

์„ค์ • ๋ณ€๊ฒฝ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฟ ํ‚ค ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™•์ธ

  1. ๋ธŒ๋ผ์šฐ์ € F12 (๊ฐœ๋ฐœ์ž ๋„๊ตฌ) ์‹คํ–‰
  2. Application ํƒญ > Cookies ์„ ํƒ
  3. JSESSIONID์˜ ๊ฐ’ ํ™•์ธ

๊ฒฐ๊ณผ ์˜ˆ์‹œ:

  • ๋ณ€๊ฒฝ ์ „: abcde12345.server-one-instance-group-a (๊ธธ๊ณ  ๋ณต์žกํ•จ)
  • ๋ณ€๊ฒฝ ํ›„: abcde12345.node1 (์„ค์ •ํ•œ ๊ฐ’์œผ๋กœ ๊น”๋”ํ•ด์ง)

Next Step:
๋งŒ์•ฝ ์•ž๋‹จ์˜ ์›น ์„œ๋ฒ„(Apache/IHS)์™€ mod_cluster ๋˜๋Š” mod_jk๋กœ ์—ฐ๋™ ์ค‘์ด๋ผ๋ฉด, ์›น ์„œ๋ฒ„ ์„ค์ •์˜ jvmRoute ๊ฐ’๊ณผ JBoss์˜ instance-id ๊ฐ’์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ์Šคํ‹ฐํ‚ค ์„ธ์…˜(Sticky Session)์ด ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์–‘์ชฝ ์„ค์ •์„ ๋งž์ถฐ์ฃผ์„ธ์š”.

[VS Code] ํ•œ๊ธ€ ๊นจ์ง ํ˜„์ƒ ์™„๋ฒฝ ํ•ด๊ฒฐ: Auto Guess Encoding ๋ฐ ์ธ์ฝ”๋”ฉ ์ˆ˜๋™ ๋ณ€๊ฒฝ

Windows ํ™˜๊ฒฝ(CP949/EUC-KR)์—์„œ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ์„ VS Code(๊ธฐ๋ณธ UTF-8)๋กœ ์—ด์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ธ€ ๊นจ์ง ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•˜๋Š” ์„ค์ •๊ณผ ์ˆ˜๋™์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜์—ฌ ๋‹ค์‹œ ์—ฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์›์ธ (Context)

ํ•œ๊ธ€ ์œˆ๋„์šฐ ๋ฉ”๋ชจ์žฅ์—์„œ ์ €์žฅํ•œ ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ EUC-KR(๋˜๋Š” CP949) ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, VS Code๋Š” ์ „ ์„ธ๊ณ„ ํ‘œ์ค€์ธ UTF-8์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ์ด ํ•ด์„ ๋ฐฉ์‹์˜ ์ฐจ์ด๋กœ ์ธํ•ด ํ•œ๊ธ€์ด ''์™€ ๊ฐ™์ด ๊นจ์ ธ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10
  • Software: Visual Studio Code

1. Method A: ์ž๋™ ์ธ์ฝ”๋”ฉ ์ธ์‹ ์„ค์ • (Auto Guess Encoding)

VS Code๊ฐ€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜์—ฌ ์ธ์ฝ”๋”ฉ์„ ์ž๋™์œผ๋กœ ์ถ”์ธกํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ธ์ฝ”๋”ฉ์„ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋ฐฉ๋ฒ•

  1. ์„ค์ • ์ง„์ž…: ๋ฉ”๋‰ด์—์„œ File > Preferences > Settings (๋‹จ์ถ•ํ‚ค: Ctrl + ,)
  2. ๊ฒ€์ƒ‰: ๊ฒ€์ƒ‰์ฐฝ์— encoding ์ž…๋ ฅ
  3. ์˜ต์…˜ ์ฒดํฌ: Files: Auto Guess Encoding ํ•ญ๋ชฉ์„ ์ฐพ์•„ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ(Check)
Note: ์ด ๊ธฐ๋Šฅ์€ ํ™•๋ฅ ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ถ”์ธกํ•˜๋ฏ€๋กœ, ๊ฐ„ํ˜น ์˜๋ฌธ๋งŒ ์žˆ๋Š” ํŒŒ์ผ์ด๋‚˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ์„ ์ž˜๋ชป ์ธ์‹ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Method B: ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์—ด๊ธฐ (Reopen with Encoding)

์ž๋™ ์„ค์ •์ด ๋ถˆ์•ˆํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํŒŒ์ผ๋งŒ ๊นจ์งˆ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ž‘์—… ์ ˆ์ฐจ

  1. VS Code ์šฐ์ธก ํ•˜๋‹จ ์ƒํƒœ ํ‘œ์‹œ์ค„(Status Bar)์— ์žˆ๋Š” UTF-8 ํด๋ฆญ.
  2. ์ƒ๋‹จ ๋ช…๋ น ํŒ”๋ ˆํŠธ์—์„œ "Reopen with Encoding (์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋‹ค์‹œ ์—ด๊ธฐ)" ์„ ํƒ.
  3. ๋ชฉ๋ก์—์„œ "Korean (EUC-KR)" ๊ฒ€์ƒ‰ ํ›„ ์„ ํƒ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์šฉ์€ ๊นจ์ง€์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


3. Method C: UTF-8๋กœ ์˜๊ตฌ ๋ณ€ํ™˜ (Save with Encoding)

EUC-KR ํŒŒ์ผ์„ ํ–ฅํ›„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด UTF-8๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ ˆ์ฐจ

  1. ์œ„์˜ Method B๋ฅผ ํ†ตํ•ด ํ•œ๊ธ€์ด ์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์šฐ์ธก ํ•˜๋‹จ ์ƒํƒœ ํ‘œ์‹œ์ค„์˜ ์ธ์ฝ”๋”ฉ(EUC-KR) ํด๋ฆญ.
  3. ์ƒ๋‹จ ๋ช…๋ น ํŒ”๋ ˆํŠธ์—์„œ "Save with Encoding (์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ €์žฅ)" ์„ ํƒ.
  4. "UTF-8" ์„ ํƒ.

์ด์ œ ์ด ํŒŒ์ผ์€ ์˜๊ตฌ์ ์œผ๋กœ UTF-8๋กœ ์ €์žฅ๋˜์–ด, ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ํ•œ๊ธ€์ด ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


4. ๊ฒฐ๊ณผ ํ™•์ธ (Verification)

์„ค์ •์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ธ์ฝ”๋”ฉ์„ ๋ณ€๊ฒฝํ•œ ํ›„, ๊นจ์ ธ ๋ณด์ด๋˜ ํ•œ๊ธ€ ์ฃผ์„์ด๋‚˜ ํ…์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Before (๊นจ์ง)

Broken Korean Text

After (์ •์ƒ)

Fixed Korean Text

Next Step:
ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ํŒ€์› ๊ฐ„์˜ ์ธ์ฝ”๋”ฉ ํ†ต์ผ์„ ์œ„ํ•ด .editorconfig ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ƒ์„ฑํ•˜์—ฌ charset = utf-8์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ์„ค์น˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: java.lang.UnsupportedClassVersionError (JDK ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ)

JBoss EAP 7 ์„ค์น˜ ๋˜๋Š” ๊ธฐ๋™ ์ค‘ java.lang.UnsupportedClassVersionError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ํ˜„์žฌ ์„œ๋ฒ„์— ์„ค์ •๋œ Java ๋ฒ„์ „์ด JBoss๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ตœ์†Œ ์‚ฌ์–‘(JDK 1.8)๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ major.minor version ์ˆซ์ž๋ฅผ ํ†ตํ•ด ์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„

JBoss ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
com/ibm/websphere/... : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    ...

์›์ธ (Root Cause)

์ด ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋ฒ„์ „(Target JVM)๋ณด๋‹ค ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ฒ„์ „(Runtime)์ด ๋‚ฎ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • JBoss EAP 7.x ์š”๊ตฌ์‚ฌํ•ญ: ์ตœ์†Œ JDK 1.8 ์ด์ƒ
  • ํ˜„์žฌ ์„œ๋ฒ„ ์ƒํ™ฉ: JDK 1.7 ์ดํ•˜๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜ JAVA_HOME์ด ๊ตฌ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ

2. ๋ฒ„์ „ ๋งคํ•‘ ํ…Œ์ด๋ธ” (Class File Format)

์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๋œจ๋Š” ์ˆซ์ž(52.0, 51.0 ๋“ฑ)๋Š” Java ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท์˜ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ˜„์žฌ ํ•„์š”ํ•œ Java ๋ฒ„์ „์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Java Version (SE) Major Version (Hex) Major Version (Dec)
Java 14 0x3A 58
Java 13 0x39 57
Java 12 0x38 56
Java 11 0x37 55
Java 9 0x35 53
Java 8 0x34 52
Java 7 0x33 51
Java 6 0x32 50
๋ถ„์„ ์˜ˆ์‹œ:
์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ Unsupported major.minor version 52.0์ด๋ผ๋ฉด, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ Java 8๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์—๋„ Java 8 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Solution)

1) ํ˜„์žฌ Java ๋ฒ„์ „ ํ™•์ธ

java -version

์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ 1.7.x ์ดํ•˜๋ผ๋ฉด JDK ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2) JDK ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ

์„œ๋ฒ„์— JDK 1.8 ์ด์ƒ์„ ์„ค์น˜ํ•œ ํ›„, JBoss๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์„ค์ • ํŒŒ์ผ์—์„œ JAVA_HOME ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Standalone ๋ชจ๋“œ: [EAP_HOME]/bin/standalone.conf (Windows๋Š” .bat)
  • Domain ๋ชจ๋“œ: [EAP_HOME]/bin/domain.conf (Windows๋Š” .bat)
# standalone.conf ์˜ˆ์‹œ
# JAVA_HOME="/usr/lib/jvm/java-1.7.0"  <-- ๊ธฐ์กด (์ฃผ์„ ์ฒ˜๋ฆฌ)
JAVA_HOME="/usr/lib/jvm/java-1.8.0"    <-- ์‹ ๊ทœ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ

Next Step:
JDK ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ ํ›„์—๋Š” ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR/EAR)์ด ์ƒˆ Java ๋ฒ„์ „์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€, -Xmx ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ์˜ต์…˜์ด ๋ณ€๊ฒฝ๋œ ๋ฒ„์ „์— ๋งž๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.