Spring 프로젝트를 생성 후 브라우저에서 원격으로 우리가 만든 프로젝트를 실행하는 방법을 알아보자
Controller 생성
1. 프로그램 등록
2. URL과 프로그램을 연결
@Controller // 원격 호출 가능한 프로그램으로 등록
public class Hello {
@RequestMapping("/hello") // URL과 프로그램을 연결
public void hello() {
System.out.println("hello");
}
}
3. 브라우저에서 해당 URL로 호출
실행결과
hello
인스턴스 메서드가 실행될 수 있는 이유
메서드가 static이 아닌 인스턴스 메서드임에 주목하자. 인스턴스 메서드는 객체가 생성된 후에 사용할 수 있는데 우리 코드에는 객체를 생성한 흔적이 없다. 이는 누군가가 객체를 대신 생성해줬다는 얘기다. 여기서는 Hello 객체를 생성해준다.
브라우저에서 URL로 호출을 하면 톰캣 (WAS서버) 내부에서 객체를 생성해주고 메서드가 호출되는 것이다.
@RequestMapping("/hello")
public void hello() { // 인스턴스 메서드. 톰캣이 객체를 생성해준다.
System.out.println("hello");
}
static메서드가 아닌 인스턴스 메서드를 사용하는 이유
메서드에 static을 붙여도 되고 안붙여도 된다. 하지만 static 메서드에서는 인스턴스 변수를 사용할 수 없기 때문에 가급적이면 인스턴스 메서드를 사용하면 좋다.
@Controller // 원격 호출 가능한 프로그램으로 등록
public class Hello {
int iv = 10; // 인스턴스 변수
static int cv = 20; // static 변수
// URL과 메서드를 연결
@RequestMapping("/hello")
public void main() {
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 메서드도 실행이 될까?
@Controller // 원격 호출 가능한 프로그램으로 등록
public class Hello {
// URL과 메서드를 연결
@RequestMapping("/hello")
private void main() {
System.out.println("Hello - private");
}
}
실행결과
Hello - private
@RequestMapping 어노테이션은 외부에서 접근가능하도록 매핑해준 것이기 때문에 메서드의 접근제어자에 상관없이 호출가능하다.
어떻게 가능할까?
JAVA의 Reflection API를 사용하기 때문
Main 클래스 생성
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");
// Class객체가 가진 정보로 객체 생성
Hello hello = (Hello) helloClass.newInstance();
// Main이라는 메서드 정보 가져오기
Method main = helloClass.getDeclaredMethod("main");
// private인 main()을 호출가능하게 한다.
main.setAccessible(true);
main.invoke(hello); // hello.main() 실행
}
}
실행결과
Hello - private
Spring Framework은 자바의 Reflection API를 이용해서 객체를 많이 만든다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] 클라이언트와 서버에 대해 알아보자 (0) | 2021.12.28 |
---|---|
[Spring] HTTP 요청과 응답에 대해 알아보자 (0) | 2021.12.28 |
[Spring] Maven Lifecycle에 대해 알아보자 (0) | 2020.09.02 |
[Spring] Maven에 대해 알아보자 (0) | 2020.09.02 |
[Spring] DB연결, Controller에 대해 알아보자 (0) | 2020.08.20 |