본문 바로가기

전체 글8

멀티 스레드 환경에서의 동시성 이슈와 Blocking, Non-blocking 알고리즘을 이용한 동기화 개발을 하다보면 하나의 공유 자원을 여러 곳에서 동시에 접근하면서 race condition 이 발생하여 예상하지 못한 결과를 만들어 내는 경우가 있습니다. 웹 백엔드 서버를 개발한다면 보통 DB 와 같은 저장소에 접근할 때 동시성 이슈를 많이 만나게 되는데요, 이 글에서는 자바 코드 내의 특정한 객체(변수)에 접근할 때 발생하는 동시성 이슈를 해결하는 방법에 대해 다루어 보겠습니다. 멀티 스레드 환경에서 코드를 작성할 때에도 동시성 이슈는 언제든지 발생할 수 있습니다. 이를 살펴보기 위해 Int 형 멤버 변수 하나와 멤버 변수에 1을 더하는 메서드를 가진 간단한 SimpleNumber 클래스를 만들었습니다. class SimpleNumber ( var value: Int = 0 ) { fun plusO.. 2023. 12. 19.
자바의 리플렉션(Reflection) 리플렉션은 객체의 구체적인 타입을 알지 못해도 해당 객체의 멤버변수, 메서드 등에 접근할 수 있도록 해주는 기능입니다. 자바 어플리케이션이 컴파일되고 실행될 때, 클래스 로더는 자바 바이트코드(.class)를 읽어서 메모리에 저장합니다. 특히, Class 타입의 인스턴스를 만들어주는데요, 항상 있다는 것을 보장할 수 있기 때문에 아래와 같이 클래스를 만들기만 하면 바로 사용할 수 있습니다. class Member ( val name: String, ) val memberClass = Member::class.java val memberClass2 = Member("chobo").class 이러한 Class 인스턴스는 해당 클래스에 정의된 멤버변수, 메서드, 생성자 등 클래스의 모든 정보에 접근할 수 있습.. 2023. 9. 2.
비트코인의 합의 비트코인 네트워크에서는 블록에 거래가 기록되면 거래가 체결됩니다. 즉, 거래를 기록할 블록을 누군가는 생성(채굴)해주어야 하는데요, 비트코인은 경제적인 보상을 통해 참여자가 자발적으로 블록을 생성하도록 유도합니다.보통 10분에 하나의 블록이 생성될 수 있도록 채굴 난이도를 조정하는데, 여러 참여자가 동시에 블록을 생성하는 경우도 충분히 발생할 수 있습니다. 이런 경우 누군가가 채굴한 블록은 버려질 수밖에 없는데요, 비트코인은 이를 중앙화된 기관 없이 참여자 간의 합의를 통해 결정하도록 설계되었습니다. 합의비트코인 네트워크의 합의는 모든 채굴자가 10분마다 생성되는 블록의 내용에 대해 합의로 승인하고, 승인된 블록을 블록체인에 연결해 동기화된 블록체인을 유지합니다. 이를 통해 모든 참여자가 동일한 블록체.. 2023. 8. 27.
Speing Webflux 이해하기 Spring MVC 는 매 요청 당 스레드 하나를 할당하고 요청에 대한 작업은 해당 스레드가 담당한다.  요청에 할당되는 스레드는 응답을 주기 전까지 스레드를 반납하지 않는데, 여기서 아래와 같은 문제가 발생한다.스레드는 요청에 대한 응답이 반환될 때까지 스레드 풀에 반환되지 않는다. 즉, Blocking call 로 인해 스레드가 CPU 를 사용하지 않더라도 스레드를 점유하고 있어 다른 요청에 해당 스레드를 할당할 수 없다.스레드 내에 Blocking call 이 많아지면 문맥 교환이 많아진다.Spring 5 부터는 Non-blocking 으로 동작하는 서버를 작성하기 위해 Webflux 를 이용할 수 있다. Webflux 는 기본적으로 Non-blocking I/O 를 제공하는 Netty 를 사용하는.. 2023. 8. 22.