post

5주차부터는 드디어 백엔드를 위한 스프링을 배웠습니다. 강의는 패스트캠퍼스의 남궁성 스프링 강좌였어요.

초반에는 STS 3(Spring Tools Suite 3)를 사용하다가 IntelliJ로 바꿔서 진행한다고 하더라고요. IntelliJ가 기능이 막강하지만! 초반에 불편한 STS3 쓰다가 IntelliJ로 넘어가면 더 소중해지겠죠?

내용 정리 시작할께요~

Spring 개발환경 세팅

  • Java: Java11
  • IDE: STS 3, IntelliJ
  • 웹 서버: Tomcat 9
  • 웹 브라우저: chrome
  • 데이터 베이스: MySQL
  • 기타: VS code, Git, AWS, Maven

Spring Boot가 아닌 Spring을 사용합니다!

자세한 개발 환경 세팅은 별개의 포스팅을 확인해주세요!

Spring 개발 환경 세팅

Spring url mapping

@Controller
public class Hello {
    @RequestMapping("/hello")
		public void main() {
				System.out.println("hello");
		}	
}

브라우저에서 url을 통해 매핑된 메서드를 호출하게 되면, Tomcat에서 인스턴스를 생성해주고 인스턴스 메서드를 실행시킨다.

private method에 url 매핑을 해놓아도 실행이 가능하다!
spring Framework는 Reflection API를 활용하여 구현되어 있어서 일어날 수 있는 현상이다.

Spring의 Reflection API

  • java.lang.reflect 패키지
  • 클래스 정보를 얻고 다룰 수 있는 강력한 기능 제공
    • 클래스의 내부 구조의 정보를 바탕으로 인스턴스를 생성
    • 내부 메서드가 private이여도 정보를 바탕으로 실행 시킬 수 있다.

Tomcat 설정 파일

  • server.xml
    • Tomcat 서버 설정 파일
      • 톰캣설치경로/conf/server.xml
  • web.xml
    • 톰캣설치경로/conf/web.xml
      • Tomcat의 모든 web app의 공통 설정
    • 웹앱이름/WEB-INF/web.xml
      • web app의 개별 설정

요즘에는 이런 xml 파일이 필수가 아니게 되어가고 있다.
대신 annotation(@RequestMapping 등)으로 대체하고 있다.

AWS 서버에서 배포

  1. 프로젝트명 우클릭 → Export → WAR file → project_name.war 으로 설정하여 Finish
    1. war(Web Application aRchive) 파일이란?
      웹 애플리케이션을 이루는 요소들을 한곳에 모아 배포하는데 사용되는 JAR 파일이다
  2. AWS 원격 서버 접속
  3. tomcat 저장 폴더 이동
  4. webapps 폴더에 war 파일 붙여넣기
    1. webapplication이 저장된 폴더!
  5. 톰캣 실행 시 자동으로 압축 해제되며 실행됨

(주의)AWS 서버 껏다 키면 ip가 바뀐다!

HTTP 요청과 응답

톰캣이 요청 정보를 바탕으로 HttpServletRequest 객체를 생성하여 실행시킨다.

또한, 응답 정보를 HttpServletResponse 를 사용하여 전달한다.

@Controller
public class YoilTeller {
    @RequestMapping("/getYoil")
    public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
        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(dayOfWeek);   // 일요일:1, 월요일:2, ... 

        response.setContentType("text/html");    // 응답의 형식을 html로 지정
        response.setCharacterEncoding("utf-8");  // 응답의 인코딩을 utf-8로 지정
        PrintWriter out = response.getWriter();  // 브라우저로의 출력 스트림(out)을 얻는다.
        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        out.println(year + "년 " + month + "월 " + day + "일은 ");
        out.println(yoil + "요일입니다.");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}
  • HTTP request 처리
    • HttpServeletRequest의 메서드

    Untitled

    메서드 결과
    request.getQueryString() year=2021&month=10&day=1
    request.getParameter(”year”) “2021” // String으로 결과 나온다.
    request.getParameterNames() 앞의 name들만 들고와 Enumeration으로 반환
    request.getParameterMap() name-value(key-value)로 연결된 Map반환
    request.getParameterValues(”year”) name 동일한것이 여러개 있을 때 사용
    String 배열에 넣어서 반환
  • HTTP response 처리
    • 형식 지정 및 스트림 생성

        response.setContentType("text/html");    // 응답의 형식을 html로 지정
        response.setCharacterEncoding("utf-8");  // 응답의 인코딩을 utf-8로 지정
        PrintWriter out = response.getWriter();  // 브라우저로의 출력 스트림(out)
      
    • 응답 내용 작성

        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        out.println(year + "년 " + month + "월 " + day + "일은 ");
        out.println(yoil + "요일입니다.");
        out.println("</body>");
        out.println("</html>");
      
    • 스트림 닫기

        out.close();
      

클라이언트와 서버

  • client: 서비스를 요청하는 애플리케이션(or 컴퓨터)
  • server: 서비스를 제공하는 애플리케이션(or 컴퓨터)
    • Email server: Email 서비스 제공(25 포트)
    • File server: File 제공(22 포트)
    • Web server: web page 제공(80 포트)

port 포트

한대의 pc에 여러개의 server가 존재할 수 있게 각 server를 구별할 수 있게 해준다.

  • 111.22.33.44:80 (콜론 뒤의 숫자가 port)
  • http 프로토콜의 default port는 80으로 80 포트의 server는 포트번호를 생략 가능하다
    • 따라서 http webserver는 80포트를 사용하여 주소만 쳐도 되게 한다.
  • port는 65535번까지 가능하다.
    • 단, 0~1023번의 port는 예약되어 있다.

WAS(Web Application Server)

웹 애플리케이션(프로그램)을 서비스하는 서버

  • 서버에 프로그램을 설치하고 클라이언트가 웹을 통해 사용할 수 있게 한다.
  • (e.g.) Tomcat

Servlet

  • server(서버) + Applet(프로그램 내부의 작은 프로그램(e.g. 플러그인)) → Servlet
  • Controller가 Servlet과 같은 개념

HTTP(Hyper Text Transfer Protocol)

protocol - 프로토콜

서로간의 통신을 위한 약속, 규약

주고 받을 데이터에 대한 형식을 정의한 것

HTTP 특징

  • 단순하고 읽기 쉽다
    • 텍스트 기반의 프로토콜
  • 상태를 유지하지 않는다.(stateless)
    • 클라이언트 정보를 저장X
    • 따라서, 서버에서 클라이언트를 구별하기 위해 쿠키와 세션을 사용한다.

HTTP 상태 코드

상태코드 의미 비고
1xx Informational HTTP/1.1에서 추가됨, 정보교환
2xx Success 성공
3xx Redirect 다른 URL 요청
4xx Client Error 클라이언트에서 잘못한 것, e.g. 404 에러
5xx Server Error 서버에서 잘못한 것

HTTP 요청 메시지 구조

GET /app/getYoil?year=2023&month=5&day=13 HTTP/1.1  // 요청 라인(request line)
Host:111.22.33.44:8080                              // 헤더 시작
User-Agent: Mozilla/5.0 (Windows NT 10.0)
Accept: text/html
Connection: keep-alive                              // 빈줄 헤더와 바디 구분줄
                                                    // 바디 시작(요청 내용)
                                                    // POST일 시 data를 담을 수 있다.

HTTP 응답 메시지 구조

HTTP/1.1 200 OK                         // 상태 라인(status line)
Content-Length:44                       // 헤더 시작
Content-Type: text/html
Date: Sat, 13, May 2023 21:04:30 GMT    // 빈줄 헤더와 바디 구분줄
<html>                                  // 바디 시작(응답 내용)
	<head></head>
	<body>
		Hello
	</body>
</html>

HTTP 메서드

  • GET
    • 서버의 리소스를 가져오는 용도
    • 전송할 데이터를 url 뒤에 붙여서 전달한다.(소용량)
    • url 에 데이터 노출되므로 보안에 취약
    • 데이터 공유에 유리
    • 검색엔진에서의 검색 단어 전송
  • POST
    • 서버에 데이터를 업로드 하기 위한 용도
    • 게시판에 글쓰기, 로그인, 회원가입
    • 데이터를 요청 메시지의 body에 담아 전송
    • 보안에 유리
      • HTTP + TLS(HTTPS)를 사용해야 암호화가 된다.

MIME(Multipurpose Internet Mail Extensions)

텍스트 기반 프로토콜에 바이너리 데이터를 전송하기 위해 고안

  • HTTP의 Content-Type헤더에 데이터의 타입을 명시
  • 텍스트 뿐만 아니라 다양한 형식의 데이터를 전송 가능해졌다.

Base64

HTTP에서 바이너리 데이터를 전달하기위해 텍스트 데이터로 encoding할 때 사용

  • 64진법
    • A-Z: 26개
    • a-z: 26개
    • 0-9: 10개
    • + 와 /
    • 26 + 26 + 10 + 2 ⇒ 64개의 문자로 표현한다.

✏️여담

스프링은 처음 써보는데 초반이라 생각보다 쉽네요! Node.js로 서버 개발하면서 HTTP 통신은 기본적으로 알고 있던 내용이라 복습하는 느낌으로 들었어요✈️

스프링 환경 세팅하면서 기본적인 구조를 알게 되서 이제 다른 스프링으로 만든 repo들 이해를 알 수 있을 거 같아요🐶 자바는 파일 구조가 복잡해보여서 뭐가 뭔지 잘몰라서 헤맸었거든요. 어서 다른 심화 내용까지 배우고 싶네요!

근데 도중에 나오던 서블릿이 뭔지 잘 모르겠어요...

메서드에 인자로 HttpServletRequest를 사용하면서 용어가 처음 등장했는데 servlet이 controller 같은 작은 서버 프로그램 단위를 부르는 명칭이라는 거 이해했어요.

그런데 강의를 듣다보니 서블릿이 단순 개념이 아니라 스프링과 다른 별개의 프로그램으로 존재하는 것 같기도 하고 헷갈리네요🙃

일단은 강의에서 추후에 다룬다고 했으니 의문만 가지고 넘어갔어요. 요즘 졸업과제 착수보고서 땜에 눈코 뜰 새 없이 바빠 시간이 없거든요💣 강의 다 듣고도 모르면 그때 가서 자세히 공부하는 걸로!!

댓글남기기