본문 바로가기

카테고리 없음

스프링 공부 정리 1

클래스 및 프로젝트 구조

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";
	}
	
}

 

@Controller는 web 브라우저에 url 호출 가능한 프로그램으로 올려 놓는다 그렇다면 톰캣에서 어떻게 웹브라우저  url으로 연결을 하는지 예시 코드를 보자 

우선 예시를 보기 앞서서 

 

자바 spring 에서 아래 두가지 개념을 먼저 알아야 한다. 다른 클래스에서 private 객체는 접근이 힘들지만 톰캣에서 서버로 돌릴시에 jvm 내부에서는 클래스를 하나의 객체로 올리고  private 메소드를 웹브라우저에서 호출이 가능하다.

//Reflection API를 사용 - 클래스를 정보를 얻고 
//다를 수 있는 강력한 기능을 제공 함 

 

 

 

package com.fastcampus.ch2;

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

//1.원격 호출이 가능한 프로그램으로 등록
@Controller
public class Hello {
	
	int iv = 10; //인스선트 변수
	static int cv =20; // static 변수
	
	
	@RequestMapping("/hello") //url을 main()과 연결
	private void main() {//인스턴스 메서드 iv cv 둘다 사용가능
		System.out.println("hello private");
		//System.out.println(iv);//접근 제어자 상관 없이 private 호출 가능
		System.out.println(cv); 
	}
	//Reflection API를 사용 - 클래스를 정보를 얻고 
			//다를 수 있는 강력한 기능을 제공 함 
	
	public static void main2() {//static은 인스턴스 멤버 못쓴다 기억!
		System.out.println(cv);
		//System.out.println(iv); error 발생
	}
	
	
}

정적 static 메소드와 static 변수 및 객체는 static끼리만 가능하다. 그 밖의 것들은 인스턴스 변수 static 및 위의 int 변수는 인스턴스 메서드 안에서는 두개다 가능하다. 다른 클래스에서 private 접근 제어를 허용을 하지 않지만 앞서 말한 것 처럼 

REFLECTION API로 인해서 웹 브라우저에서 호출이 가능하다..

 

그렇다면 Main 메서드 안에서의 코드를 살펴 보자

package com.fastcampus.ch2;

import java.lang.reflect.Method;

public class Main {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
//		Hello hello = new Hello();
//		hello.main(); // prviate이라서 다른 클래스에서 접근 불가
		
		//JAVA.LONG.REFLECT 패키지를 사용한다.	
		//Hello 클래스의 Class 객체 (클래스 정보를 담고 있는 객체) 가져옴
		Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
		//클래스 파일이 메모리에 올라 갈 때 클래스 파일 마다 Class 객체가 생성된다.
		Hello hello =(Hello) helloClass.newInstance();//Class 객체가 가진 정보로 생성
		Method main = helloClass.getDeclaredMethod("main");
		
		main.setAccessible(true);//private인 main 호출가능하게 함
		main.invoke(hello);
	}

}

Hello 객체로 생성을 한 hello 변수는 해당 변수에 담은 객체는 오브젝트 타입이라서 형변환을 반드시 해줘야 사용이 가능하다. 나머지는 주석으로 정리를 해놨다. 확인 바란다.