Spring

1-1. 웹(원격or서버)과 스프링 프로젝트 연결하기

지지 2022. 1. 28. 00:40

처음부터 다시 공부하고 있는 스프링을 정리해보자!


1. 웹(원격or서버)에서 프로젝트를 실행 시키려면 두 가지 작업을 해주어야 한다.

  • 1) 원격 호출이 가능한 프로그램으로 등록해주기
    • 이 때 사용하는 애노테이션이 @Controller 이다.
    • 실행하고자 하는 클래스의 위쪽에 적어준다.
  • 2) URL과 메서드를 연결한다.
    • 이 때 사용하는 애노테이션이 @RequestMapping 이다.
    • 실행하고자 하는 메서드의 위쪽에 써주며, @RequestMapping(”/hello”) 처럼 매핑주소도 함께 적어주어야 한다.
@Controller //1. 원격 가능한 프로그램으로 등록하기
public class Hello {
	
	//2. URL과 메서드 연결
	@RequestMapping("/hello")
	public void main() {
		System.out.println("Hello");
	}
}

 

  • 3) 서버에 매핑주소를 입력했을 때 결과 이미지

        - 서버에는 404에러가 (잘 된거 맞다.)

        - 콘솔에는 hello가 찍히게 된다!

 

 

2. 동작 원리, 객체 생성은 누가?!

  • 위 코드를 보면 메서드에 static이 붙어 있지 않다. static이 안붙은 메서드는 인스턴스 메서드이기 때문에 객체 생성이 필요하다. 그러나 객체생성을 하지 않았는데도 실행을 시켜보면 웹에서 잘 작동하는 것을 알 수 있다. 어떻게 그럴 수 있을까?
  • 답은 중간에서 누가 객체 생성을 해주기 때문이다.
  • 누가??? 톰갯 내부에서!!! 자세한 건 나중에 배운다고 하신다.
  • 근데 왜 굳이 인스턴스 메서드로 생성을 하는걸까??
  • static메서드는 cv만 사용가능한 반면 인스턴스 메서드는 cv, iv 둘 다 사용 가능하다.
  • 어떤 메서드를 써도 상관은 없지만 인스턴스 메서드를 쓰는 것이 더 효율적일 수 있다!
@Controller
public class Hello {
	
	int iv = 10;
	static int cv = 20;
	
	@RequestMapping("/hello")
	private void main() {
		System.out.println("Hello");
		System.out.println(iv); //ok
		System.out.println(cv); //ok
	}

	public static void main2() {
		//System.out.println(iv); //에러
		System.out.println(cv); //ok
	}
}

 

3. 접근제어자가 상관 없는 원격 프로그램에서의 호출

  • 스프링은 접근제어자에 상관 없이 외부에서 호출이 가능하다. 어떻게???
  • 실행하고자 하는 메서드에 @RequestMapping을 적어주는 순간 URL과 연결이 되어 이 메서드를 외부에서 호출 가능하게 한 것이나 다름 없다.
  • 또한 스프링 프레임워크는 Reflection API를 사용해서 객체를 만들기 때문이다.
  • 아래의 코드는 다른 클래스에서 위 hello 클래스의 main메서드를 호출 한 것이다. 접근제어자가 private이지만, Reflection API를 사용한다면 외부에서 호출이 가능하다. 이것이 스프링 프레임워크가 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.main(); //private라서 외부에선 호출이 불가능
		
		// Reflection API를 사용해 객체를 생성하고 메서드를 호출해보자
		
		// 1. 먼저 클래스에 대한 정보를 얻어와야 한다. - Class객체 : 클래스의 정보를 담고 있는 객체
		Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
		Hello hello = (Hello)helloClass.newInstance(); //Class객체가 가진 정보로 객체 생성
		Method main = helloClass.getDeclaredMethod("main"); //main이라는 메서드에 대한 정보를 가져온다.
		main.setAccessible(true); //private인 main()을 호출 가능하게 한다.
		
		main.invoke(hello); //hello.main()을 호출한 것과 같다.
	}
}
  • 하지만 당연히 프로젝트 내의 다른 클래스에서는 접근제한이 있다!
반응형