원격 프로그램의 실행

뫄뫄(ahk)·2022년 9월 6일
0

Spring

목록 보기
15/18

이 게시글은 남궁성의 스프링의 정석 온라인 강의를 듣고 정리한 내용입니다.

원격프로그램의 실행

원격 프로그램을 실행하는 과정(간단하게..)

  1. 브라우저의 주소창에 ip주소 또는 도메인 이름이 포함된 url을 입력하여 WAS에 요청을 보냄
  2. WAS(Web Application Server)는 받은 요청을 처리하여 응답을 보냄

원격 프로그램의 실행을 위해서는 2가지가 필요한데, 첫째는 URL로 요청을 보내 프로그램을 호출할 수 있도록 프로그램을 '등록'해야하며 둘째는 요청 URL과 프로그램을 연결(mapping)해야한다.

@Controller                    // 1. 프로그램으로 등록
public vlass HomeController{
	public static String str = "aaa";
    public String str2 = "aaa";
    
	@RequestMapping("/")       // 2. URL과 요청을 처리하는 메서드 연결
    public String home() { ... }
}

위의 코드를 잘 보면 매핑된 메서드가 static이 아니다. 하지만 브라우저에서 요청을 보내면 바로 호출되는데 이는

  • 프로그램을 등록했기 때문에 호출이 가능하다는 의미를 내포하고 있고
  • 이미 객체가 생성 되어있음을 알 수 있다.

객체를 미리 등록하는 WAS

WAS에서는 등록된 클래스의 인스턴스를 대신 생성한다.
이것의 장점은, 객체를 따로 생성하지 않아도 됨은 물론이고 static 변수 뿐만 아니라 인스턴스 멤버도 사용할 수 있다는 것이다.

또 매핑된 메서드가 private이어도 프로그램이 등록되어있고, 메서드가 URL과 매핑되어있다면 호출가능하다. 이는 Spring이 reflection API를 사용하기 때문이다.

Reflection API는 무엇일까?

클래스의 정보를 불러오고 사용하여 객체 생성등의 여러 작업을 할 수있는 강력한 기능을 제공하는 인터페이스이다.
java.lang.reflect 패키지를 제공하여 여러 메서드를 사용할 수 있다.

Class clazz = Class.forName("com.devcamp.controller.Hello")
//Hello클래스 정보를 가지고 있는 Class 객체 가져오기
Hello hello = clazz.newInstance();  //객체 생성
Method main = clazz.getDeclaredMethod("main"); //main 메서드 정보 가져오기
main.setAccessible(true); //priave 메서드를 호출가능하게 변경
main.invoke(hello);  // hello.main(); 호출

위의 코드는 Reflection API를 통해 private인 main()를 호출하는 과정을 보여준다.

HTTP 요청과 응답

HTTP(Hyper Text Transfer Protocol)요청과 응답이란
HTML 파일을 전송하기 위한 규격에 맞는 요청과 응답을 말한다.

Spring 에서는 HTTP 요청과 응답을 어떻게 받고 보낼까?

먼저 브라우저에서 HTTP 요청을 보내면
1. 스프링 프레임워크 내부에서 요청에대한 모든 정보를 HttpServletRequest라는 객체에 저장한 다음
2. 매핑된 메서드의 파라미터에 HttpServletRequest 변수를 선언해주면
3. 메서드 내에서 변수를 사용하여 요청을 처리할 수 있다.

@Controller
public class LoginController{
	@ReuquestMapping("/login")
    public String login(HttpServletRequest req) {
    	String id = req.getParameter("id");
        ...
    	return "login";
    }
}

남궁성 선생님은 위 과정을 자바 프로그램 실행과 비교해서 설명해주셨는데 너무 쉽게 이해할 수 있어서 그 예도 적어보려고 한다.

cmd에서 java 프로그램을 실행할 때 argument를 줄 수 있다.

>> java com.devcamp.Hello 1 2 3
//Hello라는 자바 프로그램을 실행하는데,
// 1, 2, 3이라는 인자를 넘겨준다

아래는 Hello의 main()이다

class Hello {
	public void main(String[] args){
    	int arg1 = args[0]; // 1
        int arg2 = args[1]; // 2
        int arg3 = args[2]; // 3
    }
}

Hello 프로그램을 실행할 때, 1,2,3이라는 인자를 함께 넘겨주면 main()의 String 배열에 차례로 저장되어 배열에서 값을 꺼내어 사용할 수 있다.
HttpServletRequest가 바로 위의 String배열의 역할을 하는 것이다.

어떻게 HttpServletRequest 변수를 매핑된 메서드의 파라미터로 선언만하면 메서드 내에서 사용할 수있는지는 다음에 알아보자.

profile
NONONONONONOYes!

0개의 댓글