전체 글 140

성공과 실패를 결정하는 1% 네트워크 - UDP 프로토콜을 이용한 송 수신 동작

수정 송신이 필요없는 데이터의 송신은 UDP가 효율적이다. TCP가 복잡한 원리를 사용할 이유는 데이터를 확실하면서도 효율적으로 전달하기 위함이다. 데이터를 확실히 전달하려면 도착한 것을 확인하고, 도착하지 않았으면 다시 보내야한다. 위 내용을 가장 간단히 실현할 수 있는 방법은 그냥 데이터를 ‘전부’ 보낸 후에 수신측에서 수신 확인 응답을 받는 것이다. 이는 TCP 처럼 복잡한 과정을 생략하는 것이다. 그러나, 패킷이 한개만 없어져도 전체를 다시 보내야 함으로 비효율적인데, 용도에 맞게 TCP와 UDP를 사용하면 된다. 제어용 짧은 데이터 예를들어 DNS 서버에 대한 조회는 한개의 패킷으로 끝나기 때문에 UDP를 사용한다. UDP 동작방식도 간단하다. 애플리케이션에서 송신 데이터를 받으면 UDP 헤더를..

성공과 실패를 결정하는 1% 네트워크 - IP와 이더넷의 패킷 송 수신 동작

1. 패킷의 기본 패킷은 헤더와 데이터로 구성되어 있고, 헤더에는 제어정보, 데이터에는 내용이 들어있다. 먼저 송신처가 되는 기기가 패킷을 만들면 패킷의 제어정보에 따라 가까운 중계 장치로 이동한다. 중계장치에 도착하면 중계 장치 안의 목적지 테이블을 활용하여 다른 가까운 중계 장치로 이동하는 방식이다. 최종적으로 수신처의 기기에 패킷이 도착하는 것이다. 이러한 중계기기들을 엔드노드 또는 중계노드라 한다. TCP/IP 패킷 구조는 더 발전한 형태로, 서브넷이 라우터와허브라는 두 종류의 패킷 중계 장치에서 다음과 같은 역할은 분담한다. 라우터가 목적지를 확인하여 다음 라우터를 나타낸다.(라우터는 IP 규칙에 따라 패킷 운반) IP가 목적지를 확인하여 다음 IP의 중계장치를 나타낸다. 허브가 서브넷 안에서 ..

서버 개발자로 살아남기 - HAProxy vs NGINX

개요 현재 사내에서 사용하는 API 서버 중 HAProxy를 사용있는 서버가 있다. 구축 된 이후 인수인계 받은 서버라, 다 구현 되어 있지만 최근 인증서 교체를 위해 여러가지 알아보던 중 HAProxy에 대해 정확한 히스토리를 알 지 못하여, 이에 대해 리서치 후, 비슷한 역할을 수행하는 NGINX도 비교하여 정리한다. HAProxy Haproxy 는 L4, L7 과 같은 하드웨어 로드밸런서를 대체하기 위한 오픈소스 소프트에어로 이름처럼 Reverse Proxy 를 기반으로 로드밸런싱을 하기에 매우 강력하고 또 가벼운 어플리케이션이다. HA (High Availability) 라는 이름처럼 고가용성을 위하여 설계되었다. 로드밸런서에 대한 설명 : https://code-killer.tistory.com..

서버 개발자로 살아남기 - Nginx

개요 원래는 HAproxy를 공부하여 포스팅하려 했는데, 공부하다보니, 로드밸런서 역할로의 비교대상인 Nginx가 있었다. 그래서 Nginx vs HAproxy로 포스팅하려고, Nginx를 공부하다 보니, Apache가 있었고, 내용이 재미있어서 따로 포스팅하려고 한다. HAproxy 포스팅하면서 Nginx와 비교까지 진행해봐야겠다 배경 Nginx 이전 Apache는 요청이 들어오면 connection을 생성하는데, 클라이언트 요청이 올 때 마다 새로운 프로세서 or 쓰레드를 생성한다. 그러나, 새로운 프로세서 or 쓰레드를 생성하는데 시간이 많이 걸리기 때문에 미리 만들어 놓는PreFork 방식을 이용한다. 근데 만약 1만명 이상의 접속자가 동시에 요청을 날린다면, 1만개의 프로세스나 쓰레드를 생성하여..

Spring Framework Core (2) - Spring Bean 주입 방법 및 예시

스프링 빈 스프링 빈은 이름, 타입, 객체로 구성 @Configuration + @Bean 프레임워크를 설정할 때 애플리케이션을 설정할 때 애플리케이션 전체에서 공통으로 사용할 때 @ConponentScan + Stereotype Annotation 비즈니스 로직을 처리할 때 예시로 들어가기전 file tree KaKao & Member는 NotificationService를 상속받고 있다. Spring Bean 주입 - @Bean + @Configuration : 01 메서드의 파라미터 전달 @Configuration public class JavaConfig { @Bean public MemberRepository memberRepository() { return new MemberRepository..

사내 교육 - Spring Framework Core (1)

개요 코로나가 잠잠해진 지금 사내에서는 몇몇 오프라인 강의를 선보였다. 강사는 사내 다른 법인의 분이였고, 개발 관련 책을 무려 7권이나 쓰셨다고 한다. 그분이 강의하신 Spring Framework Core를 수강하였고, 자료를 정리하였다. Why Spring Framework?? 생산성 품질 사실상 표준 JAVA 프레임워크 - JAVA 대안이없음 엔터프라이즈 애플리케이션에 적합한 JAVA 프레임워크 엔터프라이즈 애플리케이션이란 무엇? 다른 JAVA 웹 프레임워크들 Spark vert play netty EJB 대신 Spring을 사용하는 이유 비침투적인 프레임워크 EJB는 implements 다 구현 해야함 → 침투 스프링은 최대한 막음 POJO(Plain Old Java Object) - 순수자바 ..

JPA - saveAll vs save (2)

saveAll()과 save()의 내부구현 save() 메서드의 구현 코드이다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } saveAll() 메서드의 구현 코드이다. @Transactional @Override public List saveAll(Iterable entities) { Assert.notNull(entities, "Entities must not be n..

JPA - saveAll vs save (1)

JPA에서 여러개의 데이터를 DB에 INSERT 할 때saveALL()을 이용하면 성능 좋게 사용할 수 있다. save() 사용 save() 메서드의 구현 코드이다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } entityManager를 통해 새로 들어가면 persist, 기존에 있다면 merge 을실행한다. Mysql 문법으로 보면 아래와 같다. INSERT INTO ..

성공과 실패를 결정하는 1% 네트워크 - 서버에 접속한다.

Story 02 서버에 접속한다. 1. 접속의 의미 클라이언트에서 소켓을 만든 직후에는 아직 아무것도 기록되어 있지 않으므로 통신에 대한 아무런 정보가 없다. 서버(목적지)의 IP주소나 포트 번호를 프로토콜 스택에 알리는 동작이 필요한데, 이것이 접속 동작의 한 가지 역할이다. 클라이언트와는 다르게 서버측은 목적지가 없기 때문에 IP주소나 포트 번호에 대한 정보를 알 수 없다. 그래서 클라이언트에서 자신의 IP 주소,포트 번호를 전달하면 서버측의 프로토콜 스택도 이에 대한 정보를 알 수 있다. 접속동작의 첫 번째 동작은 통신 상대와의 사이에 제어 정보를 주고받아 각자의 소켓에 필요한 정보를 기록하여, 데이터 송 수신 가능한 상태로 만든다. 여기서 제어 정보는 데이터 송 수신 동작을 제어하기 위한 정보이며..

728x90