요청에서 이에 대한 응답을 내려주기 까지의 과정을 그림으로 그려서 이해해보고자 했다.


내가 알고있었던 보통의 과정들은 다음과 같았다.



이 과정에서 각각 어떤 과정을 거치면서 요청이 가는지 간단하게 사진을 나타내보았다.


- dns, router, tcp/ip 


② 

- 로드밸런싱(다중 서버일 때 요청이 적절하게 분배될 수 있도록 한다.)


- 웹 컨테이너를 거치지 않고 정적 컨텐츠를 리턴( js, html, css, font 등등)

- 동적컨테이너가 요구될 때 was(웹 컨테이너)에 전달


④ 

- jsp,servlet을 실행시킬수 있는 소프트웨어이다.

- web.xml(Deployment descripter)로부터 서블릿을 검색

- HttpServletRequest, HttpServletResponse객체를 만들어 생성하고 요청할 때 전달한다.

- 아래에서 더 상세하게 정리해놓습니다.


- 연결할 수 있는 스레드들을 미리 생성하여놓고 관리한다.


- 서블릿을 관리하는 컨테이너이다.


- was위에서 동작하는 프로그램이다.

- 자바를 사용하여 웹 페이지를 동적으로 생성한다.

(서블릿 : https://monny.tistory.com/163?category=658835)



위에서 정리하다 보니 웹 컨테이너에 대해서는 정리할 게 많아서 다시 밑에 따로 정리해놓는다.

아래의 그림은 웹 컨테이너가 구동되고 최초 요청에 의해서 각 컨테이너들이 생성되는 과정을 그림으로 나타내본것이다.



초기화 과정은 이렇게 진행되고 다음 url은 예전에 정리해두었던 DispatcherServlet이 요청을 처리하는 과정을 나타낸것이다.

(DispatcherServlet 요청 처리 : https://monny.tistory.com/170?category=720158)


'Programming > 웹 관련' 카테고리의 다른 글

스프링의 요청에서 응답까지  (0) 2019.03.06
웹 렌더링  (0) 2019.03.03
브라우저 아키텍처 그리고 html 파싱  (1) 2019.03.02

■용어


Rendering 

    • SSR : Server Side Rendering - 서버 측에서 HTML로 렌더링하여 준 자원을 브라우저가 표시
    • CSR : Client Side Rendering - 일반적으로 DOM을 사용하여 브라우저에서 렌더링을 한다.
Performance 
    • TTFB : Time to First Byte - 링크를 클릭 후에서부터 첫 번째 바이트를 받기까지의 시간
    • FP : First Paint - 픽셀이 처음으로 사용자에게 표시되는 시간
    • FCP : First Contentful Paint - 요청한 컨텐츠가 보이게 되는 시간
    • TTI : Time To Interactive- 페이지가 대화형으로 전환되는 시간


■ SSR(Server Side Rendering)


서버사이드 렌더링은 서버 측에서 리소스 + HTML을 내려주는 것이다. 이렇게 하면 브라우저에서 응답을 받기 전에 처리되므로 클라이언트에서 데이터 가져오기 및 템플리트 작성에 대한 추가 왕복이 발생하지 않습니다.




서버에서 페이지 로직 및 렌더링을 실행하면 많은 Javascript를 클라이언트에 보내지 않아도되므로 TTI를 빠르게 수행할 수 있습니다. 단 서버 사이드 렌더링을 사용하면 서버에서 렌더링하는 시간이 걸리므로 TTFB가 느려질 수 있습니다. 



■ Static Rendering 


서버사이드 렌더링이 사용자의 요청을 받았을 때 즉석에서 HTML을 생성해낼 때, 정적 렌더링은 각각의 요청에 대한 렌더링을 CDN에 배포함으로 에지 캐싱을 활용한다. 하지만 단점이 있는데 이는 가능한 모든 URL에 대해 개별 HTML 파일을 생성해야 한다는 것이다. 



■ CSR(Client Side Rendering)


클라이언트 사이드 렌더링은 Javascript를 이용하여 브라우저에서 페이지를 직접 렌더링하는 것입니다. 모든 로직, 데이터 가져오기, 템플릿 및 라우팅은 서버가 아닌 클라이언트에서 처리합니다.



CSR의 단점으로는 응용프로그램이 커질수록 Javascript의 양이 증가하게 되는것이다. 



'Programming > 웹 관련' 카테고리의 다른 글

스프링의 요청에서 응답까지  (0) 2019.03.06
웹 렌더링  (0) 2019.03.03
브라우저 아키텍처 그리고 html 파싱  (1) 2019.03.02

서버로부터 HTML를 받아온 브라우저가 이를 어떻게 해석하여 화면에 표시하는지 과정을 알고 싶어서 찾아보았다. 이 글은 https://d2.naver.com/helloworld/59361과 https://dzone.com/articles/behind-browser-basicspart-1를 정리하여 작성한다.


브라우저의 기능

브라우저는 웹 리소스(HTML, CSS, XML, JS, JSON, PDF 등등)을 화면에 그리는 기능을 한다. 일반적으로 리소스의 위치를 사용자가 URI를 통해 사용함으로 브라우저는 서버에게 요청을 하고 서버는 이에 대한 응답을 정보들을 준다. 


브라우저의 구성 요소



1. 사용자 인터페이스 

- 일반적으로 우리가 바라보는 브라우저의 모습이다. (뒤로가기 버튼, 새로 고침 버튼, 주소 입력창, 탭창 등등..)

- 인터페이스 계층은 주로 데이터 계층과 커뮤니케이션한다. 또한 콤보 박스 같은 위젯을 그리기 위해 UI 백엔드와 통신하기도 한다. 


2. 브라우저 엔진 

- 브라우저 엔진은 렌더링 엔진과 인터페이스 사이에서 다리 역할을 하며 새로 고침이나 뒤로가기, 앞으로가기 등 메소드를 제공한다.

 

3. 렌더링 엔진 : 컨텐츠를 화면에 그리는 역할을 한다.

- 화면에 URL로부터 주어진 컨텐츠를 렌더링하는 역할을 하며 HTML과 CSS, XML등을 해석한다. 기본적으로 하나의 스레드로 동작한다.


4. 통신 

-Http요청과 같은 네트워크 호출에 사용한다.

  

5. 자바스크립트 해석기 

-자바스크립트를 해석하고 실행한다.


6. UI 백엔드  

- 콤보 박스와 창 같은 기본적인 장치를 그림.


7. 자료 저장소  

-  자료를 저장하는 곳으로. 모든 종류의 자원을 로컬의 하드 디스크에 저장할 필요가 있다. 로컬 웹 데이터베이스다.




■ HTML 파싱 과정

  1. HTML Parser가 DOM 트리로 파싱한다.

    파싱 = 코드를 이해하고 사용할 수 있도록 특정 구조로 변환시키는 것

    DOM = 웹페이지가 로드될 때, 페이지의 엘리먼트가 구조화되어 트리를 이루는데, DOM이란 그 엘리먼트를 다루기 위한 표준이다.

    (DOM에 대해 더 알고싶다면 https://www.w3schools.com/js/js_htmldom.asp)



    웹은 파싱과 동시에 수행이 되는 동기화 모델이다. 파싱 중 <script> 태그를 만나게 되면 파싱을 멈추고 스크립트를 실행하게 된다. 보통 html을 작성할 때 스크립트 태그를 가장 아래에 내려놓는 이유도 이것이다.  css의 경우에는 화면을 표시하기 위한 정보를 담고 있기에 미리 해석되는 것이 유리하다 판단하기 때문에 body태그 위에 많이 선언한다. 이렇게 자바스크립트의 경우 아래에 많이 삽입하는데 HTML5에서는 defer , async와 같이 비동기로 속성을 추가하기 때문에 별도의 맥락에 의해 파싱되고 실행할 수 있다.

    async의 경우는 외부에 위치한 스크립트 파일에만 적용가능하며, 스크립트 로드를 파싱하고 있는 와중에 비동기로 다운받고, 실행할 때는 파싱을 멈춘다. 

    defer 속성은 비동기적으로 스크립트를 로드하지만 실행은 파싱이 끝난 후에 하도록 하는 것이다.

  2. CSS Parser가 스타일을 파싱하여 스타일 규칙을 생성한다.



  3. DOM 트리와 스타일 규칙을 이용하여 렌더트리를 생성하고 레이아웃을 실행 시킨다. 

    렌더 트리 = DOM 트리에 스타일 규칙을 적용하여 만든 것



    레이아웃 실행 = 노드와 해당 노드의 스타일 규칙을 적용 만든 것들의 정확한 위치와 크기 등을 계산하는 과정 


  4. 이제 렌더 트리는 각 노드를 화면에 실제로 나타낼 수 있도록 페인팅한다.


이 전체 과정을 보면 다음 사진과 같다.



이 과정을 측정할 수 있는 도구가 크롬 개발자 도구에도 있는데 크롬 개발자 도구를 열고 아래와 같이 들어가게 되면



다음과 같이 측정되었던 것들을 볼 수 있게 된다.




'Programming > 웹 관련' 카테고리의 다른 글

스프링의 요청에서 응답까지  (0) 2019.03.06
웹 렌더링  (0) 2019.03.03
브라우저 아키텍처 그리고 html 파싱  (1) 2019.03.02
  1. 2019.03.03 20:47

    비밀댓글입니다

■커스터마이징 버튼 만들기


프로젝트 내에서 fullcalendar를 사용하게 되었다. 뷰 모드는 agenda로 다음 날짜 혹은 이전 날짜 버튼을 클릭했을 때 특별한 작업을 하고 싶었다.  


일단 기존의 prev, next 버튼에 이벤트를 추가하고 싶었으나 정보를 제대로 찾지 못해서 커스터마이징된 버튼으로 대체 하기로 하였다.



Calendar에 동적으로 데이터 추가하기


작성한 updateTime는 calendar에 events(데이터)를 추가하는 것이다. calendar에 데이터를 추가하는 방법은 다음과 같이 호출하면 된다. 


* 배열의 경우

$('#calendar').fullCalendar('renderEvents',데이터배열,영구데이터)


* 배열이 아닌 객체의 경우

$('#calendar').fullCalendar('renderEvent',데이터,영구데이터)




삽입 시 데이터의 구조


다음은 데이터 구조는 https://fullcalendar.io/docs/event-object를 보면서 작성하였다.


내 경우에는 start와 end 프로퍼티를 이용했다.



위에서 너무 횡설수설하며 글을 써서 잘 이해가 되지 않는다면 https://fullcalendar.io/docs/renderEvent 이 부분을 한번 읽어보면 좋을 것 같다.



 

'Programming > javascript' 카테고리의 다른 글

FullCalendar prev, next 버튼 이벤트  (0) 2019.03.01

인증이 되어있지 않은 사용자는 스프링 시큐리티의 필터링에 걸려 로그인 페이지로 향하게 된다. 나의 경우 처음에는 로그인을 성공했을 때 핸들러를 통해(SimpleUrlAuthenticationSuccessHandler를 상속받아 작성) 메인페이지로 돌아가게끔 URL을 지정하였다.


그렇다면 메인페이지말고 내가 로그인 페이지로 넘어가기전에 요청했었던 url로 넘어가고 싶다면 어떻게 해야 할까?


보통 다른 방법들을 찾아보았을 때 login페이지 컨트롤러에서 Session 값을 넣거나 하는 작업을 하는 것들을 보았는데, 사실 우리는 그럴필요가 없다. 



레퍼런스에서 발견한 내용인데 두번째 문단을 읽어보면 인증전의 요청을 세션에 저장하고 있다고 얘기한다.

그리고 세션에 저장되어 있는 속성의 이름은 SPRING_SECURITY_SAVED_REQUEST 이다. 그렇다면 이제 로그인을 성공했을 때 핸들러에서는 다음과 같이 작업을 하면 될것이다.




또 다른 방법으로는 위의 글에서 언급한바와 같이 핸들러를 작성할 때 SavedRequestAwareAuthenticationSuccessHandler

를 상속받아 사용할수도 있는 것 같다.




1. final



1) 변수 : 변수가 초기화된 이후 변경되지 않는다.



2) 클래스 : 이 클래스는 서브클래스를 가지지 않는다. 다시 말해 이 클래스를 상속할 수 없다.




3) 메소드 : 해당 메소드는 서브 클래스에 의해 오버라이딩 되지 않는다.





2.finally



1) try - catch : try 혹은 catch가 실행된 후 실행



finalize



가비지 컬렉션에서 객체를 destroy 또는 delete 하기 전에 호출하는 메소드이다. 데이터베이스 커넥션이나,  네트워크 커넥션 같은 연관된 자원들을 해제한다. 기본적으로 Object에 선언되어 있으므로, 모든 객체는 finalize를 가지고 있다.



'Programming > JAVA' 카테고리의 다른 글

final, finally, finalize  (0) 2018.11.20
Comparison with Lambda  (0) 2018.10.29
자바 8 - Map  (0) 2018.10.19
캡슐화, 추상화, 인터페이스  (0) 2018.10.10
자바8 - List  (0) 2018.10.02
자바8 - 제네릭  (2) 2018.09.03

쉘과 프롬프트


@ 앞 : 접속 계정

@ 뒤 : 접속한 시스템의 이름

: 뒤   : 현재 경로( pwd로도 확인 가능)



사용자 관리



1.사용자 추가

useradd [option] 계정이름


-d : 홈 디렉토리를 저장할 때 사용

-g : 그룹 지정

-G : 기본 그룹 이외에 추가로 지정할 그룹이 있는 경우

-c : 계정에 대한 설명


현재 시스템의 사용자를 확인하려면 "cat /etc/passwd" 명령어를 통해 확인 가능하다.

각 라인은 다음을 의미한다 [ID : 비밀번호 : UID : GID : 설명 : 홈 디렉터리 : 로그인 쉘]


2. 사용자 비밀번호 설정


사용자의 비밀번호는 /etc/shadow 파일에 암호화 되어 있다.

비밀번호가 설정되어 있지 않은 곳은 느낌표(!)로 표시되어 있다. 


계정에 비밀번호를 설정하고 싶다면 passwd [계정 이름] 으로 설정할 수 있다.


3. 사용자 삭제


userdel [option] 계정


-r : 사용자의 홈 디렉터리를 같이 제거한다.


4. 그룹 추가 및 삭제


groupadd 그룹명

groupdel 그룹명



그룹에 대한 정보는 /etc/group 파일에 있으므로 cat 명령어로 확인가능하다.


사용자가 속한 그룹을 보고 싶다면 "groups 계정명"을 입력하여 볼 수 있다.



디렉토리 관리


1. 파일목록 표시



ls [op] [directory]


-l : 파일에 대한 자세한 내용 출력

-a : 현재 디렉토리의 모든 내용 출력(히든, 디렉토리..)

-h : 파일 크기 단위를 변경하여 출력한다.

-F : 실팽 파일이나 디렉터리 등이 쉽게 구분 될 수 있도록 출력

-R : 하위 디렉터리 내용 함께 출력


alias : 미리 명령어를 지정해놓은 것.

alias는 .bashrc 파일에 있다. 90번 라인쯤으로 이동하면 (":90" 명령어를 이용하여 90라인으로 이동가능하다.)

vi로 alias를 추가한다.

.bashrc의 경우 로그아웃 후 로그인 하면 다시 적용이 된다. 하지만 이런 과정없이도 source명령어를 통해 업데이트 할 수 있다.

source .bashrc

후에 alias 명령어를 실행해보자.



2. 디렉토리 생성 및 삭제


mkdir [op] [디렉토리 명]


-m : 디렉토리의 권한 지정 default는 755(rwxr_xr_x)

-p : 상위 디렉토리가 존재하지 않으면 상위 디렉토리도 만든다.


rmdir [op] [디렉토리 명]


-p : 상위 디렉터리도 지운다. 단 폴더가 비어 있지 않은 경우 삭제 불가능


파일 관리


1. 파일의 종류

프로그램들은 주변의 장치를 파일로 인식하기 때문에 , 파일의 종류가 다양하게 존재하게 된다.


- : 일반 파일

b : 블록 디바이스 파일

c : 문자열 디바이스 파일

d : 디렉토리

l : 심볼릭 링크

s : 소켓

p 또는 = : 명명된 파이프


2. TOUCH


touch [op] 파일이름


-c : 현재 시간으로 파일 시간을 변경

-d [yyyy-MM-dd hh:mm:ss] : 현재 시간 대신 지정한 시간('yyyy-MM-dd hh:mm:ss')으로 파일 시간을 변경

-t [yyyyMMddhhmm.ss]: 현재 시간 대신 지정한 시간('yyyyMMddhhmm.ss')으로 변경


3. CP


: 파일을 복사하는 명령어


cp [op] [원본] [사본]


-a : 파일의 속성, 링크 정보를 유지하면서 복사

-i : 이름이 겹치는 파일이 존재하면 덮어씌울지 말지를 결정한다.

-f : 복사한 곳에 같은 이름의 파일이 존재하면 강제로 덮어씌운다.

-R : 디렉토리의 경우 그 안에 포함된 모든 하위 디렉토리 및 파일을 함께 복사한다.


4. MV


:파일을 이동시키는 명령어


mv [op] [원본] [이동 목적지]

-b : 덮어 쓰게 되는 경우 백업 파일을 만들고 파일을 만든다.

-i : 이름이 겹치는 파일이 존재하면 덮어씌울지 말지를 결정한다.

-f : 강제로 덮어씌운다.


5. RM


: 파일 삭제 명령어


mv [op] 파일이름

-r , -R : 일반 파일이 아닌 디렉터리인 경우 그 하위 디렉터리와 파일 까지 모두 삭제

-i : 파일을 삭제 할 것인지 사용자에게 물어본다.

-f : 강제


6. CAT


: 파일의 내용을 화면에 출력한다


cat [op] 파일 이름


-n : 줄 번호를 표시

-b : 빈 행은 제외하고 줄 번호를 표시한다.

-E : 각 행마다 끝에 $ 문자를 출력한다.


7. FIND


: 다양한 조건으로 특정 파일을 찾는다. 시작 디렉토리를 지정한다.


find [시작 디렉토리] [조건]

-name "문자열" : '*' , '?'등을 이용하여 검색조건을 지정할 수 있다.

-user "유저이름" : 특정 유저가 소유한 파일들을 모두 찾는다. 

-perm "퍼미션" : 퍼미션으로 된 파일을 찾는다. 

-type ? : 파일의 종류를 검색한다.

-size : 파일 크기

-atime : 날짜


8. GREP


: 파일 내에서 또는 입력 값으로부터 특정 패턴 검색


grep [op] 표현 [파일]


-v : 일치되는 내용이 없는 라인을 표시한다.

-c : 일치되는 내용이 있는 행의 개수

-n : 일치되는 내용이 있는 행은 행 번호화 함께 표시


9. PIPE


:프로그램의 실행결과를 다른 프로그램의 입력으로 연결.


ex) ps -ef | grep sshd


10. REDIRECTION


: 리다이렉션을 이용하면 명령의 출력을 변경할 수 있다. default는 터미널(stdout)이지만, 리다이렉션을 이용하면 파일에 기록할 수 있다.


명령어 > 파일 : 파일이 없으면 생성, 있다면 기존의 내용을 지운다.

명령어 >> 파일 : 파일이 없으면 생성, 있다면 기존의 내용에 추가

명령어 < 파일 : 파일에서 표준 입력을 받는다


echo "문자열" : 주어진 문장을 터미널에 출력시킨다.

sort : 입력을 순서대로 정렬하는 명령어



11. chown


: 파일 소유자나 소유그룹을 변경하기 위한 명령어


chmod [op] 소유자:소유그룹 파일명

 

-R : 경로와 그 하위 파일들을 모두 변경



파일 압축 관리


1. tar


:기본적으로 압축을 하지 않고 묶어 주는 역할(아카이브)을 한다.


tar [op] 생성파일.tar 묶을 파일   : 묶을 때


tar [op] 파일.tar   : 해제시


-c : 새 저장 파일을 만든다.

-x : 묶인 파일을 해제한다

-v : 퍼리 중인 파일을 자세하게 보여준다.

-f : 파일을 지정한다

-z : gzip을 해제 또는 압축한다.

-j : bz2 압축 또는 해제


tar는 기본적으로 압축이 아닌 파일을 묶어주는 역할만 하게 된다. 때문에 10개의 파일을 tar파일로 생성한다 해서 크기가 줄어들거나 하지 않는다. 


2. gzip


: 파일 압축을 한다


gzip [op] 파일 : 파일을 압축한다.


-d : 압축 해제


'Programming > 리눅스' 카테고리의 다른 글

Linux admin 2일차  (0) 2018.11.19
Linux Admin 1일차  (0) 2018.11.16
아카이브를 받을 수 없습니다.  (0) 2018.03.09
리눅스 기본 명령어 정리  (0) 2018.01.17
[리눅스/CentOS7] 싱글 모드 진입하기  (0) 2017.08.14
[리눅스]한글이 안 써질 때  (0) 2017.08.13

리눅스 소개


  1. 무료
  2. POSIX(Portable Operating System Interface)와 100퍼센트 호환
  3. 서버 환경 뿐망 아니라 데스크톱, 임베디드, 안드로이드와 같은 스마트폰과 스마트 TV 등에 포팅되어 운영되고 있는 광범위하고 다양한 시스템에 이용되고 있다. ( 다양한 컴파일러를 가지고 있기 때문에 소스코드만 있다면 지원하고 있는 컴파이러를 이용하여 컴파일 가능)
  4. Unix 운영체제의 특징을 모두 가지고 있다.( 멀티 유저, 멀티 프로세스, 멀티 프로세서, 멀티 스레드)
  5. 여러 사용자가 하나의 시스템을 사용하기 때문에 계정과 비밀번호 그리고 홈 디렉토리로 사용자를 구분 하며 계정별 권한과 제약을 두어 시스템 보안을 제공.

리눅스는 크게 커널과 사용자 계층으로 나누어 생각할 수 있다.

커널

  1. 실제 운영체제를 구성하는 핵심 부분
  2. 메모리나 프로세스 등의 하드웨어를 관리
  3. 응용프로그램이 커널을 이용할 수 있도록 시스템 호출과 같은 API를 제공. 이 공통된 명령어 집합 -> 드바이스 드라이버


사용자 모드


  1. 응용 프로그램들이 위치하는 영역
  2. 시스템 콜을 호출하기 위한 시스템 라이브러리와 네트워크 통신을 위한 socket 라이브러리 등 다양한 라이브러리를 제공하고 응용 프로그램을 위한 컴파일러를 제공한다.
  3. 사용자는 이러한 프로그램을 쉘(Shell)을 통해 실행할 수 있다.

쉘(Shell) : 커널 외부에서 사용자와 커널 사이의 인터페이스를 제공하는 프로그램

사용자가 입력한 명령어를 해석하고 실행 시킨다(쉘 스크립트)

기본적으로 csh, bsh, bash 등의 쉘 프로그램을 지원하고 사용자는 필요 따라 shell을 바꿀 수 있다.


리눅스 기본 관리



-인스톨 디스크의 파티션


일반적으로 리눅스를 설치할 디스크에 파티션을 나눠서 사용한다.


 파티션

포맷 및 마운트 디렉토리 

 부트 파티션

 ext3, ext4, xfs 파일 시스템으로 포맷.  /boot 디렉토리로 사용 

 루트 파티션 

 ext3, ext4, xfs 파일 시스템으로 포맷.  / 디렉토리로 사용

  swap 파티션 

 swap 영역으로 포맷

 kdump

 ext3, ext4, xfs 파일 시스템으로 포맷.  마운트 x

 데이터용 

 애플리케이션 데이터영역으로 사용


부트 파티션은 커널과 초기 RAM 디스크를 포함.

루트 파티션은 인스톨 예정의 RPM  패키지와 애플리케이션 소프트웨어를 인스톨 할 수 있는 정도의 사이즈가 필요

swap 영역은 RHEL에서 추천하는 다음 계산을 따른다.

메모리가 2GB 이하 : 물리 메모리의 2배

메모리가 2GB 이상 : 물리 메모리 + 2GB

kdump는 물리 메모리 사이즈의 2~3배 정도

데이터용 파티션은 애플리케이션 데이터 영역으로 운용 중에 데이터가 계속 증가할 영역으로 따로 파티션을 잡아두는 것이 좋다.


-기본 개념들

런레벨 : 

- 리눅스는 시스템이 기동될 때 런레벨 값을 참조한다.

- 일반적으로 서버를 운용할 때는 3 또는 5를 지정

- 보통 서버에서는 GUI가 필요가 없기 때문에 3를 지정하는 것이 보통


런레벨  0 : 시스템 정지

    1 : 싱글 유저 모드로 기동 (시스템 복구시 사용)

    2 : 멀티 유저 (네트워크를 사용하지 않는 텍스트 멀티 유저모드)

    3 : 멀티 유저 (일반적인 쉘 기반의 텍스트 멀티 유저 모드)

    4 : 사용하지 않음

    5 : GUI 멀티 유저 모드 (x-window)

    6 : 시스템 재기동


 CRON : 

-시스템 운영에 필요한 일상적이고 주기적인 작업을 지정된 시간에 반복적으로 수행하기 위한 목적

- crond라는 데몬으로 작동하며, 기본적으로 작동하도록 설정되어있음.

- /etc/crontab 이라는 설정 파일과 /etc 아래에 cron.* 로 구성되있다.


로그인 스크립트 :

- 로그인을 하게 되면 몇 가지 설정 스크립트가 실행되고 계정의 환경을 설정하게 된다.

- /etc/profile -> ~/.bash_profile -> ~./bashrc -> /etc/bashrc 순으로 실행된다.


마운트 :

- 특정 디바이스를 사용하기 위해 하드웨어와 디렉토리를 연결하는 작업


원격 터미널 :

- 가상 터미널이라는 장점을 고스란히 제공하면서 네트워크상의 어떤 컴퓨터에서도 접속할 수 있다.

- 보안상 telnet보다 ssh를 많이 사용한다.

SSH : 

설정 -> [http://programmingskills.net/archives/315 ]


별첨

- samba server

- editer : vi, gedit, 자기가 펴한 에디터

'Programming > 리눅스' 카테고리의 다른 글

Linux admin 2일차  (0) 2018.11.19
Linux Admin 1일차  (0) 2018.11.16
아카이브를 받을 수 없습니다.  (0) 2018.03.09
리눅스 기본 명령어 정리  (0) 2018.01.17
[리눅스/CentOS7] 싱글 모드 진입하기  (0) 2017.08.14
[리눅스]한글이 안 써질 때  (0) 2017.08.13

N+1 Selects 문제


N+1 문제란 ?

조회를 위해 select 쿼리(1번)를 날렸다가 관련 컬럼을 얻기 위해 N번의 셀렉트(N번)를 하게 되는 상황.


같은 결과를 낼지라도, 그 쿼리를 수행하는데에 있어 몇 번의 쿼리를 해야하는지에 따라 성능이 달라진다.


마이바티스의 association에서 Nested Select, Nested Results를 예로 들 수 있다.


Nested Select 는 결과에서 다시 한번 참조를 하기 위해 다음 Select구문을 실행하는 것을 말하고, Nested Results는 조인된 결과물에 대해 반복적으로 사용하여 결과를 맵핑하는 방법을 말한다. 


예시를 보도록 하겠다. (참고 : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html#insert_update_and_delete)



위에서 만약 블로그와 저자와의 관계가 (1:N) 상황이라면 N+1의 셀렉트가 발생하게 된다. 각각의 author_id를 위해 셀렉트를 실행한다



하지만 위와 같이 조인된 결과에 대하여 맵핑을 하게 되면 위와 같이 N+1번의 호출이 일어나지 않게 된다.



MyBatis Insert not working



insert 구문을 계속 실행시켰지만 데이터베이스에 적용도 안되고 오류도 안나기에 무엇이 잘못된지 한참 찾아다녔다


결론적으로 SqlSession을 commit()시켜주니 적용이 되었는데, 당연히 JDBC처럼 auto commit이 되어있을 거란 생각을 했었다..


궁금해서 코드를 따라가보니 일단 SqlSessionFactory는 DefaultSqlSessionFactory였고,



이 팩토리의 opensession(boolean autoCommit)부분을 쭈욱 따라가보니 DefaultSqlSession에서 autoCommit이 설정안되있다는 것을 알게되었다. 

 


autoCommit을 설정하고 싶다면 다음과 같이 sqlSession을 생성할 때 true로 설정해야한다




+ Recent posts