
[I/O 이해하기-1] 동기와 비동기 VS Blocking과 Non Blocking[I/O 이해하기-2] Stream vs Channel[I/O 이해하기-3] 톰캣의 요청 수신 방식이전의 [I/O 이해하기 1,2]를 통해 I/O 작업에 사용되는 개념에 대해 학습을 하였다.개념에 대한 내용은 1,2편에서 설명하였으므로 이 글에서는 개념과 용어에 대해 세세한 설명은 하지 않을 것이다. 나는 개인적으로 톰캣이 어떻게 요청을 처리하는지 알고 싶어 동기와 비동기, Blocking과 Non Blocking, Stream과 Channel을 학습하였다. 톰캣 9 이후 비동기-NonBlocking으로 동작한다고 하여 클라이언트 요청에 대한 모든 I/O 작업을 비동기-NonBlocking으로 동작할것이라 예상했지만 결과는..

Garbage Collection"JVM의 가비지 컬렉터가 불필요한 메모리 자원을 해제하는 작업"자바에서 명시적으로 불필요한 데이터를 표현하기 위해서 null을 선언할 수 있다. 허나, 이러한 패턴의 코드는 잘 보이지 않는다. 가독성에도 좋지 않지만 null을 선언하지 않아도 가비지 컬렉터의 알고리즘에 의해 수집 될 수 있다. 가비지 컬렉션은 객체를 참조하는 다른 자원이 있는지 확인하는 Reachable 작업을 통해 제거 대상을 판단한다.가비지 컬렉션의 대상인 힙 영역의 객체들은 스택 영역의 변수들이나 참조타입의 정적 필드 의해 참조된다.스택이나 정적 필드에 의해 참조되는 객체를 Reachable이라고 하고, 참조되지 않는 객체는 UnReachable이라고 한다.가비지 컬렉션은 UnReachable이라고..

[용어 정리] 객체지향 프로그래밍을 이해하기 위해 필요한 아래의 용어에 대해 먼저 설명하겠다.모듈모듈이란 프로그램을 구성하는 기능 단위의 독립적인 명령어들의 집합이다.모듈은 독립적이며 유일한 기능을 갖고 다른 프로그램이나 모듈에서 호출되어 재사용될 수 있어야한다.따라서 모듈은 다양한 형태로 존재할 수 있는데 메서드, 객체, 패키지, 라이브러리 등이 이에 해당한다.(상위 모듈 : 호출하는 모듈 / 하위 모듈 : 호출 당하는 모듈)의존의존이란 모듈(또는 객체 등)이 동작하기 위해 다른 모듈의 자원을 사용하는 상황을 의미한다.이는 호출 당하는 하위 모듈의 변경사항이 호출하는 상위 모듈에 영향을 미친다는 것을 의미한다.의존성의존성의 존재 여부는 호출되는 하위 모듈의 변경사항이 호출하는 상위 모듈에 영향을..

[I/O 이해하기-1] 동기와 비동기 VS Blocking과 Non Blocking[I/O 이해하기-2] Stream vs Channel[I/O 이해하기-3] 톰캣의 요청 수신 방식I/OI/O란 Input/Ouput의 약자로 입력값을 읽어들이는 작업과 출력값을 쓰는 작업을 말한다. I/O 작업은 애플리케이션 내에서만 이뤄지는 작업이 아니다.클라이언트의 요청을 읽어들이는 서버(전송계층 -> 응용 계층)클라이언트가 서버로 요청을 보내게되면 요청 데이터가 전송계층에 패킷 형태로 존재한다.서버의 애플리케이션에서 시스템 콜을 실행하는 프로그래밍 명령어를 통해 이를 애플리케이션으로 가져온다.디스크에 저장된 파일 읽어들이는 경우 (하드웨어 -> 애플리케이션 서버)파일이 존재하는 디스크 경로에 접근하여 해당 데이터를 ..

[I/O 이해하기-1] 동기와 비동기 VS Blocking과 Non Blocking[I/O 이해하기-2] Stream vs Channel[I/O 이해하기-3] 톰캣의 요청 수신 방식 동기와 비동기는 요청 작업의 완료여부를 체크하고 작업을 순차적으로 처리하느냐의 차이로 구분할 수 있고,Blocking과 NonBlocking은 제어권을 누가 갖는지에 따른 작업 차단(block) 유무로 구분할 수 있다. 동기와 비동기는 순서에 관한 것이고, Blocking과 NonBlocking은 작업 차단 유무에 관한 것이다.동기와 비동기 동기는 요청 작업의 완료여부를 체크하고 작업을 순차적으로 진행한다.특정 함수를 호출하면 완료 응답을 받고 다음 작업을 진행한다.통신 환경이라면 사용자의 요청에 응답을 제공한 이후 다음 ..
코틀린, 스프링, jpa, querydsl 환경에서 불변객체를 만드는 방법에 대해 알아보겠다. 자바 위주의 스프링, querydsl, mapstruct 개념이나 사용법을 그대로 받아들이려고 하면 코틀린에서 객체의 불변성이 깨지거나 디폴트값 선언으로 비즈니스 규칙을 깨트리는 생성자들이 생겨날 수 있다. 나의 경우도 그러하였는데 코틀린, 스프링, querydsl, mapstruct 환경에서 객체 불변성을 지키며 디폴트값을 제거하는 방법에 대해 공유하겠다.Querydsl을 통해 매핑받는 객체 디폴트 값 없애기projection.bean, projection.fieldsprojection.bean 방식은 자바 빈 객체 형태만 받을 수 있다. 허나 세터 메서드가 없어도 리플렉션을 통해 매핑이 가능하다고 한다.세터..

Error와 Exception자바에서 프로그램이 비정상적인 동작을 일으키는 경우 Error 또는 Exception이 발생하게 된다. ErrorExceptionChecked ExceptionUnChecked Exception복구 여부복구 불가복구 가능예외 종류컴파일 타임- 문법 오류- 타입 체크IOException 런타임- StackOverFlowError- OutOfMemoryError Runtime Exception 하위예외 처리처리불가 컴파일러에 의해 예외 처리 강제예외 처리 강제화 되지 않음 예외 상속관계 Error와 Exception은 모두 Throwable 클래스를 상속 받는다Throwable 클래스는 message와 stackTrace를 담고 있다.message는 Error와 Exception..

객체지향 프로그래밍에서는 객체간의 의존성이 빈번하게 발생한다.의존이란 상위 모듈(호출자)이 기능 수행을 위해 하위 모듈(피호출자)의 자원을 사용하는 것을 말한다.(하위 모듈의 변경사항이 상위 모듈에 영향을 끼침)이러한 의존관계의 설정은 컴파일 타임에 결정되기도 하고 런타임에 결정되기도 한다.컴파일 타임 의존성과 런타임 의존성은 말그대로 어느 시점에 의존성이 결정되느냐의 차이이다. 자바 프로그램이 실행될 때, 자바 파일이 컴파일러에 의해 컴파일 되고이후 jvm의 런타임 영역에 클래스 요소들이 적재된다.컴파일 타임은 컴파일러에 의해 컴파일이 이루어지는 시점을 의미하고,런타임은 클래스파일이 jvm의 런타임 영역에 적재된 이후의 시점을 의미한다.따라서 컴파일 타임 의존성과 런타임 의존성은 아래와 같이 구분할 수..