본문 바로가기

공부방

(97)
네트워크 시작하며 제가 전공 신입생 시절 컴퓨터 공학을 어떻게 공부해야 할지 검색을 하면 홍보성 학원 강의만 나왔습니다. 개발자가 되기 위해서 컴퓨터 공학의 기초 과목이 중요하다고 하는데 어떻게 공부해야할지 막연하게 교보문고에서, 해외 자료를 찾아가면서 공부하였습니다. 학부에서 공부 잘하는 분들은 교수님의 설명을 스펀지처럼 흡수하는 분들이기에 부족한 저로서는 막연하게 부러워하고 있었습니다. 아무도 공부자료, 공부방법에 대해서 알려주지 않아서 4학년이 올라가면서 [컴퓨터 공학] 어떻게 네트워크를 공부할 것인가?(네트워크 공부 방법에 대하여) 글을 작성하였고 그간 2만 명 이상의 분들이 글을 읽어주었습니다. 시간이 지나면서 없어진 자료를 제거하고 새로운 자료를 업로드하여 새롭게 글을 작성합니다. 개발자를 꿈꾸는 꼬꼬..
발표자료 1. Apache 아파치 서버는 요청이 들어오면 커넥션을 형성하기 위해 프로세스를 생성합니다. 그래서 새로운 클라이언트의 요청 들어올 때마다 새로운 프로세스를 만드는데, 이는 UNIX 계열 OS가 네트워크 커넥션을 형성하는 모델을 그대로 적용한 것이라고 합니다. 그런데 프로세스를 만드는 것이 시간이 걸리는 작업이다 보니 요청이 들어오기 전에 프로세스를 미리 만들어 놓는 prefork 방식을 사용합니다. 그래서 새로운 클라이언트로부터 요청이 들어오면 미리 만들어 놓은 프로세스를 가져다 사용합니다. 만약 만들어 놓은 프로세스가 모두 할당되었다면 추가로 프로세스를 만드는 작업을 실행합니다. 그러나 시간이 지남에 따라 인터넷 트래픽이 계속해서 증가하게 되었고 이전에는 서버가 처리해야 할 요청 양이 그 당시 기술..
Nginx vs apache Nginx는 무엇일까? Nginx는 웹서버이며, 리버스 프록시, 로드밸런서 그리고 http 캐시로도 쓰일 수 있는 소프트웨어이다. 요청에 응답하기 위해 이벤트 기반 구조를 채택했고, 덕분에 현재 웹 서버 분야에서 1등을 하고 있다. 이벤트 기반 구조가 어떤 점이 좋아서 nginx를 사용했는가 웹서버 분야에서 제일 잘 나가는게 아파치 서버라고 알고 있는 ngixn와의 차이점은 무엇인가 nginx게 벤치마킹 테스트를 했을때 가볍고 성능이 좋아서 선택 그리고 아파치 서버보다 최신 기술이라서 사용 설명이 부족하다. Apache와 Nginx를 비교하면서 서로의 개념을 알아보자. NCSA HTTPd 그 당시에는 유닉스 기반으로 만들어진 최초의 웹서버 NCSA HTTPd 가 있었어요. 그런데 이 프로그램은 버그가 굉..
바이트코드 조작 - 모자에서 토끼를 꺼내는 마술 바이트코드를 조작하는 것은 막강한 기능이다. 바이트 코드를 조작하는데 쓸 수 있는 라이브러리는 여러가지가 있지만 가장 고전적이고 널리 쓰이는 것은 asm이라는 것이 있다. userguide가 좀 어렵게 되어있다. visitor 패턴과 adapter 패턴을 잘 알고있어야 쓸 수 있다. 너무 어렵기 때문 javabuddy라는 것이 있는데 그나마 쉽다. 아무것도 없는 Moja에서 “Rabbit”을 꺼내는 마술 Moja.java public class Moja { public String pullOut() { return ""; } } Masulsa.java public class Masulsa { public static void main(String[] args) { System.out.println(new..
바이트코드 조작 - 코드 커버리지는 어떻게 측정할까 코드 커버리지는 어떻게 측정할까? 바이트 코드를 조작해서 측정하는 것이다. 바이트 코드를 읽어서 코드 커버리지 챙겨야 하는 부분의 수를 counting 하고 코드가 실행될 때 그 중에 몇개의 로직이 지나갔는지 counting을 해서 비교해주는 것이다. 테스트 코드를 통해 확인한 소스 코드의 비율을 %로 나타낸 것이다. Moim이라는 클래스를 생성한다. Moim이라는 클래스에는 isEnrommmentFull 이라는 메서드가 존재하는데, 해당 메서드에는 세가지 로직이 존재한다. 테스트 코드를 작성해보자. 테스트 커버리지를 측정해주는 라이브러리인 JaCoCo를 사용해보도록 하자. https://www.eclemma.org/jacoco/trunk/doc/index.html http://www.semdesigns..
클래스로더 시스템 클래스 로더 시스템 구조를 조금 더 자세하게 그리면 아래와 같이 그릴 수 있다. 여러개의 클래스 로더들이 (Bootstrap, Extension, Application) 부모 - 자식 간의 관계를 맺고 로딩을 한다. 링크라는 과정도 세부적으로 세단계로 나눠서 실행이 된다. 클래스 로더 로딩, 링크, 초기화 순으로 진행된다. 로딩 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 “메소드” 영역에 저장. 이때 메소드 영역에 저장하는 데이터 FQCN (Fully qualified class name, 패키지 경로를 포함한 클래스 이름) 클래스 | 인터페이스 | 이늄 메소드와 변수 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 “힙" 영역에 저장. 플랫폼 클..
JVM 구조 클래스 로더 시스템 .class 에서 바이트코드를 읽고 메모리에 저장 하는 역할은 크게 세가지로 나눌 수 있다. 로딩: 클래스 파일에서 바이트 코드를 읽어오는 과정 링크: 레퍼런스를 연결하는 과정 (링크도 크게 세가지로 나눌 수 있다.) 초기화: static 값들 초기화 및 변수에 할당 - 보충 개념 1. class 파일은 어디에 있을까? intellij에서 class 파일 찾기 class파일의 위치는 target/classes 아래 디렉터리에서 확인할 수 있다. 원래는 컴파일 되어있는 바이트 코드가 있어야 하는데 intellij 에서 확인하면 바이트 코드가 아닌 것을 확인할 수 있다. javap 같은 것을 사용해서 우리 눈에 조금 더 사람이 읽을 수 있는 코드로 보여주고 있는 것이라고 보면 된다. (바..
자바, JVM, JDK 그리고 JRE JVM (Java Virtual Machine) 자바 가상 머신 자바 바이트 코드를 어떻게 실행할 지에 대한 표준 스펙 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다. 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다. JVM 스팩: https://docs.oracle.com/javase/specs/jvms/se11/html/ JVM 밴더: 오라클, 아마존, Azul, ... 특정 플랫폼에 종속적. (네이티브 코드로 바꿔서 실행해야 하는데 네이티브 코드가 OS에 맞춰서 실행해야 하기 때문에) 구현체는 다양하다. 컴파일 javac HelloJava.java HelloJava.class