* 자바 인터프리터가 main() 호출 -> static main이므로 호출 가능. static이 아니면 객체를 생성해야 호출할 수 있음
원격 프로그램 실행
내 컴퓨터의 브라우저에서 url 입력(원격 컴퓨터의 ip)해서 원격 컴퓨터에 호출하면 -> 원격 컴퓨터의 tomcat이 요청을 받아서 프로그램을 실행한다. 이렇게 웹에서 브라우저로 서버에 있는 프로그램 실행하려면 2가지 작업 필요
1) 프로그램 등록 (웹에서 호출할 수 있도록!)
- @Controller 애노테이션을 class 앞에 붙여줌.
2) URL과 프로그램을 연결
- 호출하려는 메서드(아래 그림에서 main. 이름은 꼭 main일 필요 없음)에다 @RequestMapping 애노테이션과 URL("/hello")을 붙여줌
-> 만약 url이 'http://111.222.333.444:8080/ch2/hello' 이면 hello와 연결된 메서드가 실행됨
여기서 ch2는 context root, 즉 project root라고 생각
STS에서 프로젝트를 생성해보았다. src/main/java 아래에 보면 HomeController라는 파일이 있는 걸 볼 수 있다. 여기 보면 앞서 설명했던 @Controller 와 @RequestMapping이 표시되어 있는 걸 확인할 수 있다.
브라우저에서 확인해보자. ch2 프로젝트에서 우클릭 -> Run As -> Run on Server 를 클릭하면 브라우저에 뭔가 출력된다.
패키지 아래에 Hello라는 새로운 클래스를 만들고 main 메서드를 추가했다. 앞서 설명했다시피 원격으로 프로그램을 호출 가능하려면 @Controller와 @RequestMapping 두 가지 일을 해야 한다고 했다.
애노테이션을 남기고 필요한 import까지 완료했다. 지금 '/hello' url과 main 메서드가 연결되어있는 상태이다. 브라우저에서 /hello url을 입력하면 main 메서드가 호출되어서 "Hello" 가 출력될 것이다.
마찬가지로 ch2 프로젝트에서 Run해 보겠다.
브라우저에서 URL에 hello를 붙이고 들어갔는데 찾을 수 없는 페이지라고 뜬다.
그렇지만 tomcat 콘솔창을 확인해보면 Hello가 출력되어있다. 브라우저에서 저렇게 뜨는 이유는 나중에 알아보자!
그런데 소스 코드를 보면 main 메서드에 static을 붙이지 않았다. 지금 main 은 인스턴스 메서드로, 객체 생성 후에 사용이 가능하다. 인스턴스 메서드가 호출 가능 하다는 건, 중간에 tomcat내부에서 누가 객체를 생성해줬다는 의미이다.
* 인스턴스 메서드와 static 메서드 차이 ->
- 인스턴스 메서드는 인스턴스 변수와 static 변수 모두 사용 가능
- static 메서드는 static 변수만 사용 가능
* 참고로 url로 연결해주면 main 앞에 접근제한자는 상관없이 호출 가능하다.
Hello 클래스에서 main 메서드 접근제한자를 private으로 변경하고, Main 클래스를 생성해서 hello 인스턴스를 생성 후 main 메서드를 호출하려 하면 private이므로 오류가 뜬다. 접근제한자 상관없이 호출이 가능한 이유는 Reflection API를 사용하기 때문이다.
그러면 Reflection API를 이용해 객체를 생성하고 호출해보자. 먼저 클래스에 대한 정보를 얻어와야 한다. Class.forName("패키지명.클래스명") 과 같이 사용한다. (앞에 대충 예외처리 함)
(* 클래스 파일(*.class)이 메모리에 올라갈 때, 클리스 파일마다 Class객체가 하나씩 생성된다.)
받아온 클래스에 대한 정보(helloClass)로 객체를 생성할 수도 있다.
그러면 hello 클래스가 가지고 있는 main 메서드를 밖에서 호출할 수 있게 바꿔보자.
실행해보면 private인 hello 함수가 잘 호출되고 있다.
참조
https://fastcampus.co.kr/dev_academy_nks
스프링의 정석 : 남궁성과 끝까지 간다 | 패스트캠퍼스
국비지원 조기 마감 신화, 베스트셀러 'JAVA의 정석'의 저자 남궁성의 Spring 강의입니다! 오픈톡방과 카페에서 평생 AS를 제공하며 완강과 취업까지 도와드립니다. 지금 할인가로 확인하세요!
fastcampus.co.kr
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ 바이너리 파일 ] (0) | 2022.10.18 |
---|---|
Spring MVC - [ HTTP 요청과 응답 - 이론] (0) | 2022.10.14 |
Spring MVC - [ 클라이언트와 서버 ] (0) | 2022.10.07 |
Spring MVC - [ HTTP 요청과 응답 - HttpServletRequest ] (0) | 2022.09.20 |
Spring - [기본 개발 도구 설치 - JDK11 / SDS3 / IntelliJ / Tomcat / VS Code] (0) | 2022.09.05 |