- 로컬 프로그램 실행
- 원격 프로그램 실행
- 실습(1) - Hello 출력하기, 인스턴스 메서드
- 실습(2) - Reflection API
1. 로컬 프로그램 실행
로컬 프로그램을 실행할 때 cmd창에 '> java Main'을 입력하면 java.exe(java interpreter)가 Main 클래스에 있는 main 메서드를 실행한다. java interpreter가 main 메서드를 호출할 수 있는 이유는 static이기 때문이다. static은 객체생성을 안한다.
2. 원격 프로그램 실행
다른 컴퓨터에 있는 main 메서드를 실행하기 위해서는 어떻게 해야할까?
노트북에는 browser가 있고, 원격 컴퓨터에는 WAS가 필요하다. WAS가 있어야 원격 프로그램을 실행할 수 있다. 원격 컴퓨터의 IP 주소 '111.222.333.444'를 URL에 입력하고 port번호인 :8080을 같이 입력한다. 요청 '111.222.333.444:8080/ch2/hello'을 톰캣이 받아서 실행한다.
이를 위해서는 1. 프로그램 등록, 2. URL과 프로그램을 연결, 2가지를 해야한다.
@Controller는 프로그램 등록, @RequestMapping은 URL과 main( ) 메서드를 연결한다. 'http://111.222.333.444:8080/ch2/hello'을 입력하면 hello에 mapping된 main 메서드가 실행된다. ch2는 Context root, Project root라 생각해도 된다. main 메서드의 이름은 mapping과 상관이 없고 mapping되어 있는 "/hello"만 동일하면 원격으로 프로그램을 호출할 수 있다.
3. 실습(1) - Hello 출력하기, 인스턴스 메서드
STS에서 New -> Spring Legacy Project를 클릭한다.
Project name은 ch2로 하고, Templates는 Spring MVC Project를 선택한다.
package명은 URL과 비슷한데 거꾸로 쓰기 때문에 com.fastcampus.ch2로 작성한다.
브라우저에 hello를 치면 main 메서드가 호출되서 Hello가 찍힐 것이라 생각이 든다.
???
브라우저에는 출력될게 없고 System.out.println은 console에 출력 한다. 따라서 console에 Hello 출력되었다.
⭐ main 메서드 static이 아닌데 어떻게 출력이 될까?
인스턴스 메서드는 객체생성이 되어야 한다. URL로 hello를 요청했을 때 누군가가 객체를 생성해야 하고 톰캣이 이를 해준다. 톰캣이 객체를 생성한 후에 메서드를 호출한다. 톰캣 내부에 객체를 생성하는 기능이 있다. 따라서 static이 아니라 인스턴스 메서드여도 호출이 가능하다.
아무튼 호출이 오면 객체 생성을 누군가가 해준 후에 메서드가 호출된다. 그게 톰캣!
심지어 private도 가능하다. mapping만 해주면 어떤 메서드도 실행 가능하다.
4. 실습(2) - Reflection API
Main 클래스 파일을 생성하고, Hello 클래스 객체를 생성하고 main 메서드를 호출하면 error 발생한다. private라서 외부에서 사용 불가능하다. 방금은 외부에서 사용가능 했는데 어떻게 가능한걸까?
Reflection API를 사용하면 클래스 정보를 얻어서 다룰 수 있게 된다. Reflection API는 java.lang.reflect 패키지를 제공한다. Class를 얻어오기 위해서 forname 메서드를 사용한다. 클래스 이름은 package명과 같이 써야하므로 "com.fastcampus.ch2.Hello"를 적는다. 이 한줄은 Hello클래스의 Class객체(클래스 정보를 담고 있는 객체)를 얻어온다. Class는 Hello의 객체 정보를 모두 갖고 있기 때문에 객체 생성부터 메서드 사용까지 가능하다.
helloClass는 Hello 클래스의 객체 정보를 모두 갖고 있어 newInstance 메서드를 통해 객체 생성 가능하다. getDeclaredMethod 메서드를 사용해서 Hello의 main 메서드를 갖고올 수 있다. 갖고온 main 메서드를 setAccessible 메서드로 호출가능하게 만들면 private인 main 메서드도 호출 가능하다. 위를 실행하면 console 창에 private 메서드가 실행된 것을 볼 수 있다. 다른 클래스에서 Reflection API를 사용해서 외부 메서드를 사용할 수 있고, Spring이 Reflection API를 많이 사용한다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
ch2_05. 클라이언트와 서버(3) (0) | 2023.04.12 |
---|---|
ch2_04. HTTP 요청과 응답 - 예제 (0) | 2023.04.10 |
ch2_03. HTTP 요청과 응답 - 실습 (0) | 2023.04.10 |
ch2_05. 클라이언트와 서버(2) (0) | 2023.04.03 |
ch2_05. 클라이언트와 서버(1) (0) | 2023.04.02 |