2-1. 원격 프로그램의 실행

서현우·2022년 5월 11일
0

스프링의정석

목록 보기
1/85

HomeController.java

프로젝트를 생성하면 패키지에 자동으로 생성됨.
원격프로그램으로 등록 방법

package com.fastcampus.ch2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller //1. 원격 호출 가능한 프로그램으로 등록
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	//2. URL과 메서드 연결(맵핑, mapping)
	@RequestMapping(value = "/", method = RequestMethod.GET)
	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";
	}
	
}

Hello.java

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//1. 원격 호출가능한 프로그램으로 등록
@Controller
public class Hello {
	
	//2. URL과 메서드를 연결
	@RequestMapping("/hello")
	/*
    메서드가 static이던 아니던 상관없다
	왜냐하면 톰캣에서 객체를 만들어 주기 때문에
	but 당연히 static메서드는 iv사용 불가
    따라서 인스턴스 메서드가 iv, cv 둘 다 사용 가능하므로 더 유용
    */
    
	/*
     * @RequestMapping으로 
	 * 접근제어자 private, public 등
	 * 상관없이 외부에서 호출 가능
     * 왜냐하면 Reflection API를 사용하기 때문
     */
	private void main() {
		System.out.println("Hello");
	}
}

PrivateMethodCall.java

Reflection API를 통해 접근제어자가 private이라도 원격으로 접근 가능
Reflection API 사용법

package com.fastcampus.ch2;

import java.lang.reflect.Method;

public class PrivateMethodCall {
	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");
		Hello hello = (Hello)helloClass.newInstance(); //Class객체가 가진 정보로 객체 생성
		
        //main메서드를 밖에서 호출 할 수 있도록
        Method main = helloClass.getDeclaredMethod("main"); // Method main으로 메서드를 참조
		main.setAccessible(true); //private인 main()을 호출가능하게 한다.
		main.invoke(hello); //main메서드 호출. hello.main()과 동일
	}
}
profile
안녕하세요!!

0개의 댓글