Spring

원격 프로그램 실행

레이코딩 2023. 5. 9. 01:39

출처 - 스프링의 정석 : 남궁성과 끝까지 간다

 

 

1. 로컬 프로그램 실행

- 내 컴퓨터에 있는 프로그램 실행

- IDE, cmd 실행

 

 

2. 원격  프로그램 실행

- 다른 컴퓨터에 있는 프로그램 실행 → 브라우저, WAS 필요

- 브라우저에서 http://111.222.333.444:8080의 URL 호출 → WAS 서버에 있는 프로그램 실행

 

 

- 아무 프로그램이나 원격 실행 가능한 것 아니다.

① 원격 호출이 가능한 프로그램 등록 (@Controller)

② URL과 프로그램을 연결 (@RequestMapping)

 

 

@Controller // 1. 프로그램 등록
public class Hello {

    @RequestMapping("/hello") // 2. URL과 메서드 연결
    public void main() { // 메서드 이름은 아무거나 상관없음
    	System.out.pringln("Hello");
    }
}

 

 

브라우저에 http://111.222.333.444:8080/ch2/hello 의 URL 호출 시 hello와 연결된 메서드 호출

 

 

- 왜 인스턴스 메서드로 할까?

static 메서드는 iv 사용할 수 없기 때문

URL로 원격 프로그램 호출 시 톰캣이 객체 생성 후 인스턴스 메서드 호출

 

 

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 1. 원격 호출 가능한 프로그램으로 등록
public class Hello {
	int iv = 10; // 인스턴스 변수
	static int cv = 20; // static 변수
	
	@RequestMapping("/hello") // 2. URL과 메서드를 연결
	private static void main( ) { // 인스턴스 메서드 - iv, cv 둘다 사용가능
		System.out.println("Hello - private");
		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); // 에러
	}
}

 

 

- private로 호출이 될까?

@RequestMapping 접근 제어자와 상관없이 외부에서 메서드 호출 가능

외부에서 호출 가능하나 내부에서 private 호출 불가

 

 

Reflection API 사용하여 내부에서 호출 가능 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능 제공

 

 

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()과 동일
    }
}

 

 

- AWS 배포

프로젝트 Export → war 파일로 저장

EC2 → C: → 톰캣 → webapps 에 war 파일 복사 → 톰캣 실행 시 자동으로 압출 풀림

15.165.18.126:8080/ch2/hello 호출