브라우저와 WAS(웹 애플리케이션 서버)가 있어야 원격프로그램을 실행할 수 있다.

 

 

1. 프로그램 등록 (@Controller을 클래스에 붙임)

2. URL과 프로그램을 연결 (@RequestMapping을 메소드에 붙임)

-> URL을 입력하면 프로그램이 실행 될 수 있게 함

 

 

서버가 제공하는 리소스

실행시마다 결과가 변함 -> 동적 리소스(프로그램, 스트리밍)

변하지 않음 -> 정적 리소스(이미지, *.js , *.css, *.html)

 

ex)

 

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")
	public void main() { 
		System.out.println("Hello");
		
	}
}

URL의 주소는 http://localhost:8080/ch2/hello 이며

ch2는 내가 만든 스프링 프로젝트의 이름이고, @RequestMapping 애너테이션 뒤에 붙은 /hello가 URL에 사용된다.

 

 

 

- URL의 정보를 이용

브라우저에 URL을 입력해서 요청을 하면 해당 서버에 있는 Tomcat이 요청을 받아서 객체를 생성하고 정보를 객체에 담는다.

해당 객체를 메소드의 매개변수로 제공하고 메소드 내에서 해당 객체를 이용함.

 

(예제를 통해 확인해본다)

 

ex)

package com.fastcampus.ch2;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

// 년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTeller {

//	public static void main(String[] args) {
		@RequestMapping("/getYoil")
		public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
			
		// 1. 입력
		String year = request.getParameter("year");
		String month = request.getParameter("month");
		String day = request.getParameter("day");
		
		
		// 2. 작업
		int yyyy = Integer.parseInt(year);
		int mm = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		
		Calendar cal = Calendar.getInstance();
		cal.set(yyyy, mm-1, dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		char yoil = " 일월화수목금토".charAt(dayOfWeek);
		
		// 3. 출력
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter(); // response객체에서 브라우저로의 출력 스트림을 얻는다.
		out.println(year + "년 " + month + "월 "+day+ "일은 ");
		out.println(yoil + "요일입니다.");
		
	}

}

HttpServletRequest 타입의 객체를 매개변수로 사용하면

Tomcat이 URL로부터 정보를 얻어서 그 정보를 객체에 만들어 저장해 제공한다.

(URL은 http://localhost:8080/ch2/getYoil?year=2022&month=4&day=8 이고 

? 이후의 문자열인 쿼리 스트링에 정보가 있다. 쿼리 스트링의 숫자들을 원하는 값으로 변경하여 활용할 수 있다)

 

그 결과로 request 객체가 생성되었고 HttpServletRequest 클래스에 있는 getParameter 메소드를 이용해서

필요한 정보를 얻어 작업을 완료하였다.

 

출력 부분을 보면 이번엔 HttpServletResponse 타입의 객체를 매개변수로 받아서 사용하였는데,

이 객체는 Console이 아닌 브라우저에 출력을 하기위해 사용한다.

 

출력하기 전에 출력할 내용의 타입을 정해줘야 한다. (text/html 형식)

인코딩도 브라우저에서 한글이 표시될 수 있도록 utf-8로 설정해줘야 함.

response 객체에서 브라우저로의 출력 스트림을 얻어서 출력하게 된다.  

 

 

 

쿼리 스트링

String year = request.getParameter("year"); // "2021"
String month = request.getParameter("month"); // "10"
String day = request.getParameter("day"); // "1"

getParameter : 쿼리 스트링에서 각 name에 해당하는 value를 가져오는 메소드이다.

 

Enumeration enum = request.getParameterNames(); // name들만 가져옴
Map paramMap = request.getParameterMap(); // QueryString을 map 형태로 반환

 

 

?year=2021&year=2022&year=2023 // name이 다 같은 경우

String[] yearArr = request.getParameterValues("year");
-> 배열로 value 값들을 뽑아낼 수 있다.

 

 

 

앞에서 단순한 텍스트만 출력했지만, 사실 브라우저에서는 HTML 형식의 텍스트를 출력하도록 해야 한다.

 

 

ex)

package com.fastcampus.ch2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

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

@Controller
public class TwoDice {
	@RequestMapping("/rollDice")
	public void main(HttpServletResponse response) throws IOException {
		int idx1 = (int)(Math.random()*6)+1;
		int idx2 = (int)(Math.random()*6)+1;
		
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<style>");
		out.println(" h1 {");
		out.println("  color : blue;");
		out.println(" }");
		out.println("</style>");
		out.println("</head>");
		out.println("<body>");
		out.println("<img src='resources/img/dice"+idx1+".jpg'>");
		out.println("<img src='resources/img/dice"+idx2+".jpg'>");
		out.println("<br> <h1>연습중</h1>");
		out.println("</body>");
		out.println("</html>");
	}
}

resources의 img 폴더에 dice1.jpg부터 dice6.jpg의 이미지 파일이 존재한다.

그러므로 랜덤 주사위 2개의 이미지를 임의로 브라우저에 나타낼 수 있도록 코드를 작성하고

HTML 형식으로 출력을 해보았다.

 

 

 

- 위의 실습들에 대한 개념적인 내용

 

1. 클라이언트와 서버

클라이언트(client) : 서비스를 요청하는 애플리케이션

서버(server) : 서비스를 제공하는 애플리케이션

 

클라이언트->요청->서버

서버에서 프로그램 실행->응답->화면

 

2. 서버의 종류

서버의 종류에는 email서버, file서버, web서버 등등이 있음

 

3. 서버의 포트

서버에는 포트가 연결되어 있다. 포트로 서버를 구분할 수 있다.

서버는 포트와 미리 binding 되어있는 상태로 기다리고 있음(listening 하고 있음)

포트번호는 0~1023까지 예약이 되어 있고 이를 제외하면 65535번까지 사용 가능.

 

4. 웹 애플리케이션 서버(WAS)?

웹 애플리케이션 서버(WAS) : 웹 애플리케이션을 서비스하는 서버(Tomcat 같은)

 

클라이언트가 원격 프로그램을 호출하면 WAS에서 프로그램을 실행하고 그 결과를 전송함

 

5. Tomcat의 내부구조

 

Server(Tomcat) 안에 Service가 있고 Service를 처리하는 역할을 하는 것이 Engine.

Engine 안에는 여러개의 Host가 있을 수 있고 Host 안에는 Context(스프링 프로젝트)가 여러개 있을 수 있다.

그 안에 있는 프로그램들이 Servlet.

 

Thread -> Connector -> Engine -> Host -> Context -> Servlet

 

Servlet이 Controller를 호출하고(@Controller 애너테이션을 붙인 클래스), 거기에 있는 메소드를 호출하여 실행한다.

 

6. Tomcat의 설정 파일 server.xml, web,xml

 

톰캣설치경로/conf/server.xml : Tomcat 서버 설정 파일

톰캣설치경로/conf/web.xml : Tomcat의 모든 web app의 공통 설정

웹앱이름/WEB-INF/web.xml : web app의 개별 설정

 

 


출처 : 스프링의 정석 : 남궁성과 끝까지 간다

+ Recent posts