또 다른 하나는 웹 어플리케이션 서버(Web Application Server) - WAS 이다.
일단 이렇게 웹 서버(WS)와 웹 어플리케이션 서버(WAS)로 나누어서 사용하는 이유는 효율성 때문이다.
웹 서버(WS)는 정적인 컨텐츠를 처리하며, 웹 어플리케이션 서버(WAS)는 주로 동적인 컨텐츠 처리를 담당하고 있다.
그렇다면
정적인(Static) vs 동적인(Dynamic)
으로 나누어서 생각해보아야 한다.
정적인(Static)
일반적으로 이야기하는 정적(Static)의 의미는 만들어놓은 것 그대로 제공하는 것 자체를 정적이라 할 수 있다. 예를 들면, HTML 템플릿을 작성하고 홈페이지를 열어보면 이것 자체가 정적인 페이지가 되는 것이다. 정적인 웹사이트는 만들기 쉽기 때문에 처음에는 정적인 웹사이트를 만들어보며 사이트를 만든다.
( 다른 컴퓨터 혹은 클라이언트에서 접속해도 항상 같은 페이지를 보여주는 것을 정적 사이트라 한다.)
동적인(Dynamic)
동적의 의미는 상호작용을 통한 데이터 처리가 필요한 경우 동적인 페이지라 한다. 대표적으로 데이터베이스의 처리가 필요한 경우 '동적'이라는 말이 붙는다. (서버가 사용자의 '요청(Request)'에 따라 데이터를 가공처리한 뒤에 생성되어진 웹 페이지를 보여주는 것이다.)
웹 서버(Web Server)
웹 서버는 일반적으로 정적인 컨텐츠를 제공합니다.
클라이언트가 요청한 정적인 컨텐츠를 HTTP를 통해 제공해주는 서버입니다.
클라이언트로부터 들어온 요청에 대해 사용자 인증을 처리하는 역할을 한다.
요청한 파일이 없거나 문제가 발생하면 특정한 코드 값을 전달해준다. (대표적으로 404)
그렇다면 여기서 의문이 하나 듭니다. 정적인 컨텐츠를 처리해준다면, 동적인 컨텐츠는 어떻게 처리해야할지 생각해야 합니다. 여기서 웹 서버의 다른 역할이 있습니다.
동적인 요청 ( 예를 들면, 데이터베이스 쿼리문 처리 )가 들어오면 이 요청을 웹 서버에서는 처리가 불가능하므로 컨테이너(Container)에 보내주는 역할을 합니다.
※ 웹 서버는 정적 처리만 하기 때문에, 웹 서버 혼자만은 처리가 불가능하므로 동적 처리를 위해 요청을 보내는 것이다. HTML 페이지 자체에서는 서버에 저장된 데이터를 가져오거나 저장하는 것이 불가능하므로 요청을 통해 데이터를 가져오거나 저장해야 한다.
웹 서버의 종류에는 NGINX, APACHE 등이 있습니다.
그렇다면 여기서 이야기하는 컨테이너(Container)란 무엇인가?
컨테이너는 서블릿의 생명 주기를 관리하고 JSP를 서블릿으로 변환하는 기능을 지닌 프로그램이다.
(서블릿의 생명주기는 서블릿을 관리해주는 역할이라 생각하면 된다.)
컨테이너는 두 가지 종류가 있는데, 서블릿 컨테이너와 JSP 컨테이너가 있다.
(실상, 서블릿 컨테이너와 JSP 컨테이너는 같은 개념이다. JSP 자체가 PHP 처럼 스크립트 형식으로 동작하지 않고 서블릿으로 변경된 이후에 실행되기 때문이다. JSP를 서블릿으로 컴파일 해주는 것이 JSP엔진이다. 그런데 여기서 톰캣(TomCat)의 경우, 이러한 JSP엔진이 JSPServlet이다. JSP를 동작시켜주고 컴파일 하는 것이 JSPServlet이 담당하고 있으므로 어떠한 의미에서는 JSP컨테이너라고도 볼 수 있는 것이다.
서블릿 : 서블릿은 자바로 구현된 CGI를 의미한다. [자바를 사용하여 웹 페이지를 동적으로 생상하는 서버 측 프로그램을 이미한다.]
CGI : 공용 게이트웨이 인터페이스 (Common Gateway Interface) 로 웹 서버와 프로그램 간의 교환방식을 의미한다. (정적 처리를 하는 웹 서버와 컨테이너를 연결하기 위한 통신 장치이다. 쉽게 생각해서 웹서버와 컨테이너 간의 통신을 도와주는 장치이다. )
JSP(Java Server Pages) : 자바 서버 페이지는 HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 서버 사이드 스크립트 언어이다.
JSP의 기본적인 동작 구조는 클라이언트에서 서비스가 요청되면 JSP의 실행이 된다. → JSP는 웹 어플리케이션 서버의 서블릿 컨테이너에서 서블릿 원시코드로 변환 → 서블릿 원시코드가 컴파일되어서 HTML 형태로 클라이언트에게 돌려준다.
※ 개인 홈페이지에서는 HTML, CSS, JavaScript만으로도 충분한 표현이 가능합니다. 하지만 요새는 트위터, 페이스북, 개인 쇼핑몰 운영 그리고 댓글이 달리는 기능이 있는 홈페이지와 같이 기능이 추가되어져서 웹 페이지를 만듭니다. 이러한 데이터는 데이터베이스 상에 저장되는데, HTML으로는 막대한 양의 데이터를 저장과 처리가 불가능하므로 이러한 데이터를 처리를 감당하기 위해 만들어진 곳이 동적 페이지 입니다. (대표적인 언어가 CGI, ASP, PHP, JSP 등이 있다.)
웹 어플리케이션 서버(Web Application Server)
웹 서버로부터 오는 동적인 요청을 처리하는 서버를 웹 어플리케이션 서버라 한다. 일반적으로 WAS라 한다.
위키백과에서 WAS는 이렇게 정의되고 있다. 인터넷 상의 HTTP를 통해 사용자 컴퓨터나 장치에 어플리케이션을 수행주는 미들웨어(소프트웨어 엔진)으로 볼 수 있다.
* 명사와 동사가 구분이 안 간다면 단어를 다시 외우는 것이 좋다. 문장을 분석하면서 단어가 주어인지 동사인지 하나하나 검색을 통해 찾아보며 머릿속으로 정리하는 것이 좋다. 2 ~ 3일 정도 시간을 들여 고생을 한 뒤에는 익숙해져서 동사인지 명사인지 구분하기 쉬워진다. 최소한 시간을 들여서 공부하겠다는 마인드로 미리 공부를 해두는 것이 좋다.
여기서이야기하는 to-v 의 형태는 to부정사
v-ing의 형태는 동명사로 이야기한다.
이번 시간에는 to부정사와 동명사에서는 명사역할을 하는 명사적 용법에 대해 알아보고자 한다.
[이외에는 형용사적 용법과 부사적 용법으로 나누어져 있다.]
그렇다면 to부정사와 동명사의 명사역할은 3가지로 나누어서 생각해볼 수 있다.
주어와 목적어 자리에 오는 명사가 와야하므로 주어 자리에 들어갈 형태와, 목적어 자리에 들어갈 형태로써 나누면 된다. 크게 나누면 주어와 목적어 자리에 들어갈 명사로 생각하면 되고 조금 더 세분화시켜서
1. 주어에 들어갈 명사의 형태로 쓰이는 경우
2. 목적어에 들어갈 명사의 형태로 쓰이는 경우
3. 보어에 들어갈 명사의 형태로 쓰이는 경우 [주격 보어, 목적격 보어]
로 나눌 수 있다.
1. 주어자리에 쓰이는 to부정사와 동명사의 형태
To부정사
먼저, to부정사는 하나의 명사를 만들어주는 명사구 역할을 한다. 그래서 동사 앞에서 끊어서 읽어준다. 일반적으로 to부정사는 단수 취급이므로 그 뒤에 오는 문장의 동사는 단수 동사가 온다.
to부정사의 명사적 용법은 ~ 하는 것의 형태로 해석이 된다.
* 여기서 나오는 것이 가주어 it이 나온다.
(to부정사는 대부분의 문장이 가주어it을 많이 쓴다. 동명사는 잘 안쓴다)
to부정사가 주어에 들어간 명사로 사용된 예 : To play game is difficult
to부정사가 가주어 It으로 쓰인 경우 : It is difficult to play game
위의 문장을 아래의 문장으로 바꾸어 보았다.
To play game is difficult
↓
It is difficult to play game
이러한 형태로 바뀌게 된다. 일반적인 해석으로 ~하는 것으로 해석하면 된다.
그렇다면 해석은 "게임을 하는 것은 어렵다" 로 해석된다.
i.e.)
To watch Tv is exciting
↓
It is exciting to watch Tv
해석은 Tv를 보는 것은 즐겁다.
이렇게 주어로 쓰일 경우 '~하는 것은(는)'으로 해석된다.
동명사
to부정사와 비슷하게 단수 취급을 하며 '~하는 것은(는)'으로 해석된다.
i.e)
Eating Vitamin C is good for health
↓
It is good for health eating Vitamin C
비타민C를 먹는 것은 건강에 좋다.
동명사에서도 to부정사와 비슷하게 가주어 it을 사용하는데, 동명사는 자주 사용되진 않는다.
그런데 간혹 사용되는 경우도 있으므로 간략하게는 알아둬야 한다.
* to부정사와 동명사의 주어로 쓰이는 경우에 대해 살펴보았는데, 이는
동사 eat (먹는다) -> Eating vitamin C ~ 으로 쓰이면서 '먹는 것' 이라는 명사의 느낌으로 바꾼 것이다.
혹은 eat(먹는다) -> to eat (먹는 것) 으로 변환이 되어서 명사의 형태로 쓰이게 된다.
2. 목적어 자리에 쓰이는 to부정사와 동명사
목적어 자리에 쓰이는 to부정사와 동명사의 경우는 의미에 따라 차이가 존재한다.
통상적으로 to부정사는 '미래'의 의미가 담겨져 있다.
그리고 동명사는 '현재'와 '과거'의 의미가 담겨져 있다.
I want to go school : 나는 학교 가는 것을 원한다. [want to -v : v하는 것을 원한다.]
I plan to go school : 나는 학교 가는 것을 계획하다. [plan to -v : v할 것을 계획하다.]
I hope to go school : 나는 학교 가는 것을 바라다. [hope to -v : v할 바라다]
I expect to go school : 나는 학교 가는 것을 기대하다. [expect to -v : v할 것을 기대하다.]
이런 느낌으로 사용된다. 앞으로의 기대와 미래의 의미를 지니고 있다.
J.J give up studying a few years ago. : J.J는 공부하는 것을 포기했다. 몇 년 전에 [give up v-ing : v 하는 것을 포기하다.]
동명사의 경우 이런 느낌으로 현재와 과거의 의미를 가진다. 이러한 문장의 해석은 '~하는 것을', '~ 한 것을' 이라는 말로써 해석한다.
간혹 to부정사와 동명사의 차이에 따라 뜻이 미묘하게 바뀌는 것이 존재한다.
i.e.)
I forget to play next week. → 다음주에 노는 것을 잊어버리다. (미래에 할 행동)
I forget playing yesterday. → 어제 놀았던 것을 잊어버리다. (과거에 한 행동)
I tried to turn off the TV, but I couldn't it. → TV를 끄려고 노력했지만, 끄지 못했다.
( try to 부정사 : ~하려고 애쓰다. 노력하다.)
I tried eating some food, but I feel still hungry → 음식을 먹어보았지만, 여전히 배가 고팠다.
(try 동명사 : 시험 삼아 ~를 해보다.)
의 형태로 사용될 수 있다. 각각의 경우마다 문맥상의 해석이 다른 의미를 가질 수 있으므로 항상 어떤 의미인지 생각해보며 공부해야 한다.
Matlab이란? 무엇인가? 우리는 왜 Matlab을 써야하는가? 일단 Matlab이란 파이썬과 비슷하게 자연어에 가까운 고수준 언어이다. 여기서 고수준이란 수준이 높다는 것이 아닌 기계어 (이진수로 표현된 010100) 보다 우리가 흔히 사용하는 자연어에 가까운 언어를 이야기한다.
실상 Matlab자체가 기계어를 이해하고 싶어서 만든 것보다는 수학적 계산, 여러 신호 처리, 영상 처리, A.I.와 관련한 다양한 수치해석 등 다양한 형태에 대한 수치를 다루기 위해 만들어졌다. C언어 보다 더 고수준 언어이지만, 다양한 공학과 관련한 수학적 연산이 매우 빠르기에 많이 사용된다. 이전에 이야기한 Octave는 Matlab과 비슷하지만 Matlab을 따라가진 못한다. 그리고 우리의 선대가 만들어놓은 좋~은 함수가 많으므로 우리는 편하게 쓰면 된다. (물론 가져다 쓰는 것도 박사과정쯤 되면 못한다. 직접 만들어서 써야지 뭐... 굴러라 대학원생!)
요새 유명한 파이썬과도 비슷하다고 볼 수 있지만, 솔직히 공학과 관련한 연산은 Matlab이 매우 빠르기에 Matlab이 많이 사용된다. 빅데이터를 다루는 곳에서는 파이썬도 나쁘지 않은 선택이지만, 내 생각에는 다 써봐야 한다고 생각한다. 특정 범위에서는 Matlab이 이점이 있을 것이고 특정 분야에서는 파이썬이 좋을 것이다. 당연히 오픈 소스로써 파이썬은 좋은 대책이지만, 학생이라면 꼭 Matlab을 사용해보기를 추천한다. 정말 좋은 툴이다.
이러한 여러 장점을 가지고 있음에도 Matlab이 쓰기 꺼려지는 가장 큰 이유는 무료가 아니라는 점이다. 다른 프로그래밍 언어와의 호환성이 떨어지는 점, 그리고 단순히 공학적 연산을 하기 위한 스크립트 언어라는 점을 탈피하기 위한 여러 노력을 하고 있다. Matlab코드를 Java, C, C++에 적용할 수 있게끔 노력하는 중이다. 요새는 버전업을 통해 범용성을 늘려가려는 노력을 많이 한다. (General Purpose Progrmming Language를 달성하기 위해 노력하는 듯하다.) - 요새는 4차 산업 혁명에 발 맞춰서 머신러닝과 딥러닝 등 A.I 설계과 모델링에 맞추고 있는 모습을 보인다.
* 매트랩 자체가 수치 해석과 더불어 선형적인 모형을 다룰 수 있도록 설계되어 졌으므로 행렬(matrices)와 벡터를 사용하기 아주 편안하게 되어있다. (그래서 공대생은 매트랩을 쓰면 아주 편-안- 하게 느끼게 되는 것이다. 한번 써보면 헤어나올 수 없는 편안함 - 심지어 내가 설계 안했는데 석사 수준까지는 이미 준비되어 있는 편안함! 아 물론 없는건 만드셔야 합니다. 씽긋 ^ㅡ^)
간단하게 사용하기에는 좋지만, 심화학습을 위해서는 좋지 않아 결국에는 Matlab으로 돌아오게 되었다.
그래서 이번에는 Matlab을 배우기 위한 여러 레퍼런스를 소개하고자 한다. (당연히 추천 레퍼런스이며, 앞으로 Matlab과 관련한 포스팅은 이러한 레퍼런스를 기반으로 포스팅을 이어나갈 예정이다.)
* 설치 문제와 라이센스 문제는 이곳에서 다루지 않을 예정이다. 비싼 라이센스를 가지지만 이후에는 정말 쓸모가 많기 때문에 구매하는 것도 나쁘지 않다고 생각한다.
(학생이라면 당연히, 학교의 라이센스를 충~분하게 쓰시는게 정말 도움이 됩니다. 대학생은 기본적으로 학교에 라이센스가 존재합니다. 꼭 알아보고 쓰시기 바랍니다. )
( 일반인이라면 어쩔 수 없습니다. 구매하세요. ^ㅡ^)
역시 특정 프로그래밍 언어를 배우기 위해 가장 좋은 레퍼런스는 그 프로그래밍 언어를 배포하는 곳에 가서 직접 배우는 것이 가장 좋다. 그러므로 Matlab 공식 사이트에 들어가서 배우는 것이다.
우리는 당연한 일을 당연하게 간과하는 경향이 있다. 이걸 보고서 1차로 학습을 한 뒤에, 책을 쓰는 것이므로 당연히 기본 사이트에 들어가서 보는 것이 좋다. 하지만 처음 프로그래밍을 접한 사람은 이러한 방식은 힘들 수도 있다. 튜토리얼을 작성하는 사람마다 당연하게 생각하는 부분이 다르기에 차분하게 알려준다고 생각하진 않는다. 그러므로 처음 프로그래밍 언어를 배운다면 내게 맞는 책을 골라서 보는 것도 하나의 방법이다.
능동 : 문장의 주어가 동사의 동작을 실행하는 것을 능동태라 한다. 그렇다면 이러한 능동태는 어떤 의미를 가지는가? 행위자가 대상에 동작을 행하는것을 나타내는 것이 바로 능동태다. (그래서 동사 앞에 행위자(주어)가 오는 것이다.)
주어 (행위자) -> 동사(동작, 행위) -> 목적어 (동작 행위의 대상) [이러한 기본적인 사고의 흐름에 따라, 그 해석도 비슷하다. 주어가 어떠한 행위를 한다. 그 행위의 대상이 목적어이다.]
· 수동태
수동 : 수동태는 주어가 동사의 행위와 동작을 받거나 당하는 형태를 의미한다. 수동태는 어떤 일이 벌어진 것 자체, 일어난 일 자체가 중요하다!! 누가 그 일을 했는지는 중요하지 않다. 그렇기에 행위자를 모르거나, 행위자 자체가 중요하지 않은 것이다. 그르므로 행위의 대상을 이야기의 중요 요소로 놓고 싶을 때 수동태를 쓰는 것이다. (그래서 행위자는 동사 뒤에 오거나 언급되지 않는 것이 일반적이다.)
주어(행위의 대상) + be + p.p(주어진 동작, 행위를 이야기함) + by 목적어 (행위자)
J.J house was painted last year → J.J의 집은 작년에 페인트칠해졌다.
J.J painted the ceiling of the his house → J.J는 그의 집 천장에 그림을 그렸다.
1. 수동태 be p.p.
수동태 만드는 방법
능동ㄴ태 문장의 목저어를 주어로 옮긴다.
동사의 시제를 생각해서 be + p.p. (과거분사) 형태로 고친다.
능동태 문장의 주어를 목적격으로 바꾸어서 by + 목적격 으로 만들고 문장 끝에 둔다.
다른 수식어구는 그대로 냅둔다.
예를 들어보자면, 다음의 문장을
My sister draw the picture
→ [내 여동생이 그림을 그려줬다.]
수동태로 바꾸면
The picture drawn by my sister
→[그 그림은 내 동생에 의해서 그려졌다.]
의 형태로 바꾸어진다.
* 주의할 점 : 수동태 공부 자체는 능동태를 수동태로 바꾸고, 수동태를 능동태로 바꾸는 것이 학습의 중점이 아닌다. 이러한 행위를 하는 이유는 주어가 동사의 뜻을 행하는 주체인지, 아니면 동사의 뜻을 받는 대상인지 판단하는 것을 활용해서 자유롭게 사용할 수 있는 능력을 키우기 위함이다. 이를 주의하자!
2. 수동태에서 동작의 행위가 되는 대상
수동태 구문에서 [by + 행위자] 는 언제나 쓰여지는 대상이 아니다.
앞서 수동태를 쓰이는 상황에서 보았듯이, 수동태는 집중하고 싶은 대상이 있는 상태일 때 사용되는 것이 수동태이다.
예를 들어, 백화점에서 유리컵 매장을 구경하다가 모르고 유리컵을 깨서 매우 당황한 상태라 생각하자.
그러면 어머! 유리컵이 깨졌어! 이렇게 이야기할 것이다. ( '나'라는 행위의 주체는 빼고 이야기하는 것이 포인트이다.)
Glass was broken suddnely
→ [유리컵이 갑자기 깨졌어]
이러한 형태로 이야기하게 된다. 내가 깨긴 했지만, 그리고 잘못이란 것을 알고 있지만 누군가의 비난이 너무 두려운 상황이라면 '에구머니나 유리가 깨졋어 어떻하지?' 란 느낌일 때 사용한다. 이런 상황에서는 by + 행위자를 붙이지 않는다.
The results of the exam were announced yesterday.
→ [시험의 결과가 어제 발표되었어.]
이러한 발표의 행위가 중요하지 않은 상황에서 [by + 행위자]는 생략되곤 한다.
발표를 해준 주체가 중요한 것이 아니라 발표된 그 상황 자체가 중요한 것이라 [by + 행위자]가 생략된 것이라 생각하면 된다.
[by + 행위자] 가 생략되는 경우는 다음과 같다.
행위자를 누군지 정확하게 알 수 없는 경우
위에서 유리컵을 깬 상황처럼 행위자가 누군지 알리고 싶지 않은 경우
문맥상 행위자가 누군지 추측이 가능한 경우
행위자보다 그것을 한 행위(행동) 자체가 더 중요한 경우
그렇다면 [by + 행위자] 는 언제 쓰이는가?
행위자가 새로운 정보이거나, 행위자가 전체 행위에서 중요한 역할을 맡고 있다면 반드시 써야 한다.
Student will be taught by an expert
→ [학생은 가르침을 받을 것이다. 전문가에 의하여]
만약에 이 문장을
Student will be taught
→ [학생은 가르침을 받을 것이다.]
로 바꾼다면, 행위자가 정해지지 않은 상태로 누군가가 교육을 받을 것임을 암시함을 알 수 있다.
만약에 과외를 받는 상황이라 한다면, 첫 번째 문장은 선생님이 정해진 상황이고, 두 번째 상황은 가르쳐줄 선생님을 구하고 있으므로 아직은 누가 가르칠지 모른다는 의미를 갖고 있다.
[by + 행위자]가 항상 쓰이는 것은 아니다. by 이외의 다른 전치사가 이용되기도 한다.
감정을 나타내는 경우
be interrested in : ~에 흥미가 있다.
be surprised at[by] : ~에 놀라다
be satisfied with : ~에 만족하다.
be disapointed with[by, at] : ~에 실망하다.
상태를 나타내는 경우
be covered with : ~로 덮여 있다.
be known as : ~으로 알려져 있다.
be engaged in : ~에 종사하다.
be known to : ~에게 알려져 있다.
be filled with : ~로 가득 차다
be known for : ~으로 유명하다.
be caught in : (비 따위를) 만나다.
앞에서 학습한 바와 비슷하게 우리는 조동사와 함께 수동태가 쓰이는 경우도 있다.
이럴 때는 수동태의 형태와 조동사가 의미하는 바가 합쳐져서 헤깔리기 때문에 주의해야 한다.
능동태
수동태
조동사 + 동사원형
will teach ex) J.J will teach students J.J는 학생들을 가르칠 것이다.
will be taught ex) Students will be taught by J.J 학생들은 J.J에 의해 가르침을 받을 것이다.
현재진행
am / are / is teaching ex) J.J is teaching students J.J는 학생들을 가르치고 있다.
am / are / is being taught ex) Students are being taught by J.J 학생들은 J.J에 의해 가르침을 받는 중이다.
과거진행
was / were teaching ex) J.J was teaching students J.J는 학생들을 가르치고 있었다. (지금도 가르치는 중이다.)
was / were being taught ex) Students were being taught by J.J 학생들은 J.J에 의해 가르침을 받고 있었다. (지금도 가르침을 받는 중이다.)
현재완료
have / has taught ex) J.J has taught students J.J는 학생들을 가르쳐왔다.
have / has been taught ex) Students have been taught by J.J 학생들은 J.J에 의해 가르침을 받아왔다.
* 현재진행 : 지금하고 있는 행위에 대한 이야기를 할 때, 현재진행을 쓴다.
* 과거진행 : 과거 진행은 과거에 시작되고 이를 말하고 있는 지금에서도 계속해서 진행하고 있는 사건을 이야기한다.
말하는 시점보다는 이전에 이야기하였으며, 아직까지도 진행되는 것이다.
* 현재완료 : 현재까지 ~을 했는지에 대한 이야기, 과거로부터 이어져와서 지금에 와서 진행 중일 수도 있고, 지금에 와서 끝난 일일수도 있다.
* 진행형과 완료형의 차이점은 둘 다 과거로부터 지금까지 이어져온 것인데, 문장이 가지는 의미에서 차이가 난다.
진행형의 경우, 사건 자체가 중요할 경우에 사용되는 표현, 완료형은 사건으로 인해 생기는 결과 혹은 그로 인해 영향을 받는 것이 중요하다고 생각할 때 사용되는 것이다.
3. 4형식과 5형식 문장을 수동태로 바꾸는 방법
4형식과 5형식 문장의 경우 바꾸는 방법이 살짝 다르다.
앞에서 바꾼 문장은 [주어 + 동사 + 목적어] 형태의 수동태를 바꾸어 보았다.
그렇다면
[주어 + 동사 + 간접목적어 + 직접목적어]의 형태인 4형식 문장
[주어 + 동사 + 목적어 + 목적격 보어]의 형태를 갖는 5형식 문장은 어떻게 수동태로 바꿀 것인가?
4형식 문장의 경우
[주어 + 동사 + 간접목적어 + 직접목적어] 에서
간접목적어가 수동태의 주어가 되고, 직접목적어는 뒤에 그대로 둔다.
예를 들어,
J.J teaches usMath
→ J.J 는 우리에게 수학을 가르친다.
We are taught Math by on J.J
→ 우리는 수학에 대한 가르침을 받는다. J.J에게
이러한 형태로 변환됨을 볼 수 있다.
5형식 문장의 경우
[주어 + 동사 + 목적어 + 목적격보어]
목적어가 수동태에서 주어로 바뀌며, 목적어 뒤에 있는 보어는 be p.p. 뒤에 남아 있게 된다.
변환하면 → [주어 + be p.p. + 보어]의 형태로 바뀌는 것이다.
예를 들어,
J.J found his card missing
→ J.J는 발견했다, 그의 카드가 잃어버린 것을 [의역하자면, J.J는 그의 카드가 없어진 것을 발견했다.]
하나는 LTS버전이고 다른 하나는 최신 버전이다. LTS는 Long Term Support 의 약자로 업데이트가 천천히 이루어지는 버전을 이야기한다. 일반 버전과 LTS 버전을 구분하는 기준은 안정성이 기준이다. 새로 나온 제품이 여러 버그를 생성할 가능성이 많듯이 빠르게 업데이트 되는 일반 버전은 안정성이 LTS 버전보다 떨어질 확률이 높다. 그렇기에 상용화 버전에서는 LTS 버전 이용해서 개발한다. 개발하는 환경 자체가 매번 업데이트 되며 진행되면 당연히 좋다. 하지만 긴 기간 동안에 특정 버전에 맞춰서 개발을 진행했는데, 업데이트 된다면, 개발환경의 변화로 인해 다양한 문제가 생길 가능성이 있으므로 LTS 버전을 쓴다. 실제로 위의 14.15.3 LTS 버튼에는 "안정적, 신뢰도 높음"이란 말이 써져 있다.
자신에게 맞는 운영체제를 기준으로 다운로드 받은 다음에 설치하자.
설치가 완료되면 아무일도 일어나지 않는다. Node.js는 윈도우 기준으로 명령 프롬프트를 통해 실행된다. 다른 프로그램으로도 가능하지만 이번에는 CMD로 진행할 예정이다.
윈도우키 + R 키를 누르고 "CMD"를 입력하면 명령 프롬프트가 실행된다.
"node" 를 치고 엔터!
> 이러한 모양이 나올 것이다. 그러면 제대로 설치가 된 것이다.
꺽쇠 모양(">")이 나오는 시점부터는 자바스크립트를 브라우저에서처럼 마음껏 쓸 수 있다.
그렇다면 다른 폴더에 있는 파일을 실행시켜 보자!
먼저,
console.log('HelloWorld');
를 적은 다음에, 원하는 위치에 HelloWolrd.js를 저장하자.
( D:\Pratice\TestHTML\Ch01\HelloWorld.js 에 위치하고 있다.)
설명을 위해서 차례로 입력해보았다.
여기서
$ cd ..
은 상위 폴더로 가기이다. 실제로
C:\Users> cd .. 를 타이핑하고 엔터를 하면
C:\ 로 전환되는 것을 볼 수 있다.
C:\ 에서 D 폴더로 가고 싶으면
C:\ > 에서
$ C:\> D:
D: 를 타이핑하면 된다.
한번에 가려면 C:\Users> cd D:\Pratice\TestHTML\Ch01\를 쳐주자.
JavaScript 런타임은 자바스크립트가 구동되는 환경을 이야기한다. 그러므로 Node.js를 활용해서 자바스크립트를 구동시킬 수 있는 환경을 만들어주는 것이다.]
Node.js가 나오기 전에는 자바스크립트를 구동하려면 웹 브라우저를 통해서 실행시킬 수 밖에 없었는데, Node.js는 이를 극복시켜주었다. 그래서 브라우저의 엔진을 사용하는 것이 아니라 서버에 Node.js를 설치하고 서버 쪽에서 자바스크립트를 구동할 수 있게 만들어 준 것이 Node.js가되는것이다.
그래서 Node.js를 활용한 서버 구동이라는 말이 많이 나오게 되는 것이다.
[한마디로 노드는 서버사이드 자바스크립트로써 많이 사용된다. - Node.js가 백엔드라고 오해하면 안된다. ]
Node.js를 통해 서버를 구현할 수 있을 뿐이다.
* 그래도 Node.js는 확장성 있는 네트워크 애플리케이션을 위해 설계되었으며, 서버를 위해 설계된 플랫폼이다.
* JavaScript를 쓰면 브라우저에 종속적인데, Node.js를 쓰게 되면 컴퓨터 내부에 있는 File System등 System Call도 가능해진다. - 이러한 부분을 Node.js는 libuv를 통해 처리한다.
물론 Node.js가 유일한 서버사이드 자바스크립트는 아니다. 여러 서버사이드 자바스크립트가 존재하며, 요즘 Node.js 가 많이 사용되고 있을 뿐이다.
* 결국 Node.js가 많이 쓰이는 이유는 자바스크립트라는 하나의 언어를 통해 프론트 엔드와 백엔드 둘 다 다룰 수 있게 해주기에 생산성의 향상으로 이어진다. (솔직히, 서버를 위해 추가적인 언어를 사용하기에는 많은 공부와 더불어 인내가 필요하다. 결과를 빨리 보고 싶지만 느려서 짜증이 난다! 이를 해결해준 것은 Node.js이다. 그렇기에 Node.js가 인기를 끌고 있다고 생각한다.)
Node.js의 장점은 그 동작 원리에 의해 나온다.
Node.js는 기본적으로 이벤트 기반 ( Event-Driven ), 논블로킹 I/O( Non - Blocking I/O), 싱글 스레드 라는 특성을 갖는다.
[ 다른 특징적인 장점은 구글 V8 자바스크립트 엔진을 채용해서 빠른 코드 실행과 더불어 단일 스레드와 확장성을 가지며, 버퍼링이 없으며, 데이터를 Chunk로 출력한다. ]
* 빅데이터를 사용하기에는 적합하지 않으며, 많은 데이터 처리용으로는 파이썬의 장고(Django)가 더 적합하다.
블로킹(Blocking), 논블로킹(Non-Blocking) I/O Model
그렇다면 나머지 두 가지는 나중에 알아보도록 하고 논블로킹 I/O에 대해 살펴보도록 하자.
블로킹(Blocking) I/O는 동작하고 있는 동안에는 다른 일을 처리하지 못하는 상태가 된다. 프로그램의 제어권이 호출된 함수가 일을 모두 마무리 될 때까지 넘어가지 않는 것을 이야기한다.
논 블로킹(Non - Blocking) I/O의 경우, 동작을 한 뒤에 바로 다음 제어가 돌아옴으로써 다음 처리로 넘어갈 수 있게 해준다. (앞서 호출된 함수가 일을 마무리 짓지 않아도 다른 함수가 다른 일을 진행할 수 있도록 해주는 것이다.)
* 블로킹과 논 블로킹은 호출된 함수가 언제 return 하는 가에 대한 차이로 나누어 진다.
블로킹 I/O에 비해 논 블로킹 I/O가 일반적으로 효율적으로 사용할 수 있다. 특히, 웹에서 사용되는 자바스크립트의 경우 싱글 스레드를 사용하므로 블로킹으로 진행되게 되면 사용자는 특정 요청을 보내놓은 상태로 무한정 대기해야 한다. (한 마디로 클릭 한번 했다가 홈페이지에서 아무것도 못하는 상태로 기다려야 하는 것이다.)
그래서 이러한 상태를 막기 위해 비동기(Asynchronous) 방식을 채택한다. 백그라운드에서 돌아가야 할 함수는 Web-API를 호출하면서 해결해버린다. (Web-API와 Event-Loop를 활용해서 케어한다.)
동기/비동기, 블럭/논블럭의 차이점은 동기/비동기의 경우 작업의 결과물을 CallBack인 메시지를 통해 주고 받는데, 작업 완료 여부를 신경쓰는지 안 쓰는지에 따라 차이점이 있으며, 블럭/논블럭의 경우 함수 호출이후에 넘어오는 제어권에 따라 블럭이냐 논블럭이냐를 나누는 것이다. 그렇기에
프로그램은 실행하지 않으면 메모리에 탑재(Load)되지 않은 상태로 저장만 되어 있다. 저장된 상태에서 프로그램을 실행하게 되면 메모리에 탑재(Load)되며 이제부터는 프로세스로써 실행되게 된다. 스레드란 프로세스 상에서 하나의 실행 흐름을 이야기한다. 스레드가 1개 일수도 있고 여러개가 될 수도 있다. 각각의 스레드마다 독자적인 스택영역을 가지지만 힙 영역을 공유한다. (한 마디로, 여러개로 작업 처리를 하지만 줄을 서는 대기열은 1줄이라는 소리이다.) 멀티 프로세스의 경우 스택 영역과 힙 영역을 따로 가지는게 일반적이다.
싱글 스레드는 이러한 스레드가 1개인 것을 이야기한다. 1개의 스택 영역과 1개의 힙 영역을 가지는 상태를 의미한다.
그래서 직접적인 다중처리가 불가능하지만 이를 외부 함수 libuv를 통해 비동기적 처리를 넘긴다. 그렇게 싱글스레드이지만 효율적인 처리를 통해 NGINX, 아파치(Apache)와 비슷한 성능을 얻게 되었다. 물론 데이터양이 많이 늘어남에 따라서 기존에 사용하던 서버가 더 좋은 경우도 생길 수 있다. 하지만 간편하게 자바스크립트만 알아도 서버를 만드는 것은 매우 좋은 일이다!
* 근본적으로 자바스크립트는 Block하지 않는 것을 원칙으로 한다. 대부분의 I/O처리는 이벤트와 콜백으로 처리함으로써 콜백을 기다리는 상황에서도 계속 가동될 수 있도록 두는 것이다. (효율적으로 가동한다!)
* 싱글 스레드라곤 하지만 실제로는 몇 개의 스레드가 더 있는 상황이라 봐도 좋다. 내부적으로 싱글스레드일뿐!
(프런트엔드, 백엔드, 하이브리드 애플리케이션, 임베디드 장치 등등 다양하게 서비스된다.)
그렇다면 이렇게 다양하게 쓰이는 자바스크립트가 기본적으로 어떻게 작동되는지에 대해 살펴보고자 한다.
자바스크립트의 여러 엔진 중 하나인 자바스크립트 V8엔진을 통해 알아보도록 하자.
* 이 부분은 어려운 부분이기에 간략하게 읽고 넘어가도 좋다.
너무 어려운 부분을 깊게 파고 들면 자칫 흥미를 잃을 수도 있으므로 아 이러한 구도로 진행되는 군! 정도면 충분하다고 생각한다.
자바스크립트 V8 엔진이란?
V8 자바스크립트 엔진은 구글에서 C++로 작성된 자바스크립트 엔진이다. 구글 크롬(Google Chrome)이 아니더라도 따로 실행이 가능하다. 대표적으로 Node.js가 V8로 빌드되었다. 이러한 V8엔진은 기본적으로 싱글 스레드 (Single-thread)와 콜백 큐(Callback-Queue)가 있다.
크롬은 기본적으로 자바스크립트 엔진 V8을 탑재하고 있다.
자바스크립트 엔진은 구글의 V8엔진 외에도 다른 여러 엔진이 존재한다. 하지만 구글은 더 빠르고 효율적으로 구동하는 엔진을 가지고 싶어했다. 그래서 자바스크립트 코드를 인터프리터를 사용하는 대신 특정 컴파일러를 활용해서 별다른 변형 없이 기계 코드로 변환하는 방식으로 채택하였다. Rhino(Moziila)나 SpiderMonkey 엔진 처럼 JIT(Just in Time) 컴파일러를 구현해서 다이렉트로 기계코드로 변환시키는 것이다. [ V8엔진은 bytecode나 intermediate code를 만들지 않는다. ]
* 사실 자사에 맞는 조금 더 효율적인 자바스크립트 엔진을 갖기 위해서 V8 엔진을 만들었다고 생각한다.
싱글 스레드(Single-thread)?
스레드란 기본적으로 하나의 프로그램에서 프로세스가 실행되는 흐름의 단위를 이야기한다.
그렇다면 프로세스란 무엇인가?
프로세스는 우리가 작업관리자에서도 볼 수 있다. 프로그램은 실행되기를 기다리는 특정한 코드(명령어들)과 데이터들의 묶음이라 볼 수 있다. 이러한 프로그램을 실행하게 되면 코드와 데이터들의 묶음이 메모리에 적재(Load)되면 프로세스가 된다.
프로세스는 일반적으로 실행 중인 프로그램이라 생각할 수 있으며, 실행 중인 무언가라 생각할 수 있다.
반대로 하나의 프로세스는 여러개의 스레드로 구성이 가능하다.
쓰레드는 결국 프로세스에서 하나의 흐름을 이야기한다고 보면 된다. 싱글 스레드는 결국 프로그램에서 하나의 흐름을 갖는다는 이야기이다. (프로세스 내에서 할당 받은 실행의 한 단위라고 생각하면 된다.)
* 스레드는 프로세스 안에서 메모리 공간을 공유하지만, 프로세스는 프로세스 별로 각각의 메모리 공간을 갖는다.
싱글 스레드는 하나의 콜 스택(Call Stack)과 하나의 힙(Heap)을 가진다. 하나의 콜 스택이 있으면 한 번에 하나의 동작만 실행할 수 있다. 하지만 단순히 자바스크립트가 한 번에 하나의 동작만을 실행하고 있다고 생각되진 않는다.
단적인 예로 방 청소를 할 때를 생각해보면 된다. 청소기를 돌리고 있는 상황에서는 청소기 밖에 못 돌리는 것이다. 다른 어떤 일도 처리할 수 없다. 이를 홈페이지에서 적용해보면 된다. 특정 화면이 변하고 있는 상황에서는 아무것도 클릭하지도 조작할 수도 없다. 로딩이 끝날 때까지 기다려야 하는 것이다. 하지만 우리는 클릭도 가능하고, 마우스 스크롤을 통해 홈페이지를 살펴볼 수도 있다.
즉 자바스크립트를 비동기적으로 코드를 실행시킬 수 있게 해주는 것이 Web API, Task Queue, Event Loop가 된다.
자바스크립트 자체는 한번에 하나의 코드만을 실행시킬 수 있지만, 여러 외부 요소가 Web API, Task Queue, Event Loop가 되는 것이다.
기본적인 도식도를 생각해보면 이러한 형태로 이루어져 있다.
( Stack은 컴퓨터에서 사용되는 자료구조의 한 종류로써 블럭을 쌓는 구조라 생각하면 된다. 먼저 넣은 블럭은 차곡차곡 쌓여서 다시 꺼낼때에는 제일 나중에 빼야하는 구조이다. - 자료구조에서 더 자세히 볼 수 있다. )
( Heap은 컴퓨터에서 사용되는 자료구조의 한 종류로써 매점에서 줄을 서는 구조와 비슷하다. 먼저 서서 기다리면 가장 먼저 처리되는 구조이다. - 자료구조에서 더 자세히 보도록 하자.)
Event Loop : Call Stack이 비어잇는지 아닌지 체크를 하고 비어있다면 callback을 Call Stack으로 옮긴다. (그림 상에서 Stack이라 불리는 부분이 Call Stack이다.)
Task Queue : 실행해야할 여러 일을 임시로 대기시키는 큐이다. 일종의 대기열이라고 생각하면 된다.
Web API : Web API는 브라우저 자체에서 지원하는 여러 API들을 의미합니다. 여기서 Web API는 setTimeout, DOM이벤트, Ajax (XMLHttpRequest) 등의 비동기 작업을 수행하도록 API로 지원한다.
* API ( Application Programming Interface) : (응용 프로그램 프로그래밍 인터페이스) 이하 API는 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만드는 인터페이스를 의미한다.
* 인터페이스(Interface) : 영어 자체를 들여다보면 Inter(사이에, 중간에, 도중에 = between) + face(어떤 것을 바라보다) 란 느낌으로 둘이 서로를 바라보는 것을 의미한다. 그렇다면 interface는 서로가 바라보고 있는 연결면, 접점 등을 의미한다. 하드웨어 인터페이스는 컴퓨터에 있는 랜선과 랜선 연결 커넥터 같은 것들도 하드웨어 인터페이스라 볼 수 있다. 대표적인 인터페이스는 User Interface인 UI가 있으며 이는 컴퓨터와 사람 간의 상호작용에 대한 접점으로 볼 수 있다.
이러한 기본 구조를 통해 자바스크립트가 어떻게 구동되는지 간단하게 옅볼 수 있다.
코드 상에서는 어떻게 작동되는가?
자바스크립트가 비동기적으로 작동하고 있다는 사실은 아래의 코드를 실행해봄으로써 바로 알 수 있다.
1. 콜 스택(Call Stack)에서 first_call_function함수에서 setTimeout 함수가 호출되면 setTimeout은 WebAPI에 의해서 백그라운드에서 실행된다. 이후에 first_call_function함수의 setTimeout함수는 콜 스택(Call Stack)에서 사라진다.
2. first_call_function함수의 setTimeout 함수의 실행이 끝난 뒤에 바로 콜 스택(Call Stack)에서 second_call_function함수의 setTimeout함수가 호출된다. 1과 마찬가지로 setTimeout은 WebAPI에 의해서 백그라운드에서 실행되며, second_call_function함수의 setTimeout함수는 콜 스택(Call Stack)에서 사라진다.
3. WebAPI에서 의해 백그라운드 상에서 정해진 시간이 지난 뒤에 console.log("second_call")이 Task Queue로 옮겨진다. 그리고 그 다음 시간이 지난 후에 console.log("first_call")이 Task Queue로 옮겨진다.
4. 이제 콜 스택(Call Stack)이 비워졌으므로 Task Queue에 있는 console.log("second_call")와 console.log("first_call")가 차례로 실행된다.
홈페이지를 만들기 위해서는 서버가 반드시 필요하다. 그렇다면 일반적으로 우리가 홈페이지를 만들기 위해서 선택할 수 있는 선택지가 3가지 존재한다.
1. 직접 서버 구축하기
2. 아마존 웹 서비스를 활용해서 서버 구축하기
3. 헤로쿠(Heroku)를 활용한 서버 구축하기 ( *이하 헤로쿠라 지칭하겠다.)
정도로 생각할 수 있다.
여기서 가장 쉽게 접근할 수 있는 플랫폼이 헤로쿠를 활용한 홈페이지 구축하기가 가장 쉽다.
1. 직접 서버 구축하기의 경우, 직접적으로 하드웨어를 사야함과 더불어 서버와 관련한 지식, 보안과 관련한 지식이 필요하기 때문에 가볍게 접근하기 어렵다. 만약에 개발자로써 이미 일을 하고 있으면서, 많은 지식을 보유한 사람이라면 가장 좋은 방법일 수도 있지만, 가볍게 시작하는 마음으로는 어렵다.
2. 아마존 웹 서비스(AWS)의 경우, 많이 쓰기도 하며 현업에서 많이 사용된다. 하지만 시스템에 대한 고려가 필요하며, 보안 문제로 인해 트래픽의 증가는 우리의 지갑을 위협하기도 하기에 불안하다.
( * 성능면에서는 당연히 아마존 웹 서비스(AWS)가 더 좋으며, 관련 기기를 대여하는 비용은 아마존 웹 서비스(AWS)가 더 저렴하다. 하지만 갑작스럽게 늘어난 트래픽을 감당하지 못하면 큰 비용을 내야할 수도 있기에 배우는 입장에서 AWS는 좋지 않은 선택이라 생각한다. - 언제까지나 가벼운 마음으로 접근하는 것이기에)
1번과 2번에 이유에 따라 헤로쿠를 사용하게 되었다.
* 가벼운 마음으로 간단한 프로젝트를 진행하면서 여러 가지 실험을 하고 싶은 경우* 포트폴리오를 제시하고 싶은 경우
우리는 이 두 가지에 해당하기에 헤로쿠로 진행하도록 한다.
(헤로쿠는 PaaS 서비스이며, AWS는 IaaS, PaaS, SaaS를 다 제공하고 있으며 점차 시장을 확장해나가고 있다. 초기에는 IaaS를 통해 성장하였으며, 대표적으로 IaaS는 Amazon EC2 서비스가 있다. 오래된 기업인 만큼 신뢰도가 높다.)
* PaaS : Platform as a Service를 의미 - 서버를 위한 기기와 그에 따른 응용 프로그램을 개발할 수 있는 API까지 제공하는 환경을 PaaS라 합니다. (하드웨어와 소프트웨어를 주고서 알아서 관리해줍니다. 사용자는 프로그램 개발에 사용되는 애플리케이션과 데이터에 해당하는 부분만 신경쓰면 됩니다.)
* IaaS : Infrastructure as a Service를 의미 - 업체가 데이터센터를 구축해서 서버를 직접 관리해줍니다. 물리적 서버를 가상화 기술을 통해 여러개의 가상화 서버로 나누어서 제공합니다. 제공되는 업체가 관리해주는 서버 외에는 대부분의 필요한 시스템을 직접 구축해야 하므로 많은 지식이 필요합니다. (그래서 담당 인력이 필요하기도 합니다.)
* SaaS : Software as a Service를 의미 - 제공되는 업체에서 대부분의 요소를 제공해주고 관리해준다. 편하게 제공되는 서비스만 받아서 사용되는 것을 의미한다. (대표적으로 Google Docs, 네이버 이메일 등이 있다.)
사용자의 자유도에 따라 도식화해보자면 이런 느낌으로 그릴 수 있을 것이다. ▼
IaaS를 쓰면 자유도가 높지만 관리해야할 요소가 늘어나고 필요한 지식과 시간 그리고 인력이 필요하다.
가장 기본이 되는 Free 버전을 제공해주고 있다. (완전하게 무료로 제공되고 있다. 550 - 1000시간을 쓸 수 있다. 신용카드 정보를 넣으면 1000시간을 쓸 수 있으며, 1달 - 30일 기준으로 720 시간이므로 우리가 잠들어 있는 시간을 감안한다면 충분하다. 부족하다면 신용카드 정보를 입력하면 1000시간을 제공받을 수 있으므로 상관없다. 물론 결제는 되지 않으니 안심해도 된다.)
유일한 단점이라면 30분 정도 입력이 없을 경우 Sleep에 들어간다는 점이다. 다시 접속했을 때 구동까지 4~5초 정도의 시간이 걸린다. (물론 더 걸릴 수도 있다.) 하지만 우리의 가벼운 프로젝트에는 이러한 점은 전혀 문제가 되지 않는다.
* 여기에 한 달에 $7을 지불하면[Hoby버전] sleep 없이 서버를 운영할 수 있게 된다.
(무료 버전과 Hoby 버전에서의 주요 차이점은 SSL을 통한 HTTPS를 적용하는것이 가능해진다. 구글에서는 HTTPS를 권장하고 있으므로 구글 검색에 나오게 하려면 SSL를 통한 HTTPS 구현을 해두어야 한다.
구글 크롬 기준으로 HTPPS 연결이 안 이루어지면 무시무시한 '주의요함' 이 뜬다.
어차피 연습해볼 기분으로 블로그를 만드는 것이기에 헤로쿠 Free 정도면 충분하다.
Dyno(다이노)?
헤로쿠에 들어가면 다이노(Dyno)가 존재한다. 우리가 사용하고자 하는 서비스도 다이노이다.
다이노란 사용자가 쓰기 좋게 만들어놓은 가상화된 Unix의 컨테이너를 의미한다.
가상화란?
가상화는 하나의 물리 하드웨어에 가상으로 소프트웨어를 여러 개로 나누어 놓는 것을 의미한다.
실제가 존재하는 물리적 하드웨어는 한계가 존재한다. 예를 들면, 하드웨어 성능을 모두 다 활용하기 힘든 점을 들 수 있다. 100%의 성능 활용이 힘들다면 투자한 비용 대비 효용을 낼 수 없다. 그렇기에 하드웨어 성능을 모두 활용하기 위해 도입한 것이 가상화 기술이라 볼 수 있다.
물리적인 한계를 추상화를 통해 어느정도 극복하기 위한 기술이 가상화라 볼 수 있다.
(1대의 컴퓨터로 10대의 컴퓨터가 있는 것처럼 행동할 수 있는 것이다. 이는 많은 비용을 아껴주며 새로운 부가가치를 가져다 주는 것이다. )
방금까지 한 것은 내 컴퓨터(로컬)에 해당하는 부분을 변경했으니 이제는 서버에 적용해줘야 한다.
대부분의 헤로쿠 프로젝트는 이러한 방식으로 변경한다.
[참고로 로컬 서버가 가동 중에는 명령어가 안 써질 수도 있으니 그런 경우라면 ctrl + c를 누르고 Y , Enter를 눌러주면 종료된다.]
$ git add .
git의 가상의 준비 영역인 Staging Area를 Idex라 부른다. 추가한다고 해서 바로바로 저장소로 올라가는 것이 아니라 임시 저장소를 하나 더 둠으로써 관리하기 용이하기 만들어 두었다. add . 명령어는 index 공간에 올려두는 것이다.
$ git commit -m "Add cool face API"
이제 commit 명령어를 통해 index에 있는 것을 실제 저장소에 옮겨 공개하도록 한다. 여기서 특이사항을 메시지로 남겨서 어떤 점이 변경되었는지를 알려주는 역할을 한다. "Add cool face API"는 간단한 메시지를 남긴 것이다. [사실 이 특성은 헤로쿠의 특성보다는 git의 특성이다.]
$ git push heroku main
이제 헤로쿠에 올린다.
$ heroku open cool
실제 웹사이트에 잘 올라갔는지 확인해둔다. 아까 로컬에서 확인했듯이 실제 서버에서도 F5를 누를 때마다 표정이 바뀌는 것을 확인할 수 있다.
* 만약에 index에 올린 파일을 삭제하고 싶다면
$ git rm --cached 파일이름
을 통해서 삭제가 가능하다. [git 다루는 내용이 아니므로 간략하게만 이야기하였다.]
간략하게 헤로쿠에 파일을 올려보고 웹사이트를 통해 확인하는 방법에 대해 알아보았다.
다음 시간에는 헤로쿠에다 만든 파일을 올려보고 JSON 파일 조작을 통해 내가 만든 웹사이트를 올리는 방법을 알아보도록 하자.