우선 내가 사용하는 있는 환경은 IDEA(Intellij) 이다. Vim을 사용하면 마우스를 사용하지 않고 코딩을 할수있게 되는데 이에 관련된 설정을 공유하고자 한다.
VIM의 장점을 설명하자면 진짜 익숙해지면 마우스 못쓴다. 온갖 핑계를 대면서 다른환경에서도 VIM을 깔고있는 자신을 보게된다.(이것만으로 장점을 설명해준거 같다.)
설치
우선 IDEA Plugin에 들어가서 VIM을 검색해 IDeaVim을 설치한다. 여기서 필자는 밑에 Extension이라는 것을 추가로 설치하였는데. esc키를 눌렀을때 자동으로 영어로 바꿔준다. (설정이 필요함 아래에서 설명)
노말모드 (움직이는 모드) 영어로만 유지하는 설정
let keep_input_source_in_normal=ABC
set keep-english-in-normal
사용법
우선 VIM에대한 설명은 다른 블로그에서도 많이 찾아볼수 있기 때문에 추가로 설명하지는 않을것이다.
아래는 intellij에서 ideaVim을 사용할때 추가로 설정해줄수 있는 것인데
밑에 V모양을 클릭하여 이동한다.
위에 스크린샷을 따라가면 설정을 할수있다.
"" Source your .vimrc
"source ~/.vimrc
" english auto change
let keep_input_source_in_normal=ABC
set keep-english-in-normal
" set keep-english-in-normal-and-restore-in-insert
let mapleader=" " "스페이스바로 leader키를 사용할수있게한다.
set ignorecase
set smartcase
set visualbell
set number relativenumber
" set noerrorbells
set expandtab
set autoindent
set hlsearch
set incsearch
set ideajoin
set mouse=a
set idearefactormode=keep
set mousefocus
set scollfocus
set scrolloff=3
set highlightedyank
" 3 lines above/below cursor when scrolling
set NERDTree
" set surround
set multiple-cursors
" set easymotion
" set quickscope
" essential
noremap H ^ "이부분은 초보자세팅을하면 삭제해야됩니다.
noremap L $ "이부분은 초보자세팅을 사용하면 삭제해야합니다.
" toggle sidebar
nmap <C-e> :NERDTreeFocus<cr>
" These create newlines like o and O but stay in normal mode
" zen mode
noremap <leader>kz :action ToggleZenMode<CR>
" Quit visual mode
" nnoremap k kzz "커서가 중간에 위치하게한다.
" nnoremap j jzz "위와 동일
nnoremap <leader>y "+y "운영체제에 clipboard에 카피한다.
nnoremap <leader>p "+p "운영체제에 clipboard를 paste한다.
vnoremap <leader>y "+y
nnoremap Y y$
vnoremap v <Esc>
nnoremap <esc> :noh<cr>:w<cr><esc> "esc 키를 누르면 저장과 하이라이트된 단어를 취소시킨다.
inoremap <Esc> <Esc>:w<CR>
" nnoremap jk :noh<cr>:w<cr><esc>
inoremap jk <esc>:w<CR>
inoremap ㅓㅏ <esc>:w<CR>
" nnoremap ㅓㅏ :noh<cr>:w<cr><esc>
" Tab operation
nnoremap <leader>l gt "열려 있는 파일을 이동한다.
nnoremap <leader>h gT "열려 있는 파일을 이동한다.
" mehotd up
nmap [[ <Action>(MethodUp)
nmap ]] <Action>(MethodDown)
" goto Error and Declaration 이것들은 거의 필수와 마찬가지다 정의된 코드로 이동하는 명령어다."
nmap gb <Action>(Back)
nmap gD <Action>(GotoTypeDeclaration)
nmap gf <Action>(Forward)
nmap gl <Action>(QuickJavaDoc)
nmap gL <Action>(QuickImplementations)
nmap gy <Action>(ShowErrorDescription)
nmap gn <Action>(GotoNextError)
nmap gp <Action>(GotoPreviousError)
nmap <TAB> <Action>(GotoNextError)
nmap <S-TAB> <Action>(GotoPreviousError)
"Editor indent"
nmap > <S-v>:action EditorIndentSelection<cr>
nmap < <S-v>:action EditorUnindentSelection<cr>
vmap > <Action>(EditorIndentSelection)
vmap < <Action>(EditorUnindentSelection)
" moving row"
nnoremap <C-j> :m +1<CR>
nnoremap <C-k> :m -2<CR>
inoremap <C-j> <Esc>:m +1<CR>gi
inoremap <C-k> <Esc>:m -2<CR>gi
vnoremap <C-j> :action MoveStatementDown<CR>
vnoremap <C-k> :action MoveStatementUp<CR>
" Refactorings
map <leader>t <Action>(Refactorings.QuickListPopupAction)
map Tr <Action>(RenameElement)
" SurroundWith
map Ts <Action>(SurroundWith)
" VSC Popup
nmap Tv <Action>(Vcs.QuickListPopupAction)
" Inspectiom
nmap Ti <Action>(InspectCode)
map Ta <Action>(AnalyzeActionsPopup)
nmap To <Action>(OptimiziImports)
" Closing tabs
nmap <leader>q :action CloseContent<cr>
nmap <leader>Q :action CloseAllEditorsButActive<cr>
" edit ideavim config
nnoremap <leader>vv :e ~/.ideavimrc<CR>
nnoremap <leader>vr :source ~/.ideavimrc<CR>
" code Run & Debug
nmap <leader>r :action Run<cr>
nmap <leader>d :Debug<cr>
" Navigation
nmap <leader>L :action RecentLocations<cr>
" nmap <leader>g :action GotoDeclaration<cr>
nmap <leader>i :action GotoImplementation<cr>
nmap <leader>u :action FindUsages<cr>
nmap <leader>f :action GotoFile<cr>
nmap <leader>c :action GotoClass<cr>
nmap <leader>s :action GotoSymbol<cr>
nmap <leader>; :action FileStructurePopup<cr>
nmap <leader>I :action SelectIn<cr>
nmap <leader>e :action RecentFiles<cr>
nmap <leader>b :action ShowBookmarks<cr>
nmap <C-Enter> :action Generate<cr>
imap <C-Enter> :action Generate<cr>
" multi Cursor
map <C-N> <A-N>
map <C-P> <A-P>
map <C-X> <A-X>
map g<C-N> <Action>(SelectAllOccurrences)
입문자들을 위한 추천세팅
원래 VIM은 hjkl키로 이동을 할수있다. 하지만 익숙치 않으면 이게 더 복잡하고 어렵다.
이 설정을 하면 이렇게 움직일수 있다 (호호)
이것을 설정으로 보통 키보드의 방향키와 비슷하게 바꿀수있다. 하지만 조금 달라지는부분이 있어 숙지하고 넘어가야 나중에 viw등을 봤을때 헷갈리지 않고 사용할수있다.
"아래의 코드를 에세셜에 넣어주면 ijkl로 매핑을해 사용할수있다.
noremap j h
noremap i k
noremap k j
noremap h i
noremap J ^
noremap L $
noremap H I
" 맨위 이동 맨 아래 이동
nmap I gg
nmap K G
vmap I gg
vmap K G
중요 !!
원래 VIM에서 Insert모드에 들어가기위해선 i를 사용한다.
우리가한매핑방식은 i키를 움직이는 키로 변경했기 때문에 해당 i를 대체할 키가 필요한데 이 설정파일에서는 i 를 h 로 변경하였다.
그래서 나중에 viw(단어선택) diw(단어삭제) 를 하기위해선 i 가 h 로 바뀐걸 인식하고 vhw, dhw로 사용하여야 한다.
그래서 해당 일들을 해주는 프론트 컨트롤러 패턴을 고안해냈다(선배 개발자들이) 프론트 컨트롤러 패턴을 하면 좋은점은 웹환경에 종속적이지 않고 순수한 JAVA POJO코드로 컨트롤러를 만들수 있다 . (이는 곧 서블릿이 아니여도 된다는 소리와 같다.)
DispatcherServlet
스프링은 프론트 컨트롤러가 있는데 이것은 DispatcherServlet이라고 한다.
해당 프론트 컨트롤러가 하는 일은 아래와 같다.
요청을 분석한다.
핸들러 매핑에게 위임하여 요청을 처리할 핸들러를 찾는다.
해당 핸들러(컨트롤러)를 실행할수 있는 핸들러 어댑터를 찾는다.
찾아낸 핸들러 어댑터를 사용해서 컨트롤러로 요청과 응답을 처리한다.
DispatcherServlet은 ViewResolver를 통해 View를 생성한다.
DispatcherSerlvet은 View를 통해 요청결과를 생성 및 반환한다.
부가적으로 컨트롤러 실행중에 예외가 발생했다면, 예외처리 핸들러에게 요청처리를 위임한다.
핸들러 매핑
핸들러 매핑은 HTTP 요청정보를 이용해서 이를 처리할 핸들러 오브젝트, 즉 컨트롤러를 찾아주는 기능을 가진 DispatcherServlet의 전략이다.
핸들러 매핑은 컨트롤러의 타입과는 상관없다. 하나의 핸들러 매핑 전략이 여러가지 타입의 컨트롤러를 선택할 수 있다는 뜻이다. (이와 관련된 내용은 핸들러 어댑터에서 다루겠다)
핸들러 인터셉터
핸들러 매핑의 역할은 기본적으로 URL과 요청정보로부터 컨트롤러 빈을 찾아주는 것이다. 한 가지 더 중요한 기능중 핸들러 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 역할인 인터셉터의 실행 체인을 돌려준다.
핸들러 어댑터
dispatcherServlet이 가지는 무한한 확장성의 비결
핸들러 매핑이 끝났다면 DispatcherServlet이 어떤 컨트롤러의 메소드를 실행할지 알고있어야 한다. 그렇다면 dispatcherServlet은 호출 가능한 컨트롤러는 특정 인터페이스를 구현해야 한다는 식의 규약을 따라서 작성해야 할까?
그건 아니다. 핸들러 어댑터를 이용하면 된다. 전형적인 오브젝트 어댑터 패턴을 사용해서, 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출하는것이다. 그러면 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을수 있다.
뷰 리졸버
컨트롤러가 어떤 식으로든 다시 DispatcherServlet에 돌려줘야할 두가지 정보가 있는데 그중 하나가 모델이고 하나가 뷰다. 컨트롤러가 직접 뷰 오브젝트를 리턴할수 있지만, 보통은 DispatcherServlet의 전략이 viewResolver를 통해 뷰 오브젝트를 리턴해준다.
이렇게 되면 View는 어떤 모델을 받아서 Table로 보여주든 Excel로 보여주든 html로 보여주든 자기 입맛대로 할수있다.
핸들러 예외 리졸버
컨트롤러의 작업 중에 발생한 예외를 어떻게 처리할지 결정하는 전략이다.
web.xml에 를 지정해서 에러 안내페이지를 보여줄 수도 있다. 그런데 핸들러 예외 리졸버가 등록되어 있다면 DispatcherServlet은 먼저 예외 리졸버에게 해당 예외를 처리 할수 있는지 확인한다. 핸들러 예외 리졸버가 있다면 예외는 DispatcherServlet 밖으로 던지지 않고 해당 핸들러 예외 리졸버가 처리한다.
작성하면서 정리를 하는데도 아직도 혼란스럽습니다.. 혹시 지적해줄곳이 있으시면 꼭 댓글로 알려주시면 감사하겠습니다.
운영체제 : 컴퓨터의 구성요소, 자원을 관리 및 운영하는 시스템소프트웨어의 구조 및 기능 쉬운말로 정의하자면 사용자나 응용 프로그램이 컴퓨터 자원을 쉽게 사용할 수 있는 인터페이스를 제공하여 컴퓨터 자원을 보호하고 자원을 사용, 결과를 돌려주는 시스템 소프트웨어이다.
운영체제의 정의
자원 관리
사용자는 자원을 직접 접근 불가능하게 만들어서 자원을 보호한다.
인터페이스 환경 제공
컴퓨터의 성능 향상
보안 업데이트 등
운영체제는 관리자(supervisor)
실행중인 프로그램 관리, 메모리 관리, 파일과 디스크 장치 관리, 입출력 장치 관리, 사용자 계정 등
운영체제는 소프트웨어(software)
커널이라고 불리는 핵심 코드와 UI/도구 프로그램들, 장치를 제어하는 디바이스 드라이버들로 구성한다.
그래서 운영체제는 컴퓨터 하드웨어나 응용소프트웨어 등 자원 관리를 목적으로 사용한다. 프로세스, 메모리, 파일 시스템, 입출력 장치 등 자원 관리와 사용자 관리를한다.
컴퓨터 자원이란
CPU 시간, 메모리 공간, 파일 저장 공간, 입출력장치 등
다시 말하면 컴퓨터 하드웨어
하드웨어 자원 – CPU, 캐시나 메모리, 키보드, 마우스, 디스플레이, 하드 디스크, 프린터 등
소프트웨어 자원 - 응용프로그램
데이터 자원 - 파일, 데이터베이스 등
🍀 운영체제의 역할
위에 정의에서 간단하게 설명했듯 운영체제는 컴퓨터 자원을 관리하고, 또 사용자로부터 컴퓨터 자원을 직접 접근하는것을 보호해준다.
자원관리
응용 프로그램 및 사용자에게 컴퓨터 자원(하드웨 어)을 할당하여 작업 할 수 있도록 함
자원을 요청한 프로그램이 여러 개라면 적당한 순서로 자원을 배분하고 적절한 시점에 자원을 회수 하여 다른 응용 프로그램에 할당
운영체제는 자원에 대한 독점(exclusive) 권한 소유
자원에 대한 모든 관리 권한은 운영체제에게 있음
자원 할당, 자원 공유, 자원 액세스, 자원 입출력 등
자원보호
비정상적인 작업으로부터 컴퓨터 자원을 보호한다.
운영체제는 사용자가 실행하는 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 자원을 운영체제가 보호하지 않는다면 프로그램들이 CPU,메모리,하드 디스크 등 자원에 마음대로 접근하고 조작한다면 자원의 질서가 무질서하게 관리가 될것이고 이는 큰 버그가 될것이다.
그래서 운영체제는 자원에 대한 접근을 오직 자신을 통해서만 접근하도록 자원을 보호한다. 이러한 과정을 운영체제의 핵심인 커널에서 실행하는데 이는 다음 포스트에서 다루겠다.
하드웨어 인터페이스 제공
CPU, 메모리, 키보드, 마우스와 같은 하드웨어를 사용자가 일관된 방법으로 사용할 수 있도록 하드웨어 인터페이스 제공