년월일을 입력하면 요일을 출력하는 예제

public class YoilTeller { //년월일을 입력하면 해당 날짜의 요일이 출력됨
    public static void main(String[] args) {
        //입력
        String year = args[0];
        String month = args[1];
        String day = args[2];

        // int로 변환
        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 datOfWeek = cal.get(Calendar.DAY_OF_WEEK);//요일이 숫자로 나온다 1:일요일, 2:월요일
        char yoil = " 일월화수목금토".charAt(datOfWeek);//숫자를 문자로 바꿔줌 1이면 '일'

        System.out.println(year +"년 " + month + "월 " + day +"일은 ");
        System.out.println(yoil + "요일입니다. ");
    }
}

실행하려면

  1. 일단 YoilTeller 한 번 실행하기
  2. target 폴더 밑에 YoilTeller 생겼는지 확인
  3. target 우클릭, open in - terminal
  4. 루트를 classes로 변경
    C:\Study\Spring\target> cd classes
  5. C:\Study\Spring\target\classes> java controller.YoilTeller 2023 1 7 입력
  6. 실행결과
    2023년 1월 7일은
    토요일입니다.

실행되는 원리

  • C:\Study\Spring\target\classes> java controller.YoilTeller 2023 1 7 에서 java인터프리터가 YoilTeller 클래스의 메인을 호출하는데 뒤에 있는 값들을 가지고 문자열 배열을 만든다
    |"2023"|"1"|"7"|
    args[0] args[1] args[2]
    문자열 배열을 메인 메서드로 넘겨주어 메인 메서드에서 사용할 수 있다

원격 프로그램에서는

  • Url을 입력해서 프로그램을 요청하면
  • 톰캣이 HttpServletRequest 객체를 만들어서 요청 정보를 담는다
  • 그 객체를 프로그램의 메인 메서드의 매개변수로 넘겨준다
    public void main(HttpServletRequest request){

HttpServletRequest 메서드


메서드들로 불러온 값으로 이루어져 있다

  • 메서드들이 하는 역할
@Controller
public class RequestInfo {
    @RequestMapping("/requestInfo")
    //    public static void main(String[] args) {
    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()); // 원격 포트
    }
}

[실행결과] http://localhost:8080/ch2/requestInfo?year=2021&month=10&day=1 
request.getCharacterEncoding()=UTF-8
request.getContentLength()=-1
request.getContentType()=null
request.getMethod()=GET
request.getProtocol()=HTTP/1.1
request.getScheme()=http
request.getServerName()=localhost
request.getServerPort()=8080
request.getRequestURI()=http://localhost:8080/ch2/requestInfo
request.getRequestURI()=/ch2/requestInfo
request.getContextPath()=/ch2
request.getServletPath()=/requestInfo
request.getQueryString()=year=2021&month=10&day=1
request.getLocalName()=localhost
request.getLocalPort()=8080
request.getRemoteAddr()=0:0:0:0:0:0:0:1   <--- AWS에 배포(deploy)한 다음에 실행하면, 실제 ip주소를 확인할 수 있음.
request.getRemoteHost()=0:0:0:0:0:0:0:1   <--- AWS에 배포(deploy)한 다음에 실행하면, 실제 ip주소를 확인할 수 있음.
request.getRemotePort()=54855

로컬 프로그램을 원결 프로그램으로 바꾸기

@Controller
public class YoilTeller { //년월일을 입력하면 해당 날짜의 요일이 출력됨
//    public static void main(String[] args) {
    @RequestMapping("/getYoil")
    public void main(HttpServletRequest request) {

브라우저로 결과 출력하기

//        System.out.println(year +"년 " + month + "월 " + day +"일은 ");
//        System.out.println(yoil + "요일입니다. ");
        
        response.setContentType("text/html"); //타입을 지정해줘야한다
        response.setCharacterEncoding("utf-8"); // 한글로 인코딩
        PrintWriter out = response.getWriter(); //response 객체에서 브라우져로의 출력 스트림을 얻는다
        out.println(year +"년 " + month + "월 " + day +"일은 ");
        out.println(yoil + "요일입니다. ");

HTTP 요청과 응답

프로토콜이란?

  • 서로 간의 통신을 위한 약속
  • 주고받을 데이터에 대한 형식을 정의한 것

HTTP - Hyper Text Transfer Protocol

  • 텍스트 기반의 프로토콜
  • 요청과 응답이 HTTP의 형식으로 되어있다
  • 단순하고 읽기 쉽다
  • 상태를 유지하지 않는다 - 클라이언트 정보를 저장하지 않는다
    쿠키와 세션을 이용
  • 확장 가능하다 - 커스텀 헤더 추가 가능
  1. url을 입력하면 브라우저가 HTTP 요청 메세지를 자동으로 만들어준다
  2. 요청 메세지가 서버에 도착하면 요청을 받아서 응답 메세지를 HTTP로 전달한다

응답 메세지

  • 상태 라인: 요청이 어떻게 처리되었는지 알려주는 곳
    프로토콜 상태코드 상태코드설명(ok)
    상태코드가 200번대면 성공
  • 헤더
  • 바디

요청 메세지

  • GET 방식은 요청 내용을 요청 라인에 기재
  • POST 방식은 요청 내용을 바디에 기재

텍스트 파일과 바이너리 파일

바이너리 파일 : 문자와 숫자가 저장되어 있는 파일

텍스트 파일 : 문자만 저장되어 있는 파일, 숫자를 쓰려면 문자로 변환해야한다

  • 문자 1, 2 처럼 숫자 12는 문자 1과 2로 변환된다
  • 숫자 12는 원래 4바이트인데 2바이트로 줄어들었고, float 12.625는 원래 4바이트인데 6바이트로 늘어났다
  • 유리할 때가 있고 불리할 때가 잇다

텍스트 파일의 장점: 사람이 읽기 쉽다

MIME(Multipurpose Internet Mail Extensions)

  • 텍스트 기반 프로토콜에 바이너리 데이터를 전송하기 위해 고안된 방법
  • 이미지나 동영상은 바이너리 파일인데 HTTP로 브라우저에서 볼 수 있다
  • HTTP Content-Type 헤더에 사용하는데 전송할 데이터의 타입을 명시해주는 방법이다

Base64

  • 바이너리 데이터를 텍스트 데이터로 변환할 때 사용
    • 2진법: 0, 1
    • 10진법 : 0 ~ 9
    • 16진법 : 0 ~ 9, ABCDEF
    • 64진법 : 0 ~ 9, A ~ Z, a ~ z, +, /
      = 6비트 2의 6승
    • 아스키 코드는 128개, 특수문자 포함
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글