0. ๋ก์ปฌ ํ๋ก๊ทธ๋จ ์คํ vs ์๊ฒฉ ํ๋ก๊ทธ๋จ ์คํ
๋ก์ปฌ ํ๋ก๊ทธ๋จ์ ์ธํฐํ๋ฆฌํฐ๋ ์ปดํ์ผ๋ฌ๋ง ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ฉด ์๊ฒฉ ํ๋ก๊ทธ๋จ์ ๋ธ๋ผ์ฐ์ ์ tomcat ๊ฐ์ WAS๊ฐ ์์ด์ผ ์คํํ ์ ์๋ค.
** ์ธํฐํ๋ฆฌํฐ์ ์ปดํ์ผ๋ฌ์ ์ฐจ์ด
๋ ๋ค ๋ฒ์ญ๊ธฐ ์ด๋ค.
์ปดํ์ผ๋ฌ๋ ์์ค ์ฝ๋๋ฅผ ํ๋ฒ์ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ (๋ฒ์ญ ์๋๊ฐ ๋น ๋ฆ)
์ธํฐํ๋ฆฌํฐ๋ ์ฝ๋ ํ ํ์ฉ ์ค๊ฐ ์ฝ๋๋ก ๋ฒ์ญํ์ฌ ์คํ
python์ด ์ธํฐํ๋ฆฌํฐ ์ฐ๋ ์ธ์ด, C๋ C++์ด ์ปดํ์ผ๋ฌ ์ธ์ด
์๋ฐ๋ ๋ ๊ฐ ๋ค ์์.
1. ์ํ์ ํํ
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//1. ํด๋์ค๋ฅผ ์๊ฒฉ ํธ์ถ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฑ๋ก
@Controller
public class Hello {
//2. URL๊ณผ ๋งค์๋๋ฅผ ์ฐ๊ฒฐ (/hello๋ผ๋ url๊ณผ main ๋งค์๋๊ฐ ์ฐ๊ฒฐ์ด ๋ ๊ฒ์.)
@RequestMapping("/hello")
// ๋งค์๋ ์ด๋ฆ์ ๊ตณ์ด main์ด ์๋์ด๋ ๋จ. ์๋ฌด๊ฑฐ๋ ๊ฐ๋ฅ
public void main() {
System.out.println("Hello - private");
System.out.println(cv);
}
}
(1)์์ ๋งค์๋๊ฐ Static์ด ์๋ ์ธ์คํด์ค ๋งค์๋์ธ๋ฐ๋ ์คํ์ด ๋์์. Why?
a. Static ๋งค์๋๊ฐ ์๋๋ฉด ์คํ์ด ์๋๋ ์ด์
: ์ธ์คํด์ค ๋งค์๋๋ ๊ฐ์ฒด ๋ง๋ค ๋ณ์ ๊ฐ์ด ๋ฌ๋ผ์ง๋ฏ๋ก, ๊ฐ์ฒด๊ฐ ์์ด์ผ๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์์ด ํด๋์ค์ ๋ฐ๋ก ์ ๊ทผํ ์์ ๊ฒฝ์ฐ๋ Static ๋งค์๋๋ง ์ฌ์ฉํ ์ ์๋ค.
b. ๊ทผ๋ฐ๋ ์คํ ๋ ์ด์
: URL๋ก ์๊ฒฉ ํธ์ถ์ด ๋ค์ด์ค๋ฉด ํฐ์บฃ ์๋ฒ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑ ํด์ฃผ๊ธฐ ๋๋ฌธ์
c. ๋ฐ๋ผ์ ์ธ์คํด์ค ๋งค์๋ ์ฌ์ฉ์ด ์ด๋์ธ ์ด์
: ์ธ์คํด์ค ๋งค์๋๋ Static ๋งค์๋์ ๋ฌ๋ฆฌ ์ธ์คํด์ค ๋ณ์๊น์ง๋ ์ฌ์ฉํ ์ ์์ด, ์ฌ์ฉ ๋ฒ์๊ฐ ๋ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
2. ๋งค์๋์ ์ ๊ทผ ์ ์ด์๊ฐ private์ฌ๋ ์๊ฒฉ ํ๋ก๊ทธ๋จ์์ ํธ์ถ์ด ๋ ๊น? (๋๋ค.)
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Hello {
int iv = 10; // ์ธ์คํด์ค ๋ณ์
static int cv = 20; // static ๋ณ์
@RequestMapping("/hello")
private void main() {
System.out.println("Hello - private");
System.out.println(cv);
}
}
๋๋ ์ด์
: Mapping ํ๊ฒ ๋ค๋ ์๋ฆฌ๋ ํด๋น ๋งค์๋๋ฅผ ์ธ๋ถ์์ ํธ์ถํ๊ฒ ๋ค๋ ์๋ฆฌ์.
๋ฐ๋ผ์ ์ ๊ทผ ์ ์ด์ ์๊ด ์์ด ์ธ๋ถ์์ ํธ์ถ์ด ๊ฐ๋ฅํจ.
๋ฌผ๋ก ์ฝ๋ ์ฐ๋ ๋ด๋ถ์์๋ ์์น๋๋ก ๋ค๋ฅธ ํด๋์ค๊ฐ ํด๋น private ๋งค์๋๋ฅผ ์ด์ฉํ ์ ์์
(์ฐธ๊ณ ) ๋ด๋ถ์ ๋ค๋ฅธ Class์์ ํด๋น private ๋งค์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฒ
**Class ๊ฐ์ฒด์ ๋ํ์ฌ
a. Class ๊ฐ์ฒด๋ ํด๋น ํด๋์ค์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
(๋ณ์์ ์, ์ด๋ฆ, ์๋ฃํ // ๋งค์๋ ์ด๋ฆ, ์๋ฆฌ, ๋ฐํํ ๋ฑ)
b. Class ๊ฐ์ฒด๋ ํด๋์ค ๋น 1๊ฐ๋ง ์กด์ฌํ๊ณ , ํด๋น ํด๋์ค ํ์ผ(~.class)์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ ๋ ๋ ์์ฑ
c. ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ป๋ ๋ฐฉ๋ฒ
ใฑ. ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์ถ์ ํด๋์ค๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ๋,
//Card ๋ผ๋ ํด๋์ค์ ์๋ก์ด ๊ฐ์ฒด c๋ฅผ ์์ฑ
Card c = new Card();
// getclass()๋ ํด๋น ๊ฐ์ฒด๊ฐ ์ํ ํด๋ซ์ Class ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋งค์๋
// ๋ฐ๋ผ์ Card ํด๋์ค์ ๋ชจ๋ ์ ๋ณด๊ฐ cobj๋ ๊ฐ์ฒด๋ก ๋ค์ด๊ฐ๋ค.
Class cobj = c.getclass()
ใด. ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ถ์ ํด๋์ค์ ์ด๋ฆ๋ง ์ ๋
//Card.class๋ Card์ ํด๋์ค ๊ฐ์ฒด
Class cObj = Card.class
// ํด๋์ค์ ์ด๋ฆ์ผ๋ก ํด๋น ํด๋์ค์ ํด๋์ค ๊ฐ์ฒด ๋ฝ๋ ๋ฒ
Class cObj = Class.forName("Card");
** ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์์ฑ!
ํด๋์ค ๊ฐ์ฒด์๋ ํด๋น ํด๋์ค์ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค ๋ค์ด๊ฐ ์๋ค. ํด๋์ค๋ ์ค๊ณ๋ ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ค๊ณ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํด๋น ๋ชจ๋ธ์ ๋๊ฐ์ด ๋ง๋ค ์ ์๋ฏ์ด ํด๋์ค ๊ฐ์ฒด์๋ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค ์์ผ๋, ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋๊ฐ์ด ๋ง๋ค ์ ์๋ค.
// ์ผ๋ฐ์ ์ธ Card ํด๋์ค์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ (์๋ณธ ์ค๊ณ๋๋ก ๋ง๋ค๊ธฐ.)
Card c2 = new Card();
// Card ํด๋์ค์ ํด๋์ค ๊ฐ์ฒด ์ด์ฉ๋ฐฉ๋ฒ (์ค๊ณ๋ ๋นผ๊ปด์ ๋๊ฐ์ด ๋ง๋ค๊ธฐ.)
// ํด๋์ค ๊ฐ์ฒด๋ ๋ฐํํ์ด Object๋ผ ํ ๋ณํ์ด ํ์!
Card c2 = (Card)cObj.newInstance();
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class Main {
public static void main(String[]args) throws Exception {
// ๊ฐ์ฒด ์์ฑ
// Hello hello = new Hello();
// ํด๋น ๋งค์๋๊ฐ private๋ผ ์ธ๋ถ ํธ์ถ์ด ๋ถ๊ฐ
// hello.main();
Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
Hello hello = (Hello)helloClass.newInstance(); // Class๊ฐ์ฒด๊ฐ ๊ฐ์ง ์ ๋ณด๋ก ๊ฐ์ฒด ์์ฑ
// ํด๋์ค ๊ฐ์ฒด์ ์ ๋ณด๋ก๋ง ์กด์ฌํ๋ main ๋งค์๋๋ฅผ ๊ตฌ์ฒดํ ์ํจ ๊ฒ
Method main = helloClass.getDeclaredMethod("main");
//private์ธ main()์ ํธ์ถ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
main.setAccessible(true);
//ํจ์ ํธ์ถ! hello.main() ํธ์ถ๊ณผ ๊ฐ์ ๋ง
main.invoke(hello);
}
}
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
RequestMapping /๋ค์ URL ๋ฐ๊ฟ์ ํด๋ดค๋ค. ๋๋ค!