자바칩
[F-Lab] 3주차 멘토링 본문
채용 공고로 좋은 기업(서비스 기업)인지 판단하는 법
1. 기술스택
2. 대표, 경영진 경력
3. 매출, 당기 순이익
4. CTO 존재 여부
5. 블라인드, 잡플래닛 등 기업 최근 리뷰 (3점~3.3점이 넘어가면 괜찮음)
1. 쓰레드와 프로세스의 차이점은? 메모리 공유 관점에서 가장 큰 차이점은?
우리가 쓰레드를 쓰면 프로세스를 쓸 때보다 좀 더 신경을 많이 써야 되는데 왜일까? 공부를 해보자.
컨텍스트 스위칭이라는 단어에 대해서 아는가?
컨텍스트 스위칭이라는 것이 맨 처음에 왜 나왔을까? 왜 컨텍스트 스위칭을 해야 하는가?
하나의 CPU에서는 몇 개 프로세스가 돌 수 있는가?
하나의 코어를 갖고 있는데 여러개의 프로세스를 동시에 돌리려고 시도를 했다. 그러면 어떻게 해야 하는가?
그래서 컨텍스트 스위칭이라는 얘기는 정리하면 뭐라고 하는 것인가?
작업을 바꾸는 것은 왜다? 하나의 CPU에서 한 시점에는 하나의 프로세스밖에 못 돌기 때문이다.
그래서 이걸 그러면 어떻게 여러개를 돌리지 라고 생각하다 보니까 프로세스를 바꿔가면서 빨리 바꿔치기를 하면 마치 동시에 동작하는 것처럼 보일 것 같다는 데에서 시작을 한 것이다.
프로세스가 맨 처음에 딱 실행해야지 하고 올라갈 때 CPU뿐만 아니라 레지스터같은 것들을 다 쓰고 있었다. 그런데 갑자기 다른 프로세스로 바꿔야 하면 엄청난 일이다. 마치 집이 하나 있는데 이 집을 여러 명이 나눠 쓰는 것이다. 내가 들어가서 살고 있었는데 이걸 한 번에 여러명이 쓰겠다고 그 다음 사람이 들어가야 되는 상황이면 내 짐을 다 빼야 한다. 그래서 다 빼서 나갔다가 다시 내가 써야지 하고 다시 들어오고 그래서 컨텍스트 스위칭은 프로세스가 전환될 때 필요한 그런 류의 작업들 이전 프로세스가 볼 때 셋업했던 것들을 다 어딘가에 저장해 놨다가 나중에 내가 다시 돌아왔을 때 팔렸다가 이런 엄청난 작업을 해야 한다. 동시에 보이게 만들기 위해서.
대다수의 발전 과정은 하드웨어는 제한돼 있는데 이걸 갖고 너무 많은 일을 하려고 하다 보니 그걸 어떻게 할지에 대해서 생각하면서 프로세스 개념, 쓰레드 개념이 나온 것이다.
하나 이상의 프로세스가 동시에 실행되는 것 처럼 보이게 하는 것은 개념이 아니라 "현상"이다.
컨텍스트가 무엇인가?
프로세스가 CPU를 쓰면서 만들어낸 어떤 여러 가지 상황의 문맥. 프로세스가 CPU를 쓰기 위해서 만들어놓은 그 시점의 상황이다.
그 집을 쓰려고 들어가가지고 안에다가 가구도 놓고 다 해놓은 상황이 나의 컨텍스트 인것이다.
그런데 다른 사람이 오려고 하면 그 사람의 자기 컨텍스트가 있을 것이다. 그 컨텍스트를 바꾸는 것이 컨텍스트 스위칭이다. 하나의 프로세스가 쓰고 있던 CPU의 어떤 상황을 다른 프로세스랑 바꿔주는 것이다. 그렇게 함으로써 프로세스가 하나만 일을 할 수 있는데 동시에 여러 개의 프로세스가 일시적으로 이렇게 공간 CPU를 빌려가면서 쓰는 것이다. 프로세스가 CPU를 쓰기 위해 설정되어 있던 하드웨어적인 메모리 저장되어 있던 것들을 다 들고 빠져야 한다. 나중에 내가 올 때 다시 올려야 하고 그럼 여기서도 딱 봐서 알겠지만 얼마나 힘들겠냐. 뭔가 가구를 많이 넣으면 넣을수록 짐을 빼기 힘든 것처럼 프로세스는 방을 빼기 힘든 것이다. 그러니까 느리다.
그래서 생각해낸 개념이 프로세스보다 더 가벼운 쓰레드이다. 프로세스를 여러 개 띄워서 돌리는 건 컨텍스트 스위칭 비용이 너무 높다. 격리되어 있고 완전 독립적이니까. 그러면 적어도 하나의 프로세스 안에서 비슷한 컨텍스트를 최대한 공유하게 만들고 안 똑같은 것들만 빌려가면서 하면 어떨까라는 어떤 분이 상상을 했을 것이다. 그래서 쓰레드는 경량 프로세스라고도 한다.
그러면 쓰레드들끼리는 어떤 것들 때문에 프로세스보다 더 가볍다고 하는가?
프로세스와 프로세스 간에는 메모리를 공유할 수가 없다. 예외적인 경우를 제외하고 실질적으로는 프로세스와 프로세스는 전혀 다른 공간을 가지고 동작하는 애기 때문에 메모리라든가 어떤 컨텍스트를 공유할 수 없다. 그러니까 아까 얘기했다시피 집에 있는 가구를 다 빼야 하니까 컨텍스트 스위칭이 일어날 때 부담이 있는 것이다.
쓰레드는 어떨까? 쓰레드는 프로세스 안에 있기 때문에 프로세스의 컨텍스트를 공유할 수 있다. 쓰레드들끼리 전환할 때는 컨텍스트 스위칭이 쓰레드에도 있긴 있으나 훨씬 가벼울 것이다. 예를 들면 프로세스는 집에서 모든 방에 있는 가구를 다 빼는 것이고, 쓰레드는 자기가 쓰는 방에 있는 가구만 빼는 것이다. 그래서 훨씬 가볍다.
프로세스를 시분할하면서 여러 개 띄울 수는 있다. 그런데 쓰레드는 작기 때문에 훨씬 많이 띄울 수 있다.
프로세스와 쓰레드의 차이를 많이 물어볼 것이다.
쓰레드가 장점은 가볍고 동시성을 제공하긴 하지만 단점도 있다. 단점이 무엇일까?
쓰레드는 무엇을 같이 쓴다고 했는가? 메모리와 같은 컨텍스트를 같이 공유한다.
자원을 공유해서 여러 개가 동시에 쓰면 무슨 일이 생기는가?
동기화 문제가 발생한다. 내가 얘를 쓰고 있을 때 딴 놈도 쓰려고 그러면 막 바뀌고 쓰레드를 쓰게 되면 이걸 잘 처리하는 것이 어렵다. 빠르게 처리하고 남들하고 공유해서 빠른 대신에 남들하고 같이 쓰니까 이것에 대한 처리를 잘 해줘야 한다. 그래서 쓰레드 프로그래밍이 어렵다. 그래서 이것을 그동안 많이 발전시켜왔는데 이제 요즘은 위에 있는 라이브러리가 쌓아놓아서 되게 편하게 쓸 수 있게 해서 요즘은 잘 모르고 쓰는데 어쨌든 내부에는 다 이런 기반 개념들이 동작하고 있다.
synchronized 키워드에 대해 잠깐 얘기를 했는데 이것의 이슈가 무엇인가?
한 번에 하나의 쓰레드만 돌게 막아버리는 것이다. 그러니까 이제 기다렸다가 돌고 기다렸다가 돌고 이래야 되다 보니까 좀 느려지는 문제가 많이 생긴다. 원래는 동시에 여러 개가 막 돌아줘야 하는데. 그래서 가능하면 쓰레드를 쓰지 말라고 하는 것이다. 필요해서 만들었지만 그걸 쓰면 한 번에 하나씩만 동작하니까 느리다.
2. Serialization에 대해서 그냥 알아만 두면 될 것 같은데 시리얼라이제이션이 무엇인지 아는가?
Serializable 인터페이스 얘가 뭘 하려고 만들어 놓은 것인가? 객체를 저장하거나 다른 서버로 전송하기 위해서 만든 것인데 그러면 어떤 식으로 전송될까? 네트워크 통신을 하려면 어떤 식으로 처리가 돼야 할까? 우리가 프로그램을 저장을 하든가 아니면 어디다가 보내야 한다든가 할 때는 네트워크 통신을 할 수 있게 하기 위한 뭔가 처리 혹은 암호화된 어떤 형식을 만들어가지고 전송을 해준다. 이것을 시리얼라이제이션 한다고 한다.
예를 들면 클래스가 있으면 클래스도 다른 서버에 전송을 하려면 전송을 할 수 있게 만드는 형태의 포맷으로 시리얼라이제이션을 해야 되는 것이다. 그래서 시리얼라이제이션을 하게 만드는 걸 지원하는 게 자바의 시리얼라이저블 인터페이스이다. 그래서 이 클래스는 시리얼라이제이션할 수 있어요라고 이제 세팅을 하고 얘가 구현하라고 하는 함수를 구현하는 것이다. 그러면 시리얼라이제이션을 해야 할 때 이 함수를 호출해서 시리얼라이제이션을 하는 건데 최근에는 많이 하지 않는다. 시리얼라이저블 인터페이스를 아는게 중요한 게 아니라 시리얼라이제이션이 뭔지 왜 필요한지에 대해서 아는 게 더 중요하다.
요즘은 대부분 시리얼라이제이션을 기존의 시리얼라이저블은 자바 내에서 자기들이 어떤 규칙을 만들어가지고 클래스를 막 좀 이렇게 전송하기 좋은 바이너리 형태로 만들어가지고 보내면 얘가 디시리얼라이즈 그러니까 이 바이너리로 된 걸풀어가지고 클래스처럼 객체를 만들어가지고 쓸 수 있게 해줬었다. 그래서 이제 사람이 볼 수 있는 형태가 아니었다. 근데 최근에는 그렇게 하지 않고 JSON과 같이 사람이 볼 수 있는 어떤 형태의 도큐먼트 타입으로 변환해서 시리얼라이제이션하고 걔를 이제 전송해서 이제 클래스를 사용하고 이런 식으로 하기 때문에 요즘은 저 시리얼라이저블을 쓰지 않는다.
피드백
개념을 학습할 때 외부적인 것만 이해하는 형태로 그러니까 예를 들면 아까도 컨텍스트 스위칭이 뭐죠? 여러 개가 동시에 동작하는 것처럼 보이게 만드는 것이다.는 컨텍스트 스위칭에 대한 개념이 아니라 컨텍스트 스위칭을 함으로 인해서 발생하는 효과이다. 그리고 지금 같은 경우도 시리얼라이제이션이 뭐죠 라고 물어보면 이게 직렬화가 뭐죠 라고 물어보면 자바의 시리얼라이저블을 활용한 방법이다.라고 말했는데 이것도 사실은 되게 방법인 것이지 개념이 아니다. 그래서 학습을 할 때 좀 더 개념적으로 이해하기 위해서 노력을 하는 것이 필요하다. 그러니까 예를 들면 아까도 아까 그걸 아는 게 잘못됐다는 것이 아니라 만약에 그러면 이거 왜 하는 거지? 한 번만 더 들어가면 그럼 시리얼라이제이션이 뭔지를 한 번 찾아보게 될 것이고, 또 오 시리얼라이제이션이라는 단어가 있네. 그럼 한번 더 들어가면 이 개념이구나 까지는 가야 잘못된 대답을 하지 않는다. 아까 듣기에 따라서는 잘못된 답변이라고 느낄 수도 있다. 완전 피상적인 답변이니까. 그래서 이 부분은 학습할 때 좀 신경을 써야 한다. 그래서 예를 들면 컨텍스트 스위칭이 나왔으면 그냥 정의 자체를 한 번 찾아보는 것이다. 그러면 바로 알 수 있다. 그리고 시리얼라이제이션 직영화 얘기 나오면 한번 쳐보는 것이다. 책에 설명이 없더라고 직렬화 이렇게 검색하면 개념이 설명된 글들이 엄청 많다. 그걸 한번 보고 자바에서는 그럼 이걸 어떻게 지원하느냐로 접근하는게 되게 중요하다. 그렇게 이해하는 것이 좀 습관화가 되어야 될 것 같다.
API랑 코드 자체가 얼마만큼 백엔드 개발자로서 기본적인 것들을 담고 있는지 테스트 코드 이런 것들이 메인이다.
이런 것들 다 하면서도 프로젝트가 조금 더 제대로 사용성 있게 보여주고 싶다 이러면 이제 프론트엔드(FE)에 시간을 투자해줘도 상관없다.
프로젝트로 신입들이 하는 것은 프로젝트로 뭔가 내가 대단한 걸 만들기보다는 실습 같은 느낌이라고 보면 된다.
원래 책으로만 학습하면 머리에 잘 안남기도 하고 코드 보면서 이야기하기 어려우니까 프로젝트를 하는 것이다.
뭐가 더 중요하고 안중요하고는 본인의 상황에 따라 다르겠지만 지금은 일단은 책을 더 많이 보고 책에 있는 것을 프로젝트에 적용해야 하는 상황이니 책을 좀 더 많이 읽어봐도 될 것 같다. 만약에 시간을 제한적으로 써야 한다면. 그런데 이제 프로젝트는 멘티가 하기 나름이다.
메인 페이지 그림 하나로는 감이 잘 안온다. 이런 느낌으로 몇 장 더 그려보기.
사람들이 겪는 뷰를 러프하게 그려주면 될 것 같다. (관리자, 일반 사용자 화면 나누기)
로그인 페이지, 마이 페이지 같은 그림들
깃허브 리드미(read.md)에 요구사항 정리하기
현업에서는 피그마라는 툴 사용함. 디자이너도 사용함.
신입이니까 이런 툴이라도 써봤다 하면 좀 더 뭔가 다른 사람과 차별화될 수 있지 않을까.
시간이 너무 오래 걸릴 것 같으면 노트에다가 그려서 찍어도 상관없다. 그냥 참고만 해라. 무료 소프트웨어이다.
지원 회사 20~30개 작성
시간 관리 - 구글 캘린더, 뽀모도로, 불랫저널 같은 방법론 한번 적용 해보면 좋음
'F-Lab' 카테고리의 다른 글
[F-Lab] Java Backend 멘토링 2개월 후기 (1) | 2024.07.27 |
---|---|
[F-Lab] 2주차 멘토링 (2) | 2024.06.02 |
[F-Lab] 1주차 멘토링 (0) | 2024.06.02 |