CS Repository 54

[PoEAA] 서비스 계층의 역할

우리는 백엔드 개발을 배울 때, 단순히 '3-Layer 아키텍처를 써라.' 라는 이야기를 듣고, 컨트롤러-서비스-리포지토리를 작성하지만,무작정 XxxService 계층을 도입하면서 정작 서비스 계층에 어떠한 로직을 넣어야 하는지에 대한 고민에는 당황하기 십상이다. 이 서비스 계층의 등장 배경에 대해 완전히 이해할 때, 어떠한 로직을 서비스 계층에 넣고, 어떠한 로직을 도메인 엔티티에 넣을지 이해할 수 있을 것이다.'도메인' 이란?domain = 정의역소프트웨어 공학에서 '도메인'은 해결하고자 하는 문제의 영역을 의미하며, 특정 비즈니스 영역을 구현하게 되었을 때, 그 영역에만 존재하는 지식과 논리를 의미한다.예시로는 다음과 같은 것들이 있다.결제 도메인계정 도메인물류 도메인도메인 모델과 트랜잭션 스크립트..

[PoEAA] 성능 관련 용어

아키텍처의 결정에는 성능과 관련된 것이 많다.일반적으로 성능의 경우, 먼저 시스템을 실행 가능한 상태로 만들고, 성능을 측정한 후, 측정 데이터를 바탕으로 체계적인 절차를 이용한다.그런데 일부 아키텍처 결정은 나중에 최적화를 통해 해결하기 어려운 성능상의 영향을 미치는 경우가 있다.그렇다고 성능 상의 결정 방식을 글로 표현하기는 매우 어려운데, 모든 상황과 환경에 따라 그 결정의 옳고 그름이 완전히 달라질 수 있기 때문이다.하지만 적어도 용어를 정리해두면, 성능과 관련된 논의를 시작할 수는 있다.따라서 아래 용어들의 정의를 살펴보며, 각각이 어떤 의미를 갖는지 알아보자.응답 시간(response time)응답성(responsiveness)대기 시간(latency)처리량(throughput)성능(perfo..

[PoEAA] 백엔드 개발자의 역할 - 소프트웨어 아키텍처와 엔터프라이즈 애플리케이션의 의미

결국 백엔드 개발자는 소프트웨어 아키텍처를 이해하고, 도메인 로직을 코드로 설계해야 한다.여기에 있어 소프트웨어 아키텍처의 의미와 엔터프라이즈 애플리케이션의 정의는 백엔드 개발자가 해야하는 일을 명확히 정의하는 아주 중요한 주제라고 할 수 있다.따라서 이에 대한 정의를 먼저 해두자.아키텍처아키텍처는 아주 많은 사람들이 정의하려고 하지만 의견이 분분한 용어다.하지만 그 안에서 몇 가지 공통적인 정의가 있다.시스템을 구성 요소로 나누는 최상위 수준의 분해이다.번복하기 어려운 결정이다.아키텍처는 한 가지 방법으로는 설명할 수 없다.하나의 시스템 안에도 여러 아키텍처가 있을 뿐 아니라, 아키텍처적으로 무엇이 중요한지에 대한 관점도 시스템의 수명 기간 중 달라질 수 있다.랄프 존슨의 견해에서도 아키텍처에 대한 흥..

[리팩터링] 테스트 구축하기

리팩터링을 제대로 하려면 견고한 테스트 스위트(test suite)가 뒷받침되어야 한다. 자동 리팩터링 도구를 활영하더라도 이 책에서 소개하는 리팩터링 중 다수는 테스트 스위트로 재차 검증해야 할 것이다.자가 테스트 코드의 가치프로그래머가 어떻게 일하는지 가만히 살펴보면, 실제 코드를 작성하는 시간의 비중은 그리 크지 않다.실제로는 아래와 같은 과정에 훨씬 많은 시간을 쏟는다.현재 상황 파악설계에 대한 고민디버깅이 "디버깅" 시간을 줄이는데, 자가 테스트 코드는 매우 중요하고 훌륭한 도구이다.모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자.참고) 엄밀하게 말하자면, 테스트 코드는 코드가 잘 동작하는지 확인할 수 있는 모든 종류의 코드이고,자가 테스트 코드는 코드가 스스로 테스트가 성공..

[리팩터링] 리팩터링 가이드

읽기 쉬운 코드는 생산성을 크게 올려주기에, 읽기 어려운 코드에 적극적으로 리팩토링을 도입해야 한다. 그렇다면 뭐가 읽기 어려운 코드일까? 지금부터 "코드 냄새"라고 불리는 아래 내용들을 하나씩 짚어볼 것이다.기이한 이름중복 코드긴 함수긴 매개변수 목록전역 데이터가변 데이터뒤엉킨 변경산탄총 수술기능 편애데이터 뭉치기본형 집착반복되는 switch문반복문성의 없는 요소추측성 일반화임시 필드메시지 체인중개자내부자 거래거대한 클래스서로 다른 인터페이스의 대안 클래스들데이터 클래스상속 포기주석기이한 이름'컴퓨터 과학에서 어려운 건 딱 두 가지, 캐시 무효화와 이름 짓기다.'이름이 이상하면, 코드를 이해하기 어렵다.코드는 단순하고 명료하게.마땅한 이름이 떠오르지 않는다면 설계에 더 근본적인 문제가 숨어 있을 가능성..

[리팩터링] 리팩터링 원칙

요약리팩터링은 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법이다.리팩터링은 코드의 이해도를 올리고, 생산성을 올린다.리팩터링 작업은 코드의 이해도를 올리니, 읽기만 하기 보단 리팩터링을 시도해보며 읽는다.쉽다면 직접 리팩터링을 적용해본다.기능 추가 작업과 리팩터링 작업을 분리해라.지금 하고 있는게 리팩터링 작업인지 기능 추가 작업인지 명확히 하라.리팩터링은 경제적인 이유로 해라.리팩터링할 수 있어야 코드를 이해했다고 할 수 있고,코드를 이해해야 새로운 기능을 추가할 수 있다.일단은 성능을 신경쓰지 말고 코드를 작성해라.성능은 이후 성능 테스트/프로파일링을 통해 해결해라.리팩터링의 정의명사 관점소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 ..

[리팩터링] 리팩터링 직접 해보기

요약프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링하고 나서 원하는 기능을 추가한다.리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.코드를 분석하지 않아도, 코드 스스로가 자신이 하는 일이 무엇인지 이야기할 수 있도록 작성해라. 코드를 분석해서 얻은 정보는 휘발성이 높기로 악명 높은 저장 장치인 머릿속에 기억된다.컴퓨터가 이해하는 코드는 바보도 작성할 수 있다.사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다.지역 변수는 추출을 까다롭게 만든다. 지역 변수를 쿼리 메소드로 대체하자.리팩터링으로 인한 성능 문제는 '특별한 경우가 아니라면 일단 무시하라'!나중에 깔끔해진 코드로 쉽게 개선하라.리팩토링 과정 도중..

SQL 쿼리의 동작 순서와 기본적인 동작 원리

SQL 문법의 동작 순서 외우는 법게토레이랮혼애ㅣfowghsdol각 문법의 첫글자를 딴 형태로 만든 암기 방식이다.실제 동작 순서는 다음과 같다.fromon(join)wheregroup byhavingselectdistinct, unionorder bylimit/offsetFrom쿼리의 작업 대상이 되는 기본 테이블을 결정한다.최초 쿼리가 동작할 테이블/뷰/파티션/서브쿼리가 정확히 어딘지를 결정한다.On(Join)조인 순서 최적화조인 알고리즘 선택별도의 글로 작성해야 함. 깊이가 깊음. (작성예정)WhereFROM/Join 절로 생성된 모든 행에 대해 필터링을 수행한다.인덱스를 사용 가능한 (sargable) 조건들에 대하여, 인덱스를 사용하여 탐색한다.집계함수를 사용할 수 없다.select 절에서 정의..

CS Repository/DB 2025.05.01

TCP의 다양한 추가 기능 - TFO, Nagle 알고리즘, 지연 ACK, Early Retransmit, Tail Loss Probe

TCP Fast Open(TFO)3-way handshake를 사용해 애플리케이션 데이터를 교환하는 기능이다.처음부터는 불가능하다.그 대신, 첫 handshake 때 옵션 필드로 TCP Fast Open에 필요한 정보(TFO Cookie)를 교환한다.그 이후, 2번째 Handshake부터 TCP Fast Open을 발동한다.클라이언트는 SYN에서 HTTP 요청을 송신하고, 서버는 SYN/ACK로 HTTP 응답을 반환한다.Nagle 알고리즘네이글 알고리즘은 작은 데이터가 자주 전송될 경우, 더 큰 세그먼트로 합쳐 전송함으로써 패킷 낭비를 줄이기 위한 방식이다.구체적으로,버퍼에 모은 데이터가 최대 세그먼트 크기(MSS)에 도달하면 즉시 전송한다.이전에 전송한 세그먼트에 대한 ACK를 모두 받으면 즉시 전송한..

TCP의 연결과 종료 과정 - 흐름제어, 혼잡제어, 재전송 제어, 3-way handshake, 4-way handshake

본 게시글은 그림으로 공부하는 TCP/IP 구조 도서를 참고하였습니다. TCP 의 주요 동작과 그 성공 시나리오들을 알아보자. TCP의 상태는 크게 다음과 같이 분류할 수 있다.접속 시작 단계액티브 오픈클라이언트가 커넥션을 만들어가는 처리를 의미한다.패시브 오픈서버가 클라이언트의 연결 요청을 받아들이는 처리를 의미한다.접속 확립 단계접속 종료 단계액티브 클로즈FIN/ACK을 먼저 송출해서 커넥션을 종료하려는 처리를 의미한다.패시브 클로즈FIN/ACK을 받고, 커넥션을 종료하는 과정을 받아들이려는 처리를 의미한다.TCP는 컨트롤 비트를 구성하는 8개 플래그를 '0' 또는 '1'로 설정해 다음 그림과 같이 TCP 커넥션 상태를 제어한다.각 단계 별 주요 동작으로는 다음과 같은 것들이 있다.접속 시작 단계3-..