목록development (75)
코딩하는 오징어
클래스 정의 제약 사항 JPA를 사용하게 되면 대부분 Hibernate를 구현체로 사용하게 된다. Hibernate를 구현체로 사용하게 되면 Entity로 사용할 클래스에 몇 가지 제약사항이 존재한다. https://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html 위의 문서를 보면 다음과 같은 글이 있다. Requirements for Entity Classes An entity class must follow these requirements: The class must not be declared final. No methods or persistent instance variables must be declared final. Entity의 해당하는 클래스는 ..
TDD가 유행하면서 테스트에 대한 관심이 많아졌다고 생각한다. 본인도 테스트는 반드시 작성해야한다고 주장하면서 다녔지만 정작 테스트는 어떻게 짜는게 좋고 테스트를 짰을 때 어떤 점이 좋아지는 것에 대한 고민을 깊게 해본것은 최근이었다. 테스트는 왜 짜야 할까? 우리가 만든 함수에 대해 신뢰할 수 있다. (단, 그 함수의 입력 값, 출력 값 명세에 대한 범위에 한해서) 리팩토링이 필요할 때 테스트 코드가 있다면 안심하고 코드를 고칠 수 있다. (리팩토링을 진행하면서 테스트 프레임워크로부터 빠르게 피드백을 받아 볼 수 있기 때문.) 장애(예외)가 발생했을 때 해당 시점의 입력 값을 테스트 코드의 입력으로 주었을 때 어떤 부분이 잘못 됐는지 알 수 있다.(논리 오류로 인한 장애일 경우) 이때 방어 로직이 추가..
Netty는 비동기 네트워크 프레임워크 입니다. 이번 글에서는 이 비동기 프레임워크가 어떻게 동작하는지 살펴 보겠습니다. Netty는 Channel에서 발생하는 이벤트들을 EventLoop가 처리하는 구조입니다. 여기서 EventLoop에 대해서 한번 살펴보고 글을 이어가겠습니다. 이벤트 루프 이벤트 루프란 이벤트를 실행하기 위한 무한루프 스레드를 말합니다. 위의 그림과 같이 객체에서 발생한 이벤트는 이벤트 큐에 입력되고 이벤트 루프는 이벤트 큐에 입력된 이벤트가 있을 때 해당 이벤트를 꺼내서 이벤트를 실행합니다. 이것이 이벤트 루프의 기본 개념입니다. 이벤트 루프는 지원하는 스레드 종류에 따라서 단일 스레드 이벤트 루프와 다중 스레드 이벤트 루프로 나뉘고, 이벤트 루프가 처리한 이벤트의 결과를 돌려주는..
Netty는 네트워크적인 low한 처리와 비즈니스 로직 처리를 추상화를 통해 분리하였으며 덕분에 비즈니스 로직에 더욱 집중할 수 있도록 도와준다. Netty는 크게 다음과 같은 Component들을 통해 데이터를 처리한다. Channel, EventLoop, ChannelFuture ChannelHandler, ChannelPipeline Bootstrap Channel 기본 입출력 작업(bind, connect, read, write)은 네트워크 전송에서 제공하는 기본형을 이용한다. 자바 기반 네트워크 기본 구조는 Socket클래스이다. Netty의 Channel 인터페이스는 Socket으로 직접 작업할 때의 복잡성을 크게 완화하는 API를 제공한다. Netty는 Channel 인터페이스를 구현한 몇 ..
오늘은 가벼운 주제를 다뤄보겠습니다. Redirect와 Forward의 개념과 둘의 차이를 정리하려고합니다. 어렵지 않은 개념이지만 확실하게 정리를 해두지 않으면 자주 혼동하거나 다시 검색하게 되는 개념입니다. Redirect Redirect는 Wiki에 다음과 같이 정리되어있습니다. A redirect is a page which automatically sends visitors to another page, usually an article or section of an article. Redirect는 방문자를 다른 페이지로 자동으로 보내주는 페이지이다. 그림으로 Redirect의 동작 방식을 표현한다면 다음과 같을 것 입니다. 사용자는 어떤 페이지를 서버에 요청하게되고 서버는 다른 페이지의 ur..
병렬 알고리즘과 관련해서 최근의 연구 결과를 보면 대부분이 Non-Blocking 알고리즘, 즉 여러 스레드가 동작하는 환경에서 데이터의 안정성을 보장하는 방법으로 락을 사용하는 대신 저수준의 하드웨어에서 제공하는 compare-and-swap 혹은 compare-and-set (이후 CAS연산이라고 하겠다.)등의 명령을 사용하는 알고리즘을 다루고 있다. Non-Blocking 알고리즘은 운영체제나 JVM에서 프로세스나 스레드를 스케줄링 하거나 가비지 컬렉션 작업, 그리고 락이나 기타 병렬 자료 구조를 구현하는 부분에서 많이 사용되고 있다. 다음과 같은 순서로 글을 써내려가겠다. 락 기반 알고리즘의 단점 병렬 연산을 위한 하드웨어 지원 JVM에서의 CAS 연산 지원 Non-Blocking 알고리즘 락 기..
어떤 시스템이 필요한 Resource에 접근할 때, 해당 시스템은 Resource에 대해 최소한의 필요 권한만을 부여하는 것이 좋다. 해당 시스템을 통해 악의적인 Action이 발생할 수도 있고, 버그로 인해 Resource에 피해를 줄 수도 있기 때문이다. 이를 해결하기 위해 가장 좋은 방법은 최소한의 권한만 부여하여 프로세스를 실행 시키는 것이다. Docker를 실행하기 위해서는 root 권한이 필요하지만 container자체에는 그럴 필요가 없다. 하지만 우리가 Dockerfile을 통하여 이미지를 만들 때 별도의 정의를 하지 않으면 container는 root로 실행된다. 예를 보면 이해할 수 있을 것이다. 먼저 다음과 같이 정의된 Dockerfile을 보자. FROM ubuntu:focal RU..
DHCP 기초 DHCP의 기본적인 역할은 IP 주소 할당 이다. 하지만 단순히 `192.168.0.101`과 같은 IP 주소를 PC에 할당해 봐야 네트워크는 통신할 수 없다. 일반적으로 DHCP 서버는 IP주소, 서브넷 마스크, 디폴트 게이트웨이라는 기본 3종 세트와 DNS(Domain Name Service)서버 IP 주소, 도메인 이름 같은 추가 정보를 제공한다. 기본 3종 세트에 대해 간단히 설명하면 다음과 같다. 그림 1-1 1. IP 네트워크는 위의 그림과 같이 복수의 서브넷이 라우터로 서로 연결되는 구조이다. 각 서브넷에는 `네트워크 주소`와 `서브넷 마스크`가 할당되고, 할당된 정보로 그 서브넷에서 이용할 수 있는 IP주소의 범위가 정해진다. ip address / subnet mask ->..