본격적으로 스프링훈련 숙련주차가 시작됐다.
스프링훈련과 함께 그동안 익숙지 않아 제대로 작성하지 못했던 TIL도 다시금 시작해보려고 한다.
일이 있거나 깜빡하거나 등 각종 이슈로 당일날 못 적고 이후에 적을 때는, TIL이라고 쓰기엔 양심에 조금 찔리니
뭉뚱그려서 YIL(YesterdayILearned)라 쓰기로 했다.
그간 못쓴 TIL도 있으니, 최근 새로 얻은 지식들을 종합해서 쓴다.
비전공자인 나로서는 자바도 새로 익히는 것이 어려웠으나, Java가 조금은 눈에 익을 때쯤, 이번에는 Spring이라는 도전과제가 업그레이드 되었다. 다행히 기초적인 부분부터 다시 한 번 짚어주는 느낌이었다.
그동안 인텔리J를 쓰면서도 특별한 생각없이 썼던 터미널부터 그 개념을 짚어보았다.
터미널
-
사람은 프론트엔드(인터페이스)인 마우스로 컴퓨터에 명령을 내리지만, 컴퓨터가 익숙한'명령어'를 쓸 수 있는 창이다.
-
다만 홈브루는 처음 봤는데, 맥 유저를 위한 편의기능인 듯하다.
집에서 Spring훈련 중이라 지금은 데스크탑을 쓰지만, 감사하게도 맥 에어가 있긴 해서 집 외에 코딩을 하거나 작업을 할 때 유용한 툴일 듯 하다.
홈브루(Homebrew)
- 맥의 편리함 중 하나. '다운로드 패키지'를 관리할 수 있는 툴이다. 'brew install 프로그램이름'을 입력하면, 프로그램을 자동으로 다운로드 받아 설치해줌.
깃 설정도 설명이 돼있었으나, 다행히 그간 개인프로젝트와 팀프로젝트로 이미 많이 해와서 기초적인 부분은 어느 정도 숙지가 돼있어서 넘어가기로 한다.
서버란 무엇인가
네트워크
- 네트워크는 여러대의 컴퓨터 또는 장비가 서로 연결되어서 정보를 주고 받을 수 있게 도와주는 기술.
- 컴퓨터, 라우터, 스위치, 허브 등의 장비들이 각각의 역할을 수행하여 정보를 주고 받는다.
- 서로 정보를 주고 받기 위해서는 IP 주소, 서브넷 마스크, 게이트웨이 등의 정보를 설정하고 네트워크 프로토콜을 이용
하여 통신을 하게 된다.
- 사용자의 요청에서 시작하여 우리가 만든 서버에 도착하고 다시 사용자에게 까지 되돌아가는 흐름을 잘 파악하고 있어야 서버 개발이 용이하다.
- Client 즉, 브라우저에서 서버에 정보를 요청하는 과정을 간략하게 표현했다.
- 사용자는 브라우저를 이용하여 서버에 정보를 요청 후 응답을 받는다.
- 이때 사용자의 요청이 서버에 도달하기 위해서는 해당 서버의 정보가 필요. 그 요청이 해당 서버에 정확하게 도달할 수 있게 제공되는 정보가 IP 주소!
- 거대한 네트워크망에서 여러분의 컴퓨터를 식별하기 위한 위치 주소 입니다.
- 네트워크상에서의 데이터 송/수신은 이 주소를 기준으로 이루어지고 있습니다.
- 위와 같이 우리가 택배를 받기 위해서는 택배를 받을 실제 주소와 받는 사람을 알려줘야 한다.
- 네트워크에서도 정보를 요청 받고 전달하려면 주소에 해당하는 IP와 받는 사람에 해당하는 포트번호를 알려줘야 한다.
그동안 컴퓨터 및 인터넷을 오래 사용하기도 했고 게임, 웹서핑 등으로 IP 주소에 대해서는 굉장히 익숙했는데, 네트워크의 개념으로 의미를 엄밀히 살펴 보니 확실히 개념을 정립할 수 있었다.
웹 서버
- 인터넷을 통해 HTTP를 이용하여 웹상의 클라이언트의 요청을 응답해주는 통신을 하는 일종의 컴퓨터.
- 이메일이나 SNS 등 대부분의 서비스는 웹 서버를 통해 사용 가능.
- 웹 서버의 기본 동작 원리는 다음과 같다.
- 브라우저를 통해 HTTP Request로 웹사이트를 웹서버에 요청.
- 이후 웹서버는 요청을 승인하고 HTTP Response를 통해 웹사이트 데이터를 브라우저에 전송.
- 마지막으로 브라우저는 서버에서 받아온 데이터를 이용해 웹사이트를 브라우저에 그려냄.
- 기본적으로 브라우저가 웹서버에 요청을 할때는 항상 GET method로 요청하게 됩니다.
GET method는 그간 코딩을 통해 꽤나 익숙해진 방식이다. 웹 서버 설명에서 보니 왠지 반가웠다. 핵심적인 기능을 이미 알고 있는 거 같아 왠지 더 자신감이 생긴다.
API
- API : Application Programming Interface
- 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의함.
- 개발자는 '다른 애플리케이션'이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거
나 생성함.
- 인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점
이나 경계면을 의미함.
즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미합니다.
코딩하는 동안 굉장히 자주 보았던 API에 대해 드디어 본격적으로 배우게 되었다. 그 전에는 전공자 및 이미 협업이나 코딩에 익숙한 팀원들의 도움을 받아 API 관련 코딩을 구현했다면, 이번에는 그 역량을 스스로 갖출 기회가 온 것이다.
✔ 쉽게 표현해보자면 API는 하나의 '약속'이라고 한다.
✔ 서로 다른 애플리케이션이, 약속한 방식의 API 요청을 수행하면 정해진 결과물을 반환.
✔ 주문을 받으면 해당 주문의 음식을 가져다 주는 식당의 점원이라 보면 된다.
RESTful API
- Representational State Transfer(REST)는 'API 작동 방식에 대한 조건을 부과하는' 소프트웨어 아키
텍처.
- REST는 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어짐.
- REST 아키텍처 스타일을 따르는 API를 REST API라고 한다.
- REST 아키텍처를 구현하는 웹 서비스를 RESTful 웹 서비스라고 한다.
API면 API지, RESTful은 또 뭐란 말인가? 잠시 쉬어갈 수 있게 만든 인터페이스인가? 싶었는데 REST가 대문자인 이유가 있었다.
Representational State Transfer의 약자였던 것.
- 위와 같은 구성요소에 따라 API의 리소스 식별자를 중복 없이 고유하게 잘 만들고, 해당 API에 적절하게 HTTP 메서드를 사용했다면, RESTful하게 설계했다고 볼 수 있다.
Apache Tomcat
Web Server 와 Web Application Server(WAS)
- 브라우저에서 URL을 입력하여 어떠한 페이지를 요청했을 때 HTTP의 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를
사용자에게 전달해주는 역할을 하는 것이 Web Server.
웹 서버의 역할 2가지
- 정적인 콘텐츠 즉, 이미 완성이 되어있는 HTML과 같은 문서를 브라우저로 전달.
- 브라우저로부터 ‘로그인하여 MyPage를 요청’과 같은 동적인 요청이 들어왔을 때, 웹 서버 자체적으로 처리하기 어렵기
때문에 해당 요청을 WAS에 전달.
- 종류로는 Apache, Nginx 등이 있음.
- WAS는 웹 서버와 똑같이 HTTP 기반으로 동작.
- 웹 서버에서 할 수 있는 기능 대부분을 WAS에서도 처리 가능.
- WAS를 사용하면 로그인,회원가입을 처리하거나 게시물을 조회하거나 정렬하는 등의 다양한 로직들을 수행하는 프로그램을
동작시킬 수 있다.
- 종류로는 Tomcat, JBoss 등이 있음.
Apache Tomcat이란?
- Tomcat은 동적인 처리를 할 수 있는 웹 서버를 만들기 위한 웹 컨테이너.
- Apache Tomcat이란 Apache와 Tomcat이 합쳐진 형태로 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로 해줄 수
있다.
본격적으로 웹서버에 대해 배우게 됐다. 그동안 인터넷을 하며 이미 친숙한 단어이긴 하지만, 어떠한 원리와 방식으로 구동되는지에 대해 더 구체적으로 알 수 있었다.
SpringBoot와 Spring
- Spring 프레임워크는 2004년에 1.0이 등장한 이후 20년가까이 사랑받으며 계속해서 업그레이드 해온 현재는 Spring 6.0이
등장한 아주 오래되고 강력한 프레임워크.
- Spring 프레임워크는 AOP, IoC/DI 등과 같은 아주 강력한 핵심 기능들을 가지고 있다.
- 하지만 이러한 핵심 기능들을 사용하기 위해서는 너무나도 많은 xml 설정들이 필요했다.
- 이러한 불편한 점들을 개선하기 위해 2014년 SpringBoot가 등장.
- SpringBoot는 기존의 xml 설정 대신 Java의 애너테이션 기반의 설정을 적극적으로 사용하고 있기 때문에 무겁고 작성하기
힘들던 xml 대신에 애너테이션을 사용하여 아주 간편하게 설정할 수 있다.
- 기본적으로 개발에 필요한 설정 정보들을 일반적으로 많이 사용하는 설정 값을 default로 하여 자동으로 설정해주고 있다.
- 외부 라이브러리나 하위 프레임워크들의 의존성 관리가 매우 쉬워졌다.
- 기존에는 외부 라이브러리와 프레임워크를 사용하기 위해서 각각의 버전들의 호환성을 직접 확인해가면서 의존성들을 설정함.
- 반면 SpringBoot에서는 spring-boot-starter-web 처럼 필요한 외부 라이브러리들과 프레임워크들을 의존성에 맞게
starter로 묶어서 제공.
- 이전처럼 각각의 버전 호환성을 직접 확인할 필요가 없어짐.
- 마지막으로 SpringBoot의 강력한 점 중 하나가 바로 내장 Apache Tomcat.
- Spring 프레임워크에서는 서버를 실행시키기 위해 Apache Tomcat을 직접 다운로드 받고 설정하고 프로젝트에 삽입 했어야
했다.
- 이러한 불편함을 해결하기 위해 SpringBoot에서는 기본적으로 starter-web dependency를 설정하면 자동으로 내장형
Apache Tomcat을 제공해 줌.
- 말 그대로 Apache Tomcat이 내장되어 있기 때문에 개발자가 따로 다운로드 받고 설정하고 삽입할 필요없이 바로 사용가능.
드디어 스프링의 개념에 대해 배우게 되었다. 실질적으로 '스프링'이라 함은, 그냥 스프링이 아니라 개선된 버전인 스프링부트를 일컫는다는 것 또한 알게 됐다.
그동안 자바훈련이 기초라고 했던 것이 이해가 된다. 이제 제대로 스프링을 배워볼 시간이 온 것 같다.