게시글
블로그
전체 72025. 06. 15.
0
[인프런 워밍업 클럽 4기 - CS] - 3주차 발자국
컴퓨터 구조Section9) CPU 만들기: 제어 장치 (Control Unit)명령어 (Instruction)CPU가 실행할 수 있는 기본 작업 단위프로그램 카운터 (Program Counter, PC)다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터명령어 인출 후 자동으로 증가스텝 카운터 (Step Counter)스택의 위치를 가리키는 카운터시스템 내에서 현재 동작이 몇 번째 단계(스텝)인지 추적하는 카운터명령어 유형별 실행NOP: No Operation (아무 작업 안 함)LOAD: 메모리→레지스터 데이터 이동STORE: 레지스터→메모리 데이터 저장ADD/SUB: 산술 연산 (덧셈/뺄셈)JMP: 무조건 분기JMPC/JMPZ: 조건부 분기 (Carry/Zero 플래그 기반)OUT: 데이터 출력HLT: 프로그램 정지Section10) 기계어와 어셈블리어셈블리어 (Assembly Language)기계어를 인간이 읽기 쉬운 형태로 표현한 저수준 프로그래밍 언어CPU 아키텍처에 1:1 대응되는 언어어셈블러 (Assembler)어셈블리어 소스코드를 기계어로 변환하는 시스템 소프트웨어자료구조와 알고리즘트라이(Trie)'retrieval'에서 유래했으며, 단어를 문자 하나씩 노드에 저장, 루트부터 특정 노드까지의 경로가 하나의 접두사 또는 단어가 됩니다. 이진 트리와 달리 자식 노드의 수에 제한이 없음접두사 검색에 매우 강력하여 자동완성 기능을 구현하는 데 최적화되어 있음그래프(Graph)정점 간의 연결 관계를 나타내며, 간선에 방향이나 가중치가 있을 수 있음주요 용어정점(Vertex): 데이터가 저장되는 노드간선(Edge): 정점들을 연결하는 선인접/이웃: 두 정점이 간선으로 직접 연결된 상태탐색 방법:DFS (깊이 우선 탐색): 스택이나 재귀를 사용해 한 경로를 끝까지 깊게 탐색합BFS (너비 우선 탐색): 큐를 사용해 현재 정점에서 가까운 정점들을 먼저 탐색
2025. 06. 08.
0
[인프런 워밍업 클럽 4기 - CS] - 2주차 발자국
자료구조 & 알고리즘레드블랙 트리 (Red-Black Tree)자가 균형 이진 탐색 트리로, 각 노드가 빨간색 또는 검은색의 색상을 가지며 특정 규칙을 만족하여 트리의 균형을 유지주요 규칙은 루트와 리프가 검은색이고, 빨간 노드의 자식은 검은색이며, 루트에서 리프까지 모든 경로의 검은 노드 수가 같음 우선순위 힙 (Priority Heap)완전 이진 트리 구조로 구현된 자료구조로, 부모 노드가 자식 노드보다 우선순위가 높은(최대 힙) 또는 낮은(최소 힙) 특성을 만족 배열로 구현할 때 인덱스 관계가 명확하여 효율적인 구현이 가능하며, 최대값 또는 최소값을 O(1)에 접근할 수 있음우선순위 큐 (Priority Queue)각 원소가 우선순위를 가지며, 우선순위가 높은 원소가 먼저 처리되는 추상 자료형 일반적으로 힙으로 구현되어 삽입과 삭제 연산이 O(log n)의 시간 복잡도를 가집니다. 운영체제의 작업 스케줄링, 다익스트라 알고리즘 등에서 활용컴퓨터 구조MUX (Multiplexer)여러 개의 입력 신호 중 선택 신호에 따라 하나의 입력을 선택하여 출력으로 전달하는 조합 논리회로 n개의 선택 신호로 2^n개의 입력 중 하나를 선택할 수 있으며, 데이터 경로 선택, 메모리 주소 선택 등에 사용됨디코더 (Decoder)n비트의 이진 입력을 받아 최대 2^n개의 출력선 중 하나만 활성화하는 조합 논리회로입력된 이진 코드를 해석하여 해당하는 출력선을 선택하며, 메모리 주소 디코딩, 명령어 디코딩 등에 활용컨트롤 버퍼 (Control Buffer)시스템의 제어 신호를 임시 저장하고 전달하는 버퍼로, 제어 신호의 타이밍을 조정하고 신호 간의 동기화를 담당프로세서 내부에서 제어 신호의 전파 지연을 관리하고 안정적인 동작을 보장반 가산기 (Half Adder)두 개의 1비트 이진수를 더하여 합(Sum)과 자리올림(Carry)을 출력하는 기본적인 산술 논리회로 XOR 게이트로 합을, AND 게이트로 자리올림을 구현하며, 이전 자리에서의 자리올림은 고려하지 않음전 가산기 (Full Adder)두 개의 1비트 이진수와 이전 자리의 자리올림을 모두 고려하여 합과 자리올림을 출력하는 산술 논리회로반 가산기 두 개를 조합하여 구현할 수 있으며, 다중 비트 덧셈 회로의 기본 구성 요소ALU (Arithmetic Logic Unit, 산술논리연산장치)산술 연산(덧셈, 뺄셈)과 논리 연산(AND, OR, NOT)을 수행하는 프로세서의 핵심 구성 요소제어 신호에 따라 다양한 연산을 선택적으로 수행하며, 연산 결과에 대한 플래그 정보도 생성조합 논리회로 / 순차 논리회로조합 논리회로는 현재 입력값에만 의존하여 출력이 결정되는 회로로, 메모리 기능이 없음순차 논리회로는 현재 입력과 이전 상태에 따라 출력이 결정되는 회로로, 플립플롭이나 래치 등의 메모리 소자를 포함함SR 래치, D 래치, JK 래치SR 래치는 Set과 Reset 입력으로 1비트 정보를 저장하는 기본 메모리 소자D 래치는 Data 입력과 Enable 신호로 동작하며 투명 래치라고도 함JK 래치는 SR 래치의 금지 상태를 해결한 개선된 형태로, J=K=1일 때 상태가 토글됨플립플롭 (Flip-Flop)클록 신호의 에지(상승 또는 하강)에 동기화되어 동작하는 순차 논리회로래치와 달리 클록 에지에서만 상태가 변경되어 더 안정적인 동작을 보장
2025. 06. 01.
1
[워밍업 클럽 4기] 1주차 발자
자료구조이진 트리 기본 용어노드 (Node): 데이터를 저장하는 기본 단위루트 노드 (Root Node): 트리 구조에서 최상위에 있는 노드부모 노드 (Parent Node): 특정 노드의 상위에 연결된 노드자식 노드 (Child Node): 특정 노드의 하위에 연결된 노드단말 노드 (Terminal Node): 자식 노드가 없는 노드간선 (Edge): 노드와 노드 사이를 연결하는 선 컴퓨터 구조 기본 불 연산자AND 연산 : 두 조건이 모두 참일 때만 참OR 연산 : 두 조건 중 하나라도 참이면 참NOT 연산 :조건의 반대값XOR 연산 : 두 조건이 다를 때만 참NAND 연산 : AND의 부정NOR 연산 : OR의 부정불 대수의 주요 법칙항등 법칙 (Identity Law) :어떤 변수에 항등원(0 또는 1)을 연산하면 변수 자신이 나오는 법칙교환 법칙 (Commutative Law) : 연산자의 순서를 바꾸어도 결과가 같은 법칙결합 법칙 (Associative Law) :같은 연산이 여러 번 반복될 때, 연산 순서를 바꾸어도 결과가 같은 법칙분배 법칙 (Distributive Law) : 하나의 연산자가 다른 연산자에 대해 분배될 수 있는 법칙멱등 법칙 (Idempotent Law) :"동일 법칙"으로도 불리며, 같은 변수를 여러 번 연산해도 결과는 그 변수 자신인 법칙흡수 법칙 (Absorption Law) :한 변수가 그 변수를 포함하는 항과 연산될 때, 그 변수로 흡수되는 법칙드모르간 법칙 (De Morgan's Law) :논리곱(AND)이나 논리합(OR) 전체에 대한 부정을 각 변수의 부정에 대한 연산으로 변환하는 법칙
2024. 10. 27.
0
[인프런 워밍업 스터디 클럽 2기_BE] 4주차 발자국
Mock을 마주하는 자세1. Test Double 개념마틴 파울러는 테스트에서 사용되는 가짜 객체를 Test Double이라는 용어로 부르며, 이는 영화에서 스턴트 더블을 사용하는 것과 유사하게 테스트를 위해 실제 객체 대신 사용되는 모든 종류의 "대역" 객체를 의미합니다. Test Double은 다양한 상황에서 실제 객체를 대체하여 테스트를 가능하게 합니다. Test Double에는 여러 종류가 있으며, 여기에는 Dummy, Fake, Stub, Spy, Mock이 포함됩니다.2. Test Double의 종류Dummy: 아무것도 하지 않는 깡통 객체입니다. 테스트에서 단순히 자리를 채우기 위해 사용됩니다.Fake: 실제 기능을 수행하지만, 단순한 형태로 동작하는 객체입니다. 프로덕션에서 사용하기에는 부족한 부분이 있습니다. 예를 들어 FakeRepository가 해당됩니다.Stub: 테스트에서 요청한 것에 대해 미리 준비된 결과를 제공하는 객체입니다. 그 외의 요청에는 응답하지 않습니다.Spy: Stub의 역할을 하면서 호출된 내용을 기록하여 보여줄 수 있는 객체입니다. 일부는 실제 객체처럼 동작시키고 일부는 Stubbing할 수 있습니다.Mock: 특정 행동에 대한 기대를 명시하고, 그 기대에 따라 동작하도록 만든 객체입니다.3. Stub과 Mock의 차이Stub과 Mock은 모두 테스트에서 특정 객체의 역할을 대신할 수 있지만, 검증 방식과 목적이 다릅니다.차이점 요약특징 Stub Mock 목적 특정 상황을 설정하기 위해 사용 행위 자체가 올바르게 수행되는지 검증 검증 방식 상태 검증 (State Verification) 행위 검증 (Behavior Verification) 용도 테스트의 결과가 예상한 대로인지 확인 특정 메서드가 예상대로 호출되었는지 확인 예시 메서드가 호출된 후 내부 상태를 확인 메서드가 기대한 횟수만큼 호출되었는지 확인4. Mockito란?Mockito는 테스트 더블을 쉽게 만들어주는 Java 라이브러리입니다. 테스트 더블이란, 테스트에서 실제 객체 대신 사용되는 가짜 객체를 말합니다. 예를 들어, 우리가 UserService를 테스트할 때, UserService가 실제 데이터베이스를 호출하지 않게 하려면 데이터베이스와 상호작용하는 UserRepository를 가짜로 만들어서 테스트하는 방식이 있습니다. 이때 Mockito를 사용하여 UserRepository의 Mock 객체를 생성하는 것입니다.5.Mockito에서 자주 사용하는 세 가지 애노테이션1. @Mock@Mock 애노테이션은 클래스의 가짜 객체(Mock Object)를 생성하는 데 사용됩니다. 이를 통해 실제 객체와 상호작용하는 대신, 특정 상황에서 원하는 결과를 반환하도록 미리 설정할 수 있습니다.용도주로 의존성을 격리하고 테스트하려는 대상 객체와 관련된 외부 객체의 실제 구현을 대체할 때 사용합니다. 예를 들어, 데이터베이스나 외부 API 호출 같은 의존성을 제거하고 독립적으로 테스트하려는 경우 유용합니다.사용 예시@Mock private OrderRepository orderRepository; 특징@Mock 객체는 기본적으로 모든 메서드 호출에 대해 아무 동작도 하지 않으며 null, 0, false 같은 기본값을 반환합니다. 필요한 경우 특정 메서드 호출에 대한 반환값을 설정할 수 있습니다:when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); 2. @InjectMocks@InjectMocks 애노테이션은 의존성이 주입된 객체를 생성합니다. 이 애노테이션이 붙은 객체는 @Mock 또는 @Spy로 주입 가능한 필드에 대해 자동으로 주입됩니다.용도실제로 테스트하고자 하는 객체를 생성할 때 사용합니다. 테스트 대상 객체의 의존성으로 @Mock 또는 @Spy로 선언된 가짜 객체가 주입됩니다.사용 예시@InjectMocks private OrderService orderService; 특징:OrderService 내부에 있는 OrderRepository, MailService 등의 필드에 자동으로 @Mock 객체가 주입됩니다. @InjectMocks는 주로 테스트 대상 클래스에 붙이고, 해당 클래스의 의존성을 주입하기 위한 @Mock과 함께 사용됩니다.3. @Spy@Spy 애노테이션은 기존 클래스의 객체를 부분적으로 모킹할 수 있게 해줍니다. 즉, @Spy로 생성된 객체는 실제 객체처럼 동작하지만, 특정 메서드는 모킹할 수 있습니다.용도테스트 중에 실제 객체의 일부 기능은 사용하면서 특정 메서드만 모킹하고자 할 때 사용합니다.사용 예시@Spy private MailService mailService; 특징@Spy 객체는 실제 객체처럼 동작하지만, 특정 메서드에 대해서는 원하는 동작을 설정할 수 있습니다. 특정 메서드만 모킹하고 싶을 때 doReturn이나 doThrow 같은 메서드를 사용합니다:doReturn(true).when(mailService).sendEmail(anyString(), anyString(), anyString(), anyString()); 6. BDD MockitoBDD (Behavior-Driven Development) Mockito는 테스트 코드에서 행동에 기반한 검증을 가능하게 하는 Mockito의 기능입니다. BDD는 “애플리케이션이 어떻게 행동해야 하는지에 대한 공통된 이해를 구성하는 방법” 입니다.BDDMockito는 Behavior-Driven Development (행위 주도 개발) 스타일의 테스트 작성을 지원하는 Mockito의 확장 라이브러리입니다.BDDMockito의 주요 특징given-when-then 구조 BDDMockito는 테스트 코드를 given(준비)-when(실행)-then(검증) 구조로 작성하도록 돕습니다. 이 구조는 테스트의 가독성을 높이고 테스트의 의도를 명확히 합니다.스텁(Stubbing) 메서드given(): Mockito의 when() 대신 사용됩니다.willReturn(), willThrow() 등: thenReturn(), thenThrow() 대신 사용됩니다.검증 메서드then(): verify() 대신 사용됩니다.should(): 특정 동작이 수행되었는지 검증합니다.가독성 향상 BDDMockito를 사용하면 테스트 코드가 더 자연스러운 언어로 읽힙니다.7. Classicist VS. MockistClassicist (고전파) Mockist (모키스트) 상태 기반 테스트 (객체의 상태를 확인) 행동 기반 테스트 (메서드 호출을 검증) 협력 객체에 대한 신뢰를 바탕으로 테스트 협력 객체와의 상호작용을 검증 구체적인 결과를 중시 메시지 흐름과 동작의 정확성을 중시 변경에 덜 민감한 테스트 변경에 민감할 수 있음더 나은 테스트를 작성하기 위한 구체적 조언테스트 하나 당 목적은 하나테스트 하나당 목적은 하나분기문이나 반복문 이런 생각을 요하는 추가적인 고민을 필요로하는 로직들이 들어가서는 안됨완벽한 제어제어할 수 있는 값으로테스트 환경의 독립성, 테스트 간 독립성공유 변수 사용하는 것 , 한 테스트 다른 테스트 연관되는 것 피하자Test FixtureTest Fixture는 특정 항목, 장치 또는 소프트웨어를 일관되게 테스트하는 데 사용되는 장치https://velog.io/@langoustine/Test-FixturedeleteAll(), deleteAllInBatch()deleteAll()이 실행되면, findAll()의 결과로 얻은 리스트를 순회하며 데이터를 한 개씩 삭제deleteAllInBatch() 결국 테이블에 있는 데이터를 전부 지우는 DELETE 쿼리가 실행됩니다. 즉, 데이터 크기와 관계없이 한 번의 쿼리로도 Repository를 clear 할 수 있게 되므로, deleteAll() 보다는 deleteAllInBatch() 사용이 테스트 속도를 고려했을 때 우선적으로 사용하는 것이 좋음https://velog.io/@balparang/deleteAll-보다-deleteAllInBatch를-사용하자학습 테스트잘 모르는 기능, 라이브러리, 프레임워크를 학습하기 위해 작성하는 테스트여러 테스트 케이스를 스스로 정의하고 검증하는 과정을 통해 보다 구체적인 동작과 기능을 학습할 수 있다.관련 문서만 읽는 것보다 훨씬 재미있게 학습할 수 있다.Spring REST Docs란?Spring REST Docs는 테스트 코드에 기반하여 API 명세서를 자동으로 생성하는 문서화 도구입니다. 백엔드 개발자가 API를 개발하고 테스트하면서 동시에 신뢰할 수 있는 API 명세서를 만들 수 있도록 도와줍니다.Spring REST Docs의 주요 특징테스트 코드 기반 문서화: 테스트를 통과해야만 문서가 생성되므로 API 명세서의 신뢰도가 높습니다.AsciiDoc 문법을 사용한 문서화: 기본적으로 AsciiDoc 형식을 사용하여 문서를 생성합니다. AsciiDoc은 Markdown과 유사한 문법으로, 간결하고 가독성이 높은 문서를 작성할 수 있습니다.프로덕션 코드 비침투적: 문서화를 위한 설정이 프로덕션 코드와 분리되어, API 동작에는 영향을 주지 않습니다.Spring REST Docs의 장단점장점테스트와 문서가 함께 관리되므로 API 명세의 신뢰도가 높아집니다.프로덕션 코드와 분리되어 코드 유지보수와 품질에 영향을 주지 않습니다.단점테스트를 기반으로 문서가 생성되기 때문에 테스트 코드의 작성량이 많아질 수 있습니다.설정이 다소 복잡하여, 초기 세팅에 시간과 노력이 필요합니다.Spring REST Docs를 사용할 때의 유용성Spring REST Docs는 API 명세가 변경되는 경우에도 항상 최신 상태로 유지됩니다. 이는 테스트가 통과할 때만 문서가 생성되는 구조이기 때문에 가능한 것으로, 코드와 문서의 일관성을 보장합니다. 백엔드 개발자의 입장에서는 API의 품질과 신뢰도를 확보하면서, 협업을 위한 문서화도 자연스럽게 이루어지므로 유지보수가 용이해집니다.
2024. 10. 20.
0
[워밍업 클럽 스터디 2기 :: BE 클린코드 & 테스트] 3주차 발자국
단위 테스트JUNIT5 : 단위 테스트를 위한 테스트 프레임워크AssertJ : 테스트 코드 작성을 원할하게 돕는 테스트 라이브러리테스트 팁테스트하기 어려운 영역을 구분하고 분리하기테스트 하고자 하는 영역에서 테스트 하기 어려운 영역을 외부로 분리할수록 테스트 가능한 코드는 많아짐테스트하기 어려운 영역관측할 때마다 다른 값에 의존하는 코드현재 날짜/ 시간, 랜덤 값, 전역 변수/함수, 사용자 입력함수의 input에 해당외부 세계에 영향을 주는 코드표준 출력, 메시지 발송, 데이터 베이스에 기록하기함수의 output에 해당TDDTDD : 프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도록하는 방법론TDD 순환 사이클RED : 실패하는 테스트 작성Green : 테스트 통과 최소한의 코딩REFACTOR : 구현 코드 개선 테스트 통과 유지TDD 핵심 가치피드백이라는 것은 내가 작성하는 구현 코드 프로덕션 코드에 대해서 자주 그리고 빠르게 피드백을 받을 수 있다는 의미결론 선 테스트 작성, 후 기능 구현을 해야함..테스트는 []이다.기술 자체의 숙련도도 중요하지만 소프트 스킬도 중요소프트 스킬커뮤니케이션 능력태도 일에 임하는 몰입도 자세글 글쓰기 능력문서 작성 능력테스트는 왜 문서일까?TDD는 클라이언트가 되서 프로덕션의 기능들을 테스트@DisplayName("음료를 1개 추가할 수 있다.") 명사의 나열보다 문장으로테스트 행위에 대한 결과까지 기술하기도메인 용어를 사용하여 추상화된 내용 담기테스트의 현상을 중점으로 기술하지 말기BDDTDD에서 파생된 개발 방법Given : 시나리오 진행에 필요한 모든 준비 과정When : 시나리오 행동 진행Then : 시나리오 진행에 대한 결과 명시 , 검증어떤 환경에서/ 어떤 행동을 진행했을 떄 / 어떤 상태가 일어난다.→ DisplayName에 명확하게 작성할 수 있음
2024. 10. 13.
0
[워밍업 클럽 스터디 2기 :: BE 클린코드 & 테스트] 2주차 발자국
섹션 6) 코드 다듬기좋은 주석우리가 가진 모든 표현 방법을 총동원해 코드에 의도를 녹여내고, 그럼에도 불구하고 전달해야 할 정보가 남았을 때 사용하는 주석변수와 메서드의 나열 순서객체는 협력을 위한 존재외부 세계에 내가 어떤 기능을 제공할 수 있는지를 드러냄(정해진 답은 아니지만.. ) 공개 메서드를 상단에 배치하는 것이 좋음공개 메서드 : 객체에서 외부 세계에 제공할 수 있는 기능공개 메서드들끼리도 기준을 가지고 배치하는 것이 좋음중요도 순, 종류별로 그룹화하여 배치공개 메서드 중요도가 높은 순메서드에서 상태 변경메서드가 가지고 있는 상태를 변경하는 메서드판별boolean값으로 반환받는 상태조회값을 가져오는 조회 메서드비공개 메서드는 공개 메서드에서 언급된 순서대로 배치공통으로 사용하는 메서드라면 (가장 하단과 같은) 적당한 곳에 배치중요한 것은, 나열 순서로도 의도와 정보를 전달할 수 있다는 것Intellij IDE 활용코드 포맷 정렬 단축키 : Ctrl + ALT + LSonarlint : 오류, 버그, 스타일 등을 알려주어 문제점 개선을 도와주는 Plugin.editorConfig : 확장자마다 스타일을 다르게 줄수 있게 도와주는 설정파일섹션 8) 기억하면 좋은 조언들능동적 읽기복잡하거나 엉망인 코드를 읽고 이해하려 할 때, 리팩토링하면서 읽기공백으로 단락 구분하기메서드와 객체로 추상화 해보기주석으로 이해한 내용 표기하며 읽기git reset --hard 가 있다핵심목표는 우리의 도메인 지식을 늘리는 것, 그리고 이전 작성자의 의도를 파악하는 것오버 엔지니어링필요한 적정 수준보다 더높은 수준의 엔지니어링ex) 구현체가 하나인 인터페이스인터페이스 형태가 아키텍처 이해에 도움을 주거나 근시일 내에 구현체가 추가될 가능성이 높다면 Ok구현체를 수정할 때마다 인터페이스도 수정해야 함코드 탐색에 영향을 줌. 애플리케이션이 비대해 짐ex) 너무 이른 추상화정보가 숨겨지기 때문에 복잡도가 높아진다.후대 개발자들이 선대의 의도를 파악하기가 힘들다.은탄환은 없다.만능해결사는 없다!클린 코드도 은탄환이 아니다.실무 : 2가지 사이의 줄다리기지속 가능한 소프트웨어의 품질 VS 기술 부채를 안고 가는 빠른 결과물대부분의 회사는 돈을 벌고 성장해야 하고 시장에서 빠르게 살아남는 것이 목표이런 경우에도 클린 코드를 추구하지 말라는 것이 아니라 미래 시점에 잘 고치도록 할 수 있는 코드 센스가 필요하다. 결국은 클린 코드의 사고법을 기반으로 결정하는 것모든 기술과 방법론은 적정 기술의 범위 내에서 사용되야 함도구라는 것은 일단 그것을 한계까지 사용할 줄 아는 사람이 그것을 사용하지 말아야 할 때도 아는 법적정 수준을 알기 위해, 때로는 극단적으로 시도해보자클린코드는 도구이다. 필요한 상황에서 적정 기술을 사용하도록 하자회고 읽기 쉬운 코드로 다른 동료 개발자가 내가 작성하고 있는 코드를 파악하기 쉽게 하는 것이 중요하다.회사에서 주어진 규칙 내에서 회사 내 코드를 능동적으로 읽고 필요에 따라서 툴을 사용하여 코드를 정리하며 코드를 다듬는 습관을 들이자
2024. 10. 06.
0
[워밍업 클럽 스터디 2기 :: BE 클린코드 & 테스트] 1주차 발자국
1주차에서 배운 내용 중 가장 중요한 주제는 추상화라고 생각한다.섹션 2 추론에서는 프로그램은 데이터와 코드의 조합으로 구성되어 있고 코드 설계 시 중요한 정보는 남겨 데이터를 관리하는 코드에서 중요한 말만을 남겨 놓는다. 이렇게 추상화를 할 때 높은 추상화와 낮은 추상화가 격으로 나눠지는데 클린 코드를 함에 있어 main 부분에는 고수준 추상화를 남겨 놓구 구현부에 저수준 추상화를 하여 동료 개발자가 유지보수하기 편하게 약속을 정할 수 있다.결국, 구체로 부터 추상을 해내고 정보를 덜어내고 가장 중요한 정보는 남기고 추상화 과정은 컴퓨터 과학의 본질이고 도메인 개념에서 추상화 하는 작업을 해나가야 한다.. 섹션3 논리, 사고의 흐름에서는 Early return 으로 else의 사용추상화를 통한 사고 과정의 depth를 줄이는 것이 중요공백으로 문단 나누자코드(조건문 등)에서 부정어구(!)를 가급적 피하자예외 발생 중 NPE에 대한 부분을 처리하는데 있어 Optional에 대해 배웠음orElseThrow() : 선택적 값이 존재하지 않으면 NoSuchElementException 같은 예외를 발생시키며, 존재하면 그 값을 반환orElse() : 선택적 값이 없으면 괄호 안에 정의된 기본 값을 반환orElseGet() : 선택적 값이 없으면, orElseGet()에 전달된 람다식이나 메서드가 실행되어 그 값을 반환섹션 4 객체 지향 패러다임에서는 SOLID에 대해서 배웠다.1. SRP(Single Responsibility Principle)하나의 클래스는 단 한가지의 책임(변경 이유)만을 가져야 함2. OCP (Open-Closed Principle)확장에는 열려있고 수정에는 닫혀 있어야 함기존 코드 변경 없이 시스템의 기능을 확장할 수 있는 코드로 실무에서 구현LSP (Liskov Subsitution Principle)상속 구조에서 자식 클래스는 책임을 담당하고 부모 클래스의 행동을 변경하지 않아야 함ISP ( Interface Segregation Principle)인터페이스 스펙을 분리하여 구현체가 불필요한 스펙까지 상속하지 않아야 함인터페이스가 여러 기능을 포함하고 있으면 결합도가 증가인터페이스를 분리구현체가 분리된 인터페이스를 상속하여 사용하고자하는 스펙만을 사용하도록 함DIP (Dependency Inversion Principle)고수준 모듈은 저수준 모듈을 직접적으로 의존하기 보단 중간에 인터페이스를 생성하고 인터페이스에 의존하도록 함고수준 : 추상화 레벨이 높은 것저수준 : 추상화 레벨이 높은 것의존성 순방향 : 고수준 모듈이 저수준 모듈을 참조의존성 : 하나의 모듈이 다른 하나의 모듈을 알고 있거나 직접적으로 생성하거나 사용하는 모든 것해당 내용을 배웠다.