본문 바로가기

Study/SpringFramework

01. 원격 프로그램의 실행 28:24

728x90

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"가 출력되는 것을 알 수 있음.

문장이 정상적으로 실행됨. Console 출력.

@ 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()
	}
}
728x90