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

[용어 정리] 객체지향 프로그래밍을 이해하기 위해 필요한 아래의 용어에 대해 먼저 설명하겠다.모듈모듈이란 프로그램을 구성하는 기능 단위의 독립적인 명령어들의 집합이다.모듈은 독립적이며 유일한 기능을 갖고 다른 프로그램이나 모듈에서 호출되어 재사용될 수 있어야한다.따라서 모듈은 다양한 형태로 존재할 수 있는데 메서드, 객체, 패키지, 라이브러리 등이 이에 해당한다.(상위 모듈 : 호출하는 모듈 / 하위 모듈 : 호출 당하는 모듈)의존의존이란 모듈(또는 객체 등)이 동작하기 위해 다른 모듈의 자원을 사용하는 상황을 의미한다.이는 호출 당하는 하위 모듈의 변경사항이 호출하는 상위 모듈에 영향을 미친다는 것을 의미한다.의존성의존성의 존재 여부는 호출되는 하위 모듈의 변경사항이 호출하는 상위 모듈에 영향을..
스프링의 application context에 관리되는 빈들은 기본적으로 싱글톤으로 관리된다. 상태를 갖지 않는 객체의 메서드를 사용하기 위하여 매번 인스턴스화 하는 것은 효율적이지 않다.스프링에서는 이러한 이유로 싱글톤 타입이라는 것을 지원하고 싱글톤 타입으로 스프링 빈을 관리할 땐, 속성 없이 메서드만 구현하여 사용을 한다. 허나, 이렇게 메서드만 사용할 목적이라면 굳이 인스턴스화할 필요도 없고 static으로 만들어서 사용해도 되지 않나라는 의문이 들수 있다.static 메서드를 사용하는 것과 싱글톤 빈의 메서드를 사용하는 것의 차이는 클래스 메서드이냐, 인스턴스 메서드이냐의 차이이다.즉, 인스턴스를 사용하냐 하지 않냐의 차이이고, 이는 객체지향적인 프로그래밍을 할 수 있냐 없냐로 나타난다. sta..

트랜잭션 추상화우리는 추상화가 "공통적인 것을 취하고 차이점을 배제하는 것"이라는걸 잘 알고 있다.추상화를 통해 공통적인 부분을 분리하여 처리하도록 한다면 차이점에 대해서만 집중하여 개발을 할 수 있다.트랜잭션 추상화에서 적용된 공통점은 트랜잭션 처리이고, 차이점은 비즈니스 로직이다. 아래 코드를 보자.override fun create(member: Member) { val status = transactionManager.getTransaction(DefaultTransactionDefinition()) try { // 비즈니스 로직 val id = memberRepo.create(member) memberRepo.addRole(MemberRole(id, "USER"..

멀티모듈로 헥사고날 구현[1] - 모듈 구성멀티모듈로 헥사고날 구현[2] - application layer를 pojo로 구성하기 비즈니스 로직을 포함하는 application layer를 프레임워크나 라이브러리 의존 없이 pojo로 구현하게 되면 외부 환경변화로 부터 비즈니스 로직을 지킬 수 있는 큰 장점을 얻을 수 있다.프레임워크, 라이브러리, 연동 소프트웨어가 바뀌더라도 비즈니스 로직은 수정할 필요가 없어진다.하지만 프레임워크나 라이브러리에서 지원하는 편리한 기능을 사용하지 못한다는 것은 단점이다. 개발을 하며 반드시 필요로하다고 생각했던 기능은 DI이다.스프링의 DI를 활용하면 의존관계를 new 연산자와 같은 코드를 통해 직접 설정하지 않고 어노테이션 기반으로 설정할 수 있다.의존관계는 변경사항이..

문제 상황connection 경로를 결정하는 AbstractRoutingDataSource에서 현재 실행중인 트랜잭션의 readonly 값을 읽어와 readonly=true 이면 slave db로 경로를 결정하고, readonly=false이면 master db로 경로를 결정하는데AbstractRoutingDataSource의 구현체에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly()를 호출하면 false만 리턴이됨 문제 원인 PlatformTransactionManager가 커넥션 경로를 먼저 설정하고 이후에 트랜잭션 상태를 설정함.따라서 커넥션 경로를 설정하는 시점에 트랜잭션 상태가 정의되어있지 않아 default로 false만 반환..

[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은 작업 차단 유무에 관한 것이다.동기와 비동기 동기는 요청 작업의 완료여부를 체크하고 작업을 순차적으로 진행한다.특정 함수를 호출하면 완료 응답을 받고 다음 작업을 진행한다.통신 환경이라면 사용자의 요청에 응답을 제공한 이후 다음 ..