Spring MVC (1)

ikyeong·2023년 5월 12일
1

Spring-Study

목록 보기
2/9

01.원격 프로그램 실행

로컬 프로그램 실행 과정

java 인터프리터가 클래스에 있는 main() 메서드를 호출

원격 프로그램 실행 과정

접속할 컴퓨터의 IP주소를 브라우저에 입력해 원격 프로그램 실행


📌서버에 있는 프로그램을 실행하기 위한 작업

  1. 프로그램 등록
  2. URL과 프로그램을 연결
@Controller // 1. 프로그램 등록
public class Hello {
	
    @RequestMapping("/hello") // 2. URL과 프로그램 (main())을 연결
    public void main(){
    	System.out.println("Hello");
    }
}

❔ 매핑할 메서드를 인스턴스 메서드로 작성하는 이유?

static 메서드로 생성해도 상관없지만 static 메서드는 인스턴스 변수를 사용할 수 없어 인스턴스 메서드를 사용하는게 보편적이다.

❔ 매핑된 메서드의 접근제어자가 private인 경우는?

URL과 연결만 되어있다면 접근제어자와 상관없이 웹에서 호출가능 (Spring에서 Reflect API를 사용해 객체를 만들기 때문!)


📌원격 프로그램 AWS 배포

1. STS의 프로젝트명을 우클릭해 EXPORT 클릭
2. WAR 파일 선택 후 Finish
3. AWS의 가상 컴퓨터의 Tomcat\webapps 안에 WAR파일을 붙여넣고 톰캣 실행

02.HTTP Request/Response

📌Http 요청과 응답

HTTP(Hyper Text Transfer Protocol)?

  • 텍스트 기반의 프로토콜
  • 클라이언트의 정보를 저장하지 않음 (stateless)
    -> 이를 보완하기 위해 쿠키, 세션 사용 !
  • 커스텀 헤더를 추가해 확장 가능

Http 응답 메세지

상태 라인 : 요청이 어떻게 처리되었는지 알려준다
	[응답코드]
	2xx - Success
    3xx - Redirect(다른 URL로 요청하라는 의미)
    4xx - Client Error
    5xx - Server Error
헤더 : 부가적 정보 전달
바디 : 응답내용
***헤더의 길이는 가변적이라서 헤더와 바디는 한 줄의 띄워 구분한다

Http 요청 메세지

요청 메서드
GETPOST
리소스를 얻을 때 사용리소스를 전달할 때 사용
쿼리스트링을 통해 데이터 전달(소용량)body를 통해 데이터 전달(대용량)
데이터 공유에 유리보안에 유리
보안에 취약데이터 공유에 불리
검색엔진에서 검색단어 전송게시판에 글쓰기, 로그인...

📌HttpServletRequest를 이용해 value 전달하기

원격 프로그램을 브라우저로 호출하면 Tomcat이 HttpServletRequest 객체를 생성하고 요청 정보를 객체에 담아 매핑된 메서드에 넘겨줌
-> 이때 객체에 정보를 전달하기 위해 QueryString 이용!!

HttpServletRequest 메서드

YoilTeller.java

@Controller
public class YoilTeller {
	@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);
		char yoil = " 일월화수목금토".charAt(1);
		
		//3.출력
		System.out.println(year+"년"+month+"월"+day+"일은 ");
		System.out.println(yoil + "요일입니다.");
        
        //localhost:8080/ch2/getYoil?year=2023&month=5&day=12 로 이동
        [실행결과]
        2023512일은 
		일요일입니다.
        
	}
}

💡 여기서 Query없이 localhost:8080/ch2/getYoil 로 접속하거나 읽고자 하는 Parameter가 존재하지 않는 경우 에러 발생


📌HttpServletResponse를 이용해 브라우저에 출력

YoilTeller.java

@Controller
public class YoilTeller {
	@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);
		char yoil = " 일월화수목금토".charAt(1);
		
		//3.출력
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
        //response 객체에서 브라우저로의 출력 스트림 얻기
		PrintWriter out = response.getWriter();
		
		out.println(year+"년"+month+"월"+day+"일은 ");
		out.println(yoil + "요일입니다. ");
        
        //http://localhost:8080/ch2/getYoil?year=2023&month=5&day=12 접속
        [실행결과]
        2023512일은 일요일입니다.
        
	}
}

💡 setContentType, setCharacterEncoding 메서드로 타입을 지정, 인코딩 방법을 알려줘야 브라우저에서 제대로 출력됨

👀HttpServletResponse 이용해 이미지 파일 화면에 띄우기

1. 프로젝트의 src/main/webapp/resources 안에 이미지 파일 넣기
2. html의 img 태그를 이용해 <img src='resources/[파일 경로]'>를 
   response의 outputstream으로 출력

03.클라이언트와 서버

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

📌서버

Email server : 이메일 서비스를 제공하는 서버 
File server : 파일을 제공하는 서버
Web server : 웹과 관련된 모든 서비스를 제공하는 서버

Port번호

  • 하나의 PC에서 여러 서버를 제공할 때 어떤 서버에 대한 요청인지 어떻게 구분
  • IP주소:포트번호 형식으로 클라이언트가 요청
  • 0~1023까지의 포트번호는 예약되어있고 ~65535까지의 포트는 마음대로 사용가능

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

서버에 프로그램을 설치하고 클라이언트가 프로그램을 사용가능하도록 서비스하는 서버 (ex. Tomcat)

💡 프로그램을 업데이트할 때 수월 (클라이언트의 프로그램을 각각 업데이트 vs 서버의 프로그램만 업데이트)


04.텍스트 파일 vs 바이너리 파일

파일 종류저장하는 데이터쓰기읽기
바이너리문자, 숫자문자->문자, 숫자->숫자문자->문자, 숫자->숫자
텍스트문자문자->문자, 숫자->문자문자->문자, 문자->숫자

📌 MIMF(Multipurpose Internet Mail Extensions)

  • 텍스트 기반의 프로토콜(Http)에 바이너리 데이터를 전송하기 위해 고안됨
  • Http의 Content-Type 헤더에 사용해 데이터 타입을 명시

📌 Base64(64진법)

  • 바이너리 데이터를 텍스트 데이터로 변환할 때 사용
  • 7bit인 아스키코드에서 특수문자를 제외하고 6bit만 사용해 '0'~'9','A'~'Z','a'~'z','+','/'문자를 표현
  • base64 변환 사이트를 이용해 파일을 base64로 변환

📝 참고

STS 실행시 응답없음 오류

0개의 댓글