01. 원격 프로그램의 실행
원격 프로그램을 실행시키려면 2가지가 필요하다. 브라우저와 WAS(톰캣)이다. 브라우저URL에 IP주소를 입력하면 WAS가 8080포트를 호출해서 프로그램을 실행시키는 것이다.
여기서 아무 프로그램이나 실행시킬수 없기때문에 두가지가 필요하다.
1. 프로그램 등록 (@Controller 어노테이션을 클래스 앞에 붙여준다.)
2. URL과 프로그램을 연결 (@RequestMapping 어노테이션을 호출하려는 메서드 앞에 붙여주고, URL키워드를 써준다.)
먼저, ch2 project를 만들어보자. src/main/java폴더 안에는 자동으로 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;
@Controller // 1. 원격 호출 가능한 프로그램으로 등록
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
// 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 클래스를 하나 만들어보자. @Controller , @RequestMapping 까지 내가 써줘야 한다.
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Hello {
@RequestMapping("/hello")
public void main() { //static을 빼고 써보자! static메소드 -> 인스턴스메소드
System.out.println("Hello");
}
}
Run on Server해보면, 사이트에서 404로 뜬다. 잘 실행이 되었다는 뜻이다.
여기서 궁금증..
public static void main() 이 아니라, public void main() 으로 했는데 왜 잘 됐을까?
인스턴스메소드는 원래 객체가 있어야 호출이 가능하다. 그렇다면 누가 객체를 생성 해줬을까???
톰캣 내부에서 객체 생성을 해주었다! 그래서 인스턴스 메소드 임에도 호출이 정상적으로 된 것이다.
하나 더,
public -> private 으로 바꾸면 어떻게 될까?
@Controller
public class Hello {
@RequestMapping("/hello")
private void main() { //public -> private 으로 바꾸면 ?
System.out.println("Hello - private");
}
}
서버에서 정상적으로 동작 한다.
이렇게 다른 Main클래스를 만들고, 그 클래스에서 hello.main()을 부르면 불러와 지지도 않는데, 서버에선 어떻게 정상적으로 불러와 질까?
스프링은 Reflection API를 사용하기 때문이다. 클래스 정보를 얻고 다룰 수 있는 강력한 기능을 제공하는 API이다.
java.lang.reflect패키지를 제공한다. 수동으로 Reflection API를 사용하여 객체를 생성하고, main메서드를 호출해보자.
이런 식으로 Reflection API가 동작하는 것이다. 이를 이용해서 일반적으로 할 수 없는 일들을 많이 할 수 있다.
02. AWS에 배포하기
지금까지는, 로컬에 있는 톰캣을 돌렸다. 이제는 원격컴퓨터에서 서버를 실행시켜보자.
1. 먼저, STS에서 내가 만든 파일 Export하기
ch2 우클릭 → Export → war 검색 → WAR file선택 → Next → Destination : C:\Users\khj\Downloads\ch2.war → Overwrite existing file선택 → Finish
*TIP) AWS에서 'billing' 검색하면 내가 사용한 시간 확인가능!
2. 서버 컴퓨터 접속하여 내가 만든 파일 실행하기
AWS에서 연결한 서버컴퓨터 접속 → C: - tomcat - webapps에 ch2.war파일 복붙(webapps는 웹애플리케이션들이 설치되는 곳. 여기에 ch2.war파일을 넣어놓으면 톰캣이 실행되면서 자동으로 압축이 풀림) → tomcat - bin - startup 클릭하면 ch2.war파일이 압축이 풀리면서 ch2파일이 webapps에 생긴다.
이렇게 되면 원격컴퓨터에 우리가 만든 프로그램이 설치가 된것이다. 이제 내 컴퓨터에서 원격컴퓨터로 실행을 해보자
출처 : [패스트캠퍼스] 스프링의 정석 : 남궁성과 끝까지 간다
'IT 강의 정리 > [스프링의 정석] 남궁성의 끝까지 간다' 카테고리의 다른 글
ch.02 Spring MVC 09~12 관심사의 분리와 MVC패턴 (0) | 2022.10.02 |
---|---|
ch.02 Spring MVC 07~08 HTTP 요청과 응답, 텍스트와 바이너리, MIME, Base64 (2) | 2022.09.28 |
ch.02 Spring MVC 05~06 클라이언트와 서버, 설정파일(server.xml, web.xml) (0) | 2022.09.28 |
ch.02 Spring MVC 03~04 HTTP 요청과 응답 (0) | 2022.09.28 |
ch.01 Spring시작하기 (0) | 2022.09.26 |