Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

HTTP 요청과 응답1 본문

Spring/Spring

HTTP 요청과 응답1

빌드이너프 2023. 5. 18. 14:19

클래스 생성(YoilTeller)

년 월 일을 입력하면 해당 날짜가 어떤 요일인지 알려주는 프로그램

 

YoilTeller 클래스

package com.fastcampus.ch2;

import java.util.Calendar;

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

	public static void main(String[] args) {
		// 1. 입력 
		String year = args[0];
		String month = args[1];
		String day = args[2];
		
		// 문자열이라서 숫자로 바꿈 
		int yyyy = Integer.parseInt(year);
		int mm = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		
		// 2. 작업 
		// 날짜 세팅 
		Calendar cal = Calendar.getInstance(); 
		cal.set(yyyy, mm - 1, dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
		char yoil = " 일월화수목금토".charAt(dayOfWeek);
		
		// 3. 출력 
		System.out.println(year + "년 " + month + "월 " + day + "일은 ");
		System.out.println(yoil + "요일입니다.");
			
	}

}

 

Console에서 실행

target -> Show in -> Terminal

 

열린 Terminal 창에

cd classes 입력: classes 폴더로 이동

 

실행

java.(패키지 이름).(클래스 이름) 매개변수 값(년 월 일)

 

java 인터프리터가 com.fastcampus.ch2.YoilTeller 클래스의 main을 호출하는데

2023 5 18과 같은 것들을 java 인터프리터가 문자열 배열에 넣는다

args[0]: 2023

args[1]: 5

args[2]: 18

이렇게 넣은 문자열을 main 메서드에 넣어주고 args[]는 만들어진 문자열 배열을 가리키게 된다(main 메서드 안에서 문자열 배열을 사용할 수 있다)

 


위 내용과 같이

브라우저 창에 url 주소로 요청을 하면 tomcat이 객체를 만들어주고 main 메서드한테 줌

필요한 것을 매개변수로 선언해주면 tomcat이 알아서 넣어준다

 

 

새로운 클래스 생성(RequestInfo)

url: reqeustInfo

package com.fastcampus.ch2;

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

import javax.servlet.http.HttpServletRequest;

@Controller
public class RequestInfo {
    @RequestMapping("/requestInfo")
    public void main(HttpServletRequest request) {
        System.out.println("request.getCharacterEncoding()="+request.getCharacterEncoding()); // 요청 내용의 인코딩
        System.out.println("request.getContentLength()="+request.getContentLength());  // 요청 내용의 길이. 알수 없을 때는 -1
        System.out.println("request.getContentType()="+request.getContentType()); // 요청 내용의 타입. 알 수 없을 때는 null

        System.out.println("request.getMethod()="+request.getMethod());      // 요청 방법
        System.out.println("request.getProtocol()="+request.getProtocol());  // 프로토콜의 종류와 버젼 HTTP/1.1
        System.out.println("request.getScheme()="+request.getScheme());      // 프로토콜

        System.out.println("request.getServerName()="+request.getServerName()); // 서버 이름 또는 ip주소
        System.out.println("request.getServerPort()="+request.getServerPort()); // 서버 포트
        System.out.println("request.getRequestURL()="+request.getRequestURL()); // 요청 URL
        System.out.println("request.getRequestURI()="+request.getRequestURI()); // 요청 URI

        System.out.println("request.getContextPath()="+request.getContextPath()); // context path
        System.out.println("request.getServletPath()="+request.getServletPath()); // servlet path
        System.out.println("request.getQueryString()="+request.getQueryString()); // 쿼리 스트링

        System.out.println("request.getLocalName()="+request.getLocalName()); // 로컬 이름
        System.out.println("request.getLocalPort()="+request.getLocalPort()); // 로컬 포트

        System.out.println("request.getRemoteAddr()="+request.getRemoteAddr()); // 원격 ip주소
        System.out.println("request.getRemoteHost()="+request.getRemoteHost()); // 원격 호스트 또는 ip주소
        System.out.println("request.getRemotePort()="+request.getRemotePort()); // 원격 포트
    }
}

 

tomcat 실행

0:0:0:0:0:0:0:1로 출력되는 것은 로컬에서 실행했기 때문

AWS에서 실행하면 제대로된 ip주소 나옴

0:0:0:0:0:0:0:1


YoilTeller를 로컬에서 원격 호출 가능하게 만들기

Main.java 클래스 이름 바꾸기 -> PrivateMethodCall.java

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 패키지를 제공
		
		// class 정보 가져오기 
		// forName("")에 class 이름을 패키지와 같이 입력
		// Hello 클래스의 Class 객체(클래스의 정보를 담고있는객체)를 얻어옴
		Class helloClass = Class.forName("com.fastcampus.ch2.Hello"); // Class 정보를 이용해 객체를 만들 수 있다 
		Hello hello  = (Hello)helloClass.newInstance(); // Class 객체가 가진 정보로 객체 생성
		Method main =  helloClass.getDeclaredMethod("main"); // "main" 이라는 메서드의 정보를 가져온 것
		main.setAccessible(true); // private인 main()을 호출가능하게 
		
		main.invoke(hello); // hello.main() 호출한 것과 같다
	}
}

 

YoilTeller 수정

static 제거

String[] args -> HttpServletRequest reuqest

프로그램 등록: @Controller 애노테이션

URL 연결: @RequestMapping 애노테이션

애노테이션 해준 것들 import 해주기(HttpServeltRequest 도 import)

URL 값: getYoil

package com.fastcampus.ch2;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;

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

// 년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTeller { // http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18
	// public static void main(String[] args) {
	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request) {
		// 1. 입력 
		String year = request.getParameter("year");
		String month = request.getParameter("month");
		String day = request.getParameter("day");
		
		// 문자열이라서 숫자로 바꿈 
		int yyyy = Integer.parseInt(year);
		int mm = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		
		// 2. 작업 
		// 날짜 세팅 
		Calendar cal = Calendar.getInstance(); 
		cal.set(yyyy, mm - 1, dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
		char yoil = " 일월화수목금토".charAt(dayOfWeek);
		
		// 3. 출력 
		System.out.println(year + "년 " + month + "월 " + day + "일은 ");
		System.out.println(yoil + "요일입니다.");
			
	}
}

 

 

tomcat 실행

URL 값: getYoil

에러 발생 이유: 뒤에 값을 안줬기 때문

 

URL 값

http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18

로컬 프로그램에서 원격 프로그램으로 바꾼 것

 

브라우저에 결과나오게 바꿈

reponse 객체를 매개변수로 적어줘야 한다(HttpServletResponse response)

 

response.getWriter: (response객체에서 브라우저로의 출력 스트림을 얻는다 )

 

출력을 System.out이 아닌 out에 해줌: (콘솔말고 브라우저에 출력해주기 때문)

 

예외처리 해주기(throws IOException)

 

출력하기 전 type 작성: 브라우저는 보내는 내용이 text인지 binary인지 모르기 때문

response.setContentType("text/html");
response.setCharacterEncoding("utf-8"); : (없으면 한글 깨짐, 보내는 text의 인코딩이 무엇인지 정확히 알려줘야 한글 안깨짐)

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 { // http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18
	// 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");
		
		// 문자열이라서 숫자로 바꿈 
		int yyyy = Integer.parseInt(year);
		int mm = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		
		// 2. 작업 
		// 날짜 세팅 
		Calendar cal = Calendar.getInstance(); 
		cal.set(yyyy, mm - 1, dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
		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 + "요일입니다.");
			
	}
}

 

이제 브라우저에서도 나옴

 

'Spring > Spring' 카테고리의 다른 글

원격 프로그램 실행  (0) 2023.05.16
Spring으로 개발하기 위해 필요한 도구들  (0) 2023.05.12