브라우저에서 URL로 호출을 하고 서버가 요청을 받고 응답을 해줍니다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
로컬 프로그램에서 원격 프로그램 실행하기
로컬 프로그램 실행
command line >java Main
java.exe 자바 인터프리터가 main() 호출
Hello라고 콘솔에 찍힘
static이면 객체를 생성할 필요가 없으므로 바로 호출 가능
원격 프로그램 실행
다른 컴퓨터에 있는 프로그램을 실행하는 방법은?
그래서 필요한 것이 브라우저, 원격 컴퓨터에는 WAS가 필요함
브라우저에서 URL을 입력하고 호출하면(IP주소) 톰캣 포트가 8080이라면
요청을 톰캣이 받아서 프로그램을 실행하게 된다
웹에서 브라우저로 서버에 있는 프로그램을 실행하려면
1. 프로그램을 등록
2. URL과 프로그램을 연결
위 두가지 작업을 먼저 해줘야한다.
@Controller가 프로그램 등록
@RequestMapping("/hello")가 URL과 main()을 연결한 것
main() 안의 메소드 실행
인스턴스 메소드는 객체 생성 후 호출
인스턴스 메소드를 객체 없이 호출할 수 있다는 것은 톰캣이 객체 생성을 해준다는 것. (중요)
그리고 메소드 호출을 한다.
그래서 인스턴스 메소드여도 된다!
왜 인스턴스 메소드로 할까?
인스턴스 변수와 static 변수 둘 다 사용 가능하기 때문에
main()메소드를 private로 바꿨을 때 가능한 이유는?
URL과 메서드가 연결 되도록 설정을 했기 때문이다.
스프링 프레임워크가 java의 reflection api를 사용해서 객체를 만들었기 때문에 가능한 것이다
Hello.java
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;
//2.URL과 메서드를 연결
@RequestMapping("/hello")
private void main() { //인스턴스 메소드 - iv, cv 둘 다 사용 가능
System.out.println("Hello");
}
public static void main2() { //static 메소드 - cv만 사용 가능
System.out.println(cv);
// System.out.println(iv); //에러
}
}
Main.java
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception{
// Hello hello = new Hello();
// hello.main(); //private라 외부 호출 불가
//Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능 제공
//java.lang.reflect 패키지를 제공
Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
//Hello 클래스의 Class 객체(클래스의 정보를 담고 있는 객체)를 얻어온다. (설계도)
Hello hello = (Hello)helloClass.newInstance(); //클래스 객체가 가진 정보로 객체 생성
Method main = helloClass.getDeclaredMethod("main"); //메소드를 참조할 때 Method를 사용
main.setAccessible(true); //private인 main()을 호출 가능하게 한다.
main.invoke(hello); //메인 메소드 참조하기, hello.main()
//결과적으로 다른 클래스에서 다른 클래스의 메소드를 참조한 것임
}
}
프로그램의 실행 결과를 브라우저에 출력하기
브라우저가 요청을 하면
톰캣이 HttpServletRequest 객체를 만들어서 그 요청을 넣고
우리는 그 객체를 사용해서 정보를 얻을 수 있다 (요청 정보에 대한 정보)
package com.fastcampus.ch2;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@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()); // 원격 포트
}
}
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 {
@RequestMapping("/getYoil")
public void main(HttpServletRequest request) {
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);
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm - 1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
char yoil = " 일월화수목금토".charAt(dayOfWeek); // 일요일:1, 월요일:2, ...
System.out.println(year + "년 " + month + "월 " + day + "일은 ");
System.out.println(yoil + "요일입니다.");
}
}
요청을 받으면
브라우저에 HTML을 동적으로 만들어서 준다
실행할 때마다 결과가 달라지는 주사위 프로그램! = 동적 리소스
이미지 파일과 같은 것은 정적 리소스
서버가 제공하는 것은
동적 리소스 : 프로그램이 실행해내는 결과, 리소스 내용이 고정되어 있지 않은 것
정적 리소스 : 파일 형태로 되어있어서 변하지 않는 것 (이미지, HTML, CSS ...)
@Controller
public class TwoDice {
@RequestMapping("/rollDice")
// public static void main(String[] args) {
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("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice"+idx1+".jpg'>");
out.println("<img src='resources/img/dice"+idx2+".jpg'>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
http://localhost:8080/ch2/rollDice
TIL
FACTS
오늘은 로컬 프로그램 실행 -> 원격 프로그램 실행 -> 프로그램 실행 결과 브라우저에 출력
(강의 2-1~ 2-3 까지 들었다)
단계를 거쳤다.
중간 중간 메모를 하지 않으면 무엇을 배우고 있는지 까먹으므로...
틈틈이 메모하는 것이 중요하다고 생각했다.
FEELINGS
아직까지 미리 배울 것들에 대한 예제를 직접 보여주려고 하시는 것 같아서
이해가 아주 조금 안되는 부분은 있지만
교육과정을 보면 찬찬히 잘 설명해주시려고 하는 것 같아서 마음이 놓인다.
FINDINGS
요청과 응답을 주는 방법!
브라우저에서 URL로 호출을 하고 서버가 요청을 받고 응답을 해준다.
그러기 위해선
1. 응답할 프로그램을 만들어 놔야하고
2. 그 프로그램을 URL과 연결시켜놔야 한다.
FUTURE
오늘 강의 4개 듣기로 했는데 3개밖에 못들었다!
내일은 꼭 스케줄러대로 들어야지!
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패캠 챌린지' 카테고리의 다른 글
패스트캠퍼스 챌린지 - 6일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.02.25 |
---|---|
패스트캠퍼스 챌린지 - 5일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.02.24 |
패스트캠퍼스 챌린지 - 4일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.02.23 |
패스트캠퍼스 챌린지 - 2일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.02.21 |
패스트캠퍼스 챌린지 - 1일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.02.20 |