[패스트캠퍼스] 자바&스프링 강의 6주차

YunGyu Choi·2023년 7월 8일
0

FastCampus JavaSpring

목록 보기
6/8

웹 개발 역량강화를 위해 내일배움카드로 수강할 수 있는 백엔드 교육과정을 찾아보았다. 남궁성&박매일 님의 '나도 할 수 있는 Java & Spring 웹 개발 종합반'이 교육일정이나 커리큘럼이 무난한 것 같아서 수강하게 되었다. 8주 총 65시간의 과정을 포스팅하고자 한다.

커리큘럼

주차학습 내용
1주차생각,표현,코딩하기란?
2주차Java 기초 다지기1
3주차Java 기초 다지기2
4주차객체지향 프로그래밍 시작하기
추가1객체지향 프로그래밍 설계하기
5주차Spring 시작하기
6주차Spring MVC part1
7주차Spring MVC part2
8주차Spring MVC part3
추가2Spring DI 와 AOP
파이널 프로젝트

로컬 프로그램 실행

(1) Java.exe 인터프린터가 main() 메소드 실행
(2) main() 메소드는 static 이라서 객체 없이 바로 호출 가능

원격 프로그램 실행

아무 프로그램이나 실행시키면 안되기 때문에 인련의 사전 작업이 필요
(1) 프로그램 등록 (@Controller 클래스 앞에 명시)
(2) URL과 프로그램을 연결 (@RequestMapping 호출하려는 메서드 앞에 쓰고 URL을 입력)

@Controller		// 1. 프로그램 등록
public class Hello {

    @RequestMapping("/hello")	// 2. URL과 main()을 연결
    public void main() {
    	System.out.println("Hello");
    }
}

(3) URL 구성은 'https://원격컴퓨터IP:포트번호/Context root/메서드경로'이다. 컨텍스트 루트는 프로젝트 루트라고 이해하면 쉽다.
(4) 브라우저에서 URL로 원격 컴퓨터 ip주소, 포트번호, 경로로 호출
(5) 톰캣이 그것을 받아서 실행

  • URL과 연결하는 메서드를 인스턴스 메서드로 선언하는 이유
    -> static은 인스턴스 멤버를 할 수 없음, URL로 원격 프로그램 호출시 톰캣이 객체를 생성해서 인스턴스 호출 가능

  • URL과 연결한 메서드가 private임에도 호출이 가능한 이유
    -> RequestMapping은 외부에서 스프링 프레임워크가 자바의 Refelction API를 이용해서 객체를 생성해 메소드를 호출하기 때문에 가능 (이 어노테이션을 붙은 것은 접근 제어자 상관없이 호출가능)

*Reflection API란? 클래스 정보를 얻고 다룰 수 있는 강력한 기능을 제공, java.lang.reflect패키지 제공
(1) 클래스 객체(클래스에 대한 정보 담긴 객체)를 얻어오기
(2) 가져온 클래스 정보로 객체 생성(설계도가 있으니 뭐든 할 수 있음)
(3) 밖에서 해당 클래스 접근 가능
(스프링 프레임워크가 이 방식을 사용)

프로젝트 생성

  • 레거시(Legacy) : 과거로 부터 물려 내려온 것들을 의미
    (m1 mac에서는 STS 레거시 프로젝트가 쉽게 생성되지 않았다. 해결방법을 찾으면 추후에 업데이트 하도록 하겠다.)

AWS 배포하기 (프로그램의 실행결과 톰캣에 출력하기)

(1) 프로젝트 war파일로 추출(압출파일 같은 것) : Build - Build artifacts
(2) AWS컴퓨터 - LocalDisk - tomcat - webapps에 .war파일 삽입
(3) tomcat - bin 폴더에서 startup하면 .war파일 압축해제하고 실행함
(4) 원격서버에 접근하기 : awsip:포트번호/경로


HTTP 요청과 응답 (프로그램의 실행결과 브라우저에 출력하기)

(1) URL입력으로 호출을 하면 톰캣이 HTTPServletRequest 객체를 만든다.
(2) 요청 정보를 HTTPServletRequest 객체에 담아서 main 메서드에 넘겨준다.

(3) main() 메소드 안에 HttpServletRequest request를 넣으면 알아서 매개변수가 들어간다.
(4) URL에서 ?뒤에 붙는 정보는 QueryString이라고 한다. (key&value 구조의 Json 형식)
(5) 쿼리스트링은 request.getParameter()라는 메소드로 정보를 얻는다

request.getQueryString()
String str = request.getParameter("keyName");
String[] strArr = request.getParameterValues("keyName"); // 같은 키값이 여러개일 때
Iterater iter = request.getParameterNames();
Map paraMap = request.getParameterMap();

서버의 포트

하나의 서버에 e-mail server, file server, web server 등 여러 서버가 있는 경우,
클라이언트가 IP주소 만으로 원하는 서버에 접근할 수 없다.
이때 포트번호를 적어주면 원하는 서버로 접속이 가능하다.
포트번호는 0~1023까지는 예약되어 있다. 최대 65535까지 지정가능
(웹서버는 디폴트가 80이다, 80은 생략가능)


WAS(Web Application Server)

WAS는 웹 애플리케이션을 서비스하는 서버
-> 서버에 애플리케이션(프로그램)을 설치해두고 웹으로 애플리케이션을 제공하는 것


Tomcat의 내부 구조

(1) 브라우저가 URL을 통해 요청을 하고 port로 들어오면 Threadful이 기다리고 있다.
(2) Tomcat > Service > Connector > Protocol(HTTP, AJP 등)
(3) 요청이 들어온 Protocol에 따라서 처리할 Connector가 달라진다.
(4) Connector는 Engine(Catalina)에 보낸다. Engine안에는 n개의 Host가 있다.
(5) Host(www...co.kr) 안에는 또 여러개의 Context(WebApp, STS프로젝트)가 있다.
(6) Context안에는 또 서블릿(작은 서버 프로그램=컨트롤러)이 있다.
(7) 서블릿 실행 결과가 클라이언트에게 전달된다.

  • protocol://host/context/sevlet 이런 느낌

톰캣 설정파일 - server.xml, web.xml

  • 톰캣설치경로/conf/server.xml : Tomcat 서버 설정 파일
  • 톰캣설치경로/conf/web.xml : Tomcat의 모든 web app의 공통 설정
  • 웹앱이름/WEB-INF/web.xml : web app의 개별 설정
    intelliJ에서는 프로젝트/src/main/webapp/WEB-INF/web.xml

원격 프로그램

(1) 서블릿 등록 -> @Contoller로 바뀜
(2) URL 연결 -> @RequestMapping으로 바뀜

  • 점점 web.xml에서 어노테이션 방식으로 바뀌고 있음

HTTP

Protocol

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

HTTP(HyperTextTransferProtocol)

  • 단순하고 읽기 쉬운 텍스트 기반의 프로토콜
  • 상태를 유지하지 않는다(stateless), 클라이언트 정보를 저장하지 않는다.
  • 그래서 클라이언트를 구분하지 못하는데 그것을 보안하기 위해 사용하는 것이 쿠키와 세션이다.
  • 확장 가능하다(커스텀 헤더 추가 가능, HTTP는 헤더와 바디로 구성)

응답코드

  • 100번대 : 서버와 클라이언트 간의 정보교환이 목적(http1.1때 추가)
  • 200번대 : 성공
  • 300번대 : 다른 URL로 요청해라
  • 400번대 : 클라이언트 에러
  • 500번대 : 서버 에러

요청방식

  • Get : 서버에서 리소스를 받아와서 읽기 위함, Body가 없음
    (정보 보내고 싶으면 쿼리스트링으로 소용량 보낼 수 있긴함)
  • Post : Body에 내용을 담아 서버에 보내기 위함

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

  • 바이너리 파일 : 문자와 숫자가 저장되어 있는 파일 (메모장으로 안읽어지는 파일)
    쓸때 문자는 문자로 숫자는 숫자로 저장한다.
    사람이 읽기 어렵다.

  • 텍스트 파일 : 문자만 저장되어 있는 파일 (메모장으로 읽어지면 텍스트 파일)
    텍스트 파일은 문자는 문자로 숫자는 문자로 바꿔서 저장한다.
    (1 -> '1' 로 바꾼다는 느낌인듯)
    사람이 읽기 쉽다.

MIME(Multipurpose Internet Mail Extensions)

  • 텍스트 기반 프로토콜에 바이너리 데이터 전송하기 위해 고안
  • HTTP의 Content-Type헤더에 사용, 데이터의 타입을 명시
  • 데이터 타입 : text, image, audio, video, application 등

Base64

  • 64진법(0~9, A~Z, a~z, +, /) 모두 64개(6 bit)의 문자로 구성
  • 6비트씩 잘라서 그것을 변환하는 것이다. 남는 빈자리는 =로 채운다(padding)
  • 바이너리 데이터를 텍스트 데이터로 변환할 때 사용한다.
  • ASCII는 7이다. 특수문자를 포함하기 때문, 그래서 안전하지 않다.
  • 그러나 앞의 6비트는 공통이라서 서로 OS가 달라도 문제 발생하지 않는다.
  • 단점은 6비트를 압축해서 문자 1개로 바꾸는 과정에서 2비트가 늘어나서 8비트가 된다. 결국 사이즈가 33% 증가한다.

느낀점

Flask로 간단간단한 테스트용 서버를 만들고 작업할 때는 몰랐던 깊이있는
내용들을 알 수 있어서 좋았다. Spring을 한다는 것은 그냥 하나의 웹 프레임워크를 익히는 것이 아니라 웹과 관련된 기술 전반적인 내용을 공부하는 것이라는 생각이 들었다. 지금 돌이켜보면 당연한 것인데 너무 쉽게만 생각한 것 같아 반성해야겠다.

profile
velog에는 이론을 주로 정리하고, 코드와 관련된 것은 Git-hub로 관리하고 있어요. 포트폴리오는 링크된 Yun Lab 홈페이지를 참고해주시면 감사하겠습니다!

0개의 댓글