* 프로그램을 어떻게 실행시킬까?
// 로컬 프로그램의 실행
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
- CLI창에서 java Main 명령어를 통해 자바 인터프리터를 실행시켜 Main 클래스를 실행시킵니다.
* 자바 인터프리터는 어떻게 main메서드를 호출할 수 있을까?
- main메서드가 static이기 때문에 호출이 가능합니다. static이 아니면 객체를 생성해야 합니다.
* 그렇다면 원격 프로그램은 어떻게 실행시킬 수 있을까?
- 브라우저, WAS(톰캣)을 통해 실행시킬 수 있습니다.
- 하지만 WAS가 실행되려면 먼저 프로그램을 등록하고 프로그램이 특정 호출로 인해 실행될 수 있도록 URL을 연결시키는 작업이 선행되어야 합니다. 그래야만 웹 브라우저를 통해 접근이 가능하고 프로그램 실행이 가능해집니다.
- 1. @Controller 어노테이션을 통해 프로그램을 등록
- 2. @RequestMapping 어노테이션을 통해 main메서드와 연결
// 원격 프로그램의 실행
@Controller // 1. 프로그램 등록
public class Hello {
int iv = 10; // 인스턴스 변수
static int cv = 20; // static 변수
@RequestMapping("/hello") // 2. URL과 main()를 연결
public void main() { // 인스턴스 메서드 - iv, cv를 둘 다 사용가능
System.out.println("Hello");
System.out.println(iv); // ok
System.out.println(cv); // ok
}
public static void main2() { // static 메서드 - cv만 사용가능
System.out.println(cv); // ok
System.out.println(iv); // error
}
}
* 원격에서 public (static) void main()이 실행될 수 있는 이유?
- 인스턴스 메서드인 main() 함수는 인스턴스 메서드이기 때문에 객체를 생성해야만 한다. 하지만 인스턴스 메서드가 호출이 되었다는 것은 누군가가 객체 생성을 해준다는 것이다. 그 역할을 톰캣이 해준다. 즉, URL로 호출하면 톰캣 내부에서 객체 생성을 통해 인스턴스 메서드를 사용할 수 있는 것이다.
- 따라서, static을 붙여도 상관없으나 인스턴스 변수, 클래스 변수들을 모두 사용할 수 있는 인스턴스 메서드로 생성하는 것이다.
* public 을 private으로 바꾼다면?
- 접근제어자에 상관없이 호출된다. 그 이유는 RequestMapping을 사용했다는 것 자체가 접근제어자에 상관없이 외부에서 호출할 수 있게 한다. 내부에서만 private이다.
* Reflection API의 사용 - 스프링 프레임워크에서 많이 사용되는 기능
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;
// 2. URL과 메서드를 연결
@RequestMapping("/hello")
private void main() { // 인스턴스 메서드 - iv, cv 둘 다 가능
System.out.println("Hello - private");
System.out.println(iv);
System.out.println(cv);
}
public static void main2() { // static 메서드 - cv만 가능
// System.out.println(iv); // error
System.out.println(cv); // ok
}
}
package com.fastcampus.ch2;
import java.lang.reflect.Method;
// private된 클래스를 외부에서 접근할 수 있게 하는 방법
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"); // 클래스 파일(.class)이 메모리에 올라갈 때 클래스 파일마다 Class 객체가 하나씩 생성된다.
Hello hello = (Hello)HelloClass.newInstance(); // Class 객체가 가진 정보로 객체 생성
Method main = HelloClass.getDeclaredMethod("main");
main.setAccessible(true); // private인 main()을 호출가능하게 한다.
main.invoke(hello); // hello.main()
}
}
'Programming > Spring' 카테고리의 다른 글
[스프링의 정석] HTTP 요청과 응답 (0) | 2021.10.27 |
---|---|
[스프링의 정석] AWS에 배포하기 (0) | 2021.10.26 |
[스프링의 정석] AWS에 서버 실행하기 (0) | 2021.10.22 |
[스프링의 정석] AWS에 서버 구축하기 (0) | 2021.10.14 |
[스프링의 정석] Mac OS 기반 스프링 개발 도구 설치 및 설정 (0) | 2021.10.13 |