[Spring] 원격 프로그램은 어떻게 실행할까?

2024. 7. 8. 02:56WebBack/Spring

1. 원격 프로그램 실행

 

그런데 자신이 사용하는 컴퓨터는 어떻게 실행할 수 있을까? 이를 위해서는 두 가지 준비물이 필요하다. 

 

1. 브라우저

2. tomcat(WAS)

 

브라우저에 위와 같은 URL을 입력하여 tomcat을 호출하여 프로그램을 실행하면 된다. 그런데 이를 위해서는 서버쪽에서 실행할 프로그램을 등록하고, URL과 프로그램을 연결시키는 작업이 선행되어야만 한다. 이를 위한 도구가 바로 컨트롤러 애너테이션과 리퀘스트맵핑 애너테이션이다. 

 

 

2. @Controller

@Controller은 프로그램을 등록하는 역할을 한다. 사용하는 방법도 간단한데, 클래스 앞에 붙이기만 하면 된다. 

 

3. @RequestMapping

 

@RequestMapping은 URL을 실행하려는 메서드와 연결시키는 역할을 한다. 해당 메서드 앞에 @RequestMapping을 붙이고 괄호 안에 URL을 넣으면 된다. 다만, 모든 URL을 다 적을 필요가 없다는 것을 기억하자. 이제 URL에 /hello가 들어가면 main 메서드 안에 있는 코드가 실행된다. 

//1.원격 호출 가능한 프로그램으로 등록
@Controller
public class Hello {
	//2. URL과 메서드를 연결
	@RequestMapping("/hello")
	public void main() {
		System.out.println("Hello");
	}
}

 

4. 실행을 해보자

방법은 확인했다. 그러면 이를 어떻게 실행할까? 아래는 기본으로 제공되는 HomeController 클래스다. 

@Controller // 1. 원격 호출 가능한 프로그램으로 등록
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@RequestMapping(value = "/", method = RequestMethod.GET) //2. URL과 메서드 연결
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
	
}

 

여기서는 @Controller와 @RequestMapping이 사용된 것만 주목하면 된다. 그리고 @RequestMapping를 통해 URL에 "/"만 입력하면 home메서드로 연결된다는 것을 알 수 있다. 실제로 이를 실행한 결과가 다음과 같다. 

 

글자가 깨진 것은 유니코드 문제이다.

그러면 "/"이 아니라 "/hello"를 입력하면 Hello 클래스의 main 메서드가 실행될 것임을 유추할 수 있다. 실제로 이를 실행한 결과가 다음과 같다. 

 

왜 이런 오류 메시지가 뜰까? 일단 이 오류 메시지는 다음과 같은 의미이다. 

 

출처: <<HTTP 완벽 가이드>>

위 메시지는 클라이언트 문제이다. 하지만 여기서 걱정하지 않아도 된다. STS로 들어가보면 다음과 같은 메시지가 출력되어있다는 것을 확인할 수 있다. 

 

System.out.println은 콘솔창에다가 출력하기 때문에 발생한 문제이다. 코드가 잘 작동했으니 크게 걱정하지 않아도 된다. 

 

5. 메서드에 static을 안 붙여도 된다. 

//1.원격 호출 가능한 프로그램으로 등록
@Controller
public class Hello {
	//2. URL과 메서드를 연결
	@RequestMapping("/hello")
	public void main() {
		System.out.println("Hello");
	}
}

 

다시 Hello 클래스를 살펴보면 main메서드 앞에 static이 빠져있다. 본래 static이 없으면 객체를 따로 생성을 해주어야만 실행이 가능하다. 하지만 URL을 입력받을 때에 tomcat이 자동으로 객체를 생성하고 메서드를 호출한다. 따라서 인스턴트 객체지만 객체를 따로 생성할 필요가 없는 것이다. 

 

그런데 일부러 instance 메서드를 사용한 이유는 무엇일까? 이는 static 메서드가 참조하는 범위 때문이다. 

public class Main {
  private int outerIv = 0;
  static int outerCv = 0;

  class InstanceInner {
    int iiv = outerIv;
    int iiv2 = outerCv;
  }

  static class StaticInner {
    int siv = outerIv; //static 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다
    static int scv = outerCv;
  }
}

 

"인스턴스클래스는 외부 클래스의 인스턴스멤버이기 때문에 인스턴스 변수 outerlv와 static변수 outerCv를 모두 사용할 수 있다. 스태틱 클래스는 외부 클래스의 static멤버이기 때문에 외부 클래스의 인스턴스멤버인 outerlv와 instanceInner를 사용할 수 없다. 단지 static멤버인 outerCv만을 사용할 수 있다 - <<자바의 정석 기초편 p.276>>"

 

6. @RequestMapping이 붙으면 private도 접근이 가능하다

//1.원격 호출 가능한 프로그램으로 등록
@Controller
public class Hello {
	//2. URL과 메서드를 연결
	@RequestMapping("/hello")
	private void main() {
		System.out.println("Hello");
	}
}

 

main 메서드 앞에 제어자를 public에서 private로 바꾸었다. 그래도 실행이 될까? 똑같이 실행이 된다. 애초에 @RequestMapping을 쓴다는 것은 URL을 통해서 접근을 하겠다는 의미이기 때문이다. 이는 reflection API를 사용해서 가능한 것이다.