IT 강의 정리/[스프링의 정석] 남궁성의 끝까지 간다

ch.02 Spring MVC 01~02 원격프로그램의 실행, AWS에 배포하기

Nellie Kim 2022. 9. 27. 09:46
728x90

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에 생긴다. 

이렇게 되면 원격컴퓨터에 우리가 만든 프로그램이 설치가 된것이다. 이제 내 컴퓨터에서 원격컴퓨터로 실행을 해보자

브라우저에서는 출력되는 내용이 없어 이렇게 나오지만, 정상적으로 작동 된 것이다.
브라우저에는 출력된 것이 없지만, 톰캣에서는 println으로 넣었던 Hello - private 이 정상적으로 출력되었다.

 

 

출처 : [패스트캠퍼스] 스프링의 정석 : 남궁성과 끝까지 간다