1. 로컬 프로그램 실행
public class Main{
public static void main(String[] args){
System.out.println("Hello");
}
}
CMD에서 실행한다면.
> java Main ↵
java.exe(자바 인터프리터) → main() 메서드 호출하는데 static이라서 가능.
Hello
> _
@ static이 뭡니까?
- 변수나 메서드에 키워드로 사용되는데, 클래스가 메모리에 올라갈 때 자동으로 생성된다.
- 그래서 인스턴스(객체) 생성 없이 바로 사용 가능하다.
2. 원격 프로그램 실행
?(실행할 방법) A 컴퓨터 ----------------> B 컴퓨터 (프로그램 실행) |
1. browser가 있어야 A 컴퓨터 ----------------> B 컴퓨터 + WAS가 필요함. (2. 원격 프로그램을 실행할 수 있음.) |
@ browser URL -> 호출 -> B컴퓨터 -> WAS(8080 port 실행) -> 원격 프로그램 실행.
다른 컴퓨터에서 원격 프로그램을 실행하기 위해서 사전작업 2가지
1. 프로그램 등록 -> 외부에서 호출할 수 있게.
2. URL과 프로그램을 연결.
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 1. 원격 호출가능한 프로그램으로 등록
@Controller
public class Hello {
// 2. URL과 메서드 연결
@RequestMapping("/hello")
public void main() {
System.out.println("Hello");
}
}
http://localhost:8080/ch2/hello↵
context root(차후 설명)
메서드의 문장이 실행된다.
그 이유는? Controller에서는 아래
System.out.println("Hello"); //Tomcat Console에다가 출력한 거임.
그래서 브라우저에서 URL로 요청받으면 Tomcat Console에 "Hello"가 출력되는 것을 알 수 있음.
@ static이 없는데 어떻게 메서드가 호출이 됩니까?
- Tomcat에서 URL로 원격 프로그램을 호출하면 객체 생성을 해줌, 그래서 메서드 호출이 된다.
- (차후 추가 설명예정)
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 1. 원격 호출가능한 프로그램으로 등록
@Controller
public class Hello {
int iv = 10; // 인스턴스 변수
static int cv = 20; // static 변수
// 2. URL과 메서드 연결
@RequestMapping("/hello")
public void main() { //인스턴스 메서드 - iv, cv를 둘다 사용가능
// private void main() { // private를 사용해도 정상 출력됨.
// public static void main() { // static을 붙여도 정상 출력됨.
System.out.println("Hello - static");
System.out.println(cv); // OK
// System.out.println(iv); // OK
}
public static void main2() { // static메서드 - cv만 사용가능
System.out.println(cv); //OK
// System.out.println(iv); // 에러.. why? static으로 선언되니 메서드는 인스턴스 변수를 사용할 수 없음.
}
}
@ private으로 선언해도 정상 출력됨. why?
@RequestMapping 은 "URL로 외부에서도 호출 가능하도록 하겠다." 라는 어노테이션이다.
그래서 접근제어자 상관없이 호출 가능하도록 되어있음.
Reflection API를 사용하면, 외부에서도 private 메서드를 사용하게 할 수 있는데,
Spring Framework는Reflection API를 이용하여 객체를 생성하기 때문에 private으로 선언해도 사용 가능한 것이다.
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception{
// Hello hello = new Hello();
// hello.main(); // private이라서 외부 호출 불가.
// Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능 제공
// java.lang.reflect 패키지를 제공
// Hello클래스의 Class객체(클래스의 정보를 담고 있는 객체)를 얻어온다.
Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
Hello hello = (Hello)helloClass.newInstance(); // Class객체가 가진 정보로 객체 생성
Method main = helloClass.getDeclaredMethod("main");
main.setAccessible(true); // private인 main()을 호출 가능하게 한다.
main.invoke(hello); // hello.main()
}
}
'Study > SpringFramework' 카테고리의 다른 글
07. HTTP 요청과 응답 - 이론 36:22 (0) | 2022.05.10 |
---|---|
06. 설정 파일 - server.xml, web.xml 13:28 (0) | 2022.05.10 |
05. 클라이언트와 서버 34:25 (0) | 2022.05.10 |
04. HTTP 요청과 응답 - 예제 16:21 (0) | 2022.05.10 |
03. HTTP 요청과 응답 - 실습 26:52 (0) | 2022.05.10 |