오늘의하루

[Java Spring MVC] 1. 원격 프로그램의 실행 요약 본문

JAVA

[Java Spring MVC] 1. 원격 프로그램의 실행 요약

오늘의하루_master 2022. 12. 5. 01:53

1. 로컬 프로그램 실행

public class HelloWorldApp{
    public static void main(String[] args){
        System.out.println("Hello World");
    }
}

커맨드라인에서 실행하는 경우 "java 클래스명"으로 실행이 가능하다.

  • java.exe(자바 인터프리터)가 해당 클래스명에 있는 main 메서드를 호출한다.
  • java.exe가 main메서드를 호출할 수 있는 이유는 main메서드가 현재 static이기 때문이다.

java-HelloWorldApp

2. 원격 프로그램 실행

다른 서버에 있는 프로그램을 사용하기 위해서는 브라우저(프로그램을 사용하고자 하는 곳)와 톰캣(WAS)(프로그램을 가지고 있는 곳)가 필요하다. 

브라우저에서 url을 입력하면 톰캣은 그것을 받아서 알맞는 프로그램을 실행해서 보여준다.

1. 프로그램 등록

2. url과 프로그램을 연결

package com.fastcampus.ch2;

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

@Controller // 1. 프로그램 등록
public class Hello{
    @RequestMapping("/hello") // 2. URL과 메서드(main())를 연결
    public void main(){ // 꼭 메서드명이 main일 필요는 없다.
        System.out.println("Hello");
    }
}

브라우저에서 예를 들어 "http://111.222.333.444:8080/ch2/hello" 라고 요청하면 위에 있는 main메서드가 호출된다.

  • 111.222.333.444는 ip주소이다. 
  • 8080은 포트 번호이다.
  • ch2의 경우 context root 혹은 project root라고 생각하면 된다.

지금 보면 main메서드는 static이 아니지만 객체 생성 없이 main메서드가 호출되는 것을 알 수 있다.

  • 톰캣에서 내부에서 객체 생성을 해준 후에 메서드를 호출 해주기 때문이다.
package com.fastcampus.ch2;

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

@Controller
public class Hello{
    int iv = 10; // 인스턴스 변수
    static cv = 20; // static 변수
    
    @RequestMapping("/hello")
    public void main(){ // 인스턴스 메서드 = iv, cv 둘다 사용 가능
        System.out.println("Hello");
        System.out.println(iv); // OK
        System.out.println(cv); // OK
    }
    @RequestMapping("/hello2")
    public static void main2(){ // static 메서드 = cv만 사용 가능
        System.out.println(cv); // OK
        // System.out.println(iv); Error
    }
    @RequestMapping("/hello3")
    private void main3(){
        System.out.println("Private - hello");
    }
}

// static 메서드를 사용해도 되지만 인스턴스 메서드가 더 자유롭기 때문에 사용한다.
// RequestMapping으로 Url과 연결되어 있기 때문에 접근제어자와 상관없다.

어떻게 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.main3(); - private이기 떄문에 외부 호출 불가
		
		// Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 기능 제공
		// java.lang.reflect 패키지를 제공
		// Hello 클래스의 Class 객체를 얻어온다.
		Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
		Hello hello2 = (Hello)helloClass.newInstance(); // Class 객체가 가진 정보로 객체 생성
		Method main3 = helloClass.getDeclaredMethod("main3");
		main3.setAccessible(true); // private인 main3()를 호출 가능하게 한다.
		main3.invoke(hello); // hello.main3()와 같은 말이다.
	}
}

AWS에서 배포하기

1. 해당 프로젝트를 export 해줘야 한다.

2. 해당 프로젝트를 war파일로 압축해줘야한다.

3. aws 접속

4. EC2에 들어간 후 인스턴스 시작 및 연결(RDP 클라이언트)

5. 원격 데스크톱 파일 다운로드 및 암호 가져오기

6. 원격 데스크톱 접속

7. war 파일 복사 후 

8. 원격 데스크톱에 있는 톰캣 > webapps에 붙여넣기

9. 톰캣 > bin > startup 실행

9-1. war파일의 압축을 푸는 행위이다.

10. 원격 데스크톱에 우리가 만든 프로그램이 설치되었다.

11. 이제 로컬 컴퓨터에서 접속을 시도해보면 된다.

12. aws에 있는 ipv4 퍼블릭 ip를 확인하여 접속해보자.

Comments