블로그
전체 10#카테고리
- 알고리즘 · 자료구조
- 백엔드
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 발자국
[3주차 학습 내용]동적 프로그래밍메모이제이션: 계산 결과를 기억해 중복된 계산을 하지 않는 기법 속도는 빠르지만 메모리의 사용량이 있다.하향식 타뷸레이션: 계산에 필요한 값을 전부 계산 한 뒤 테이블에 저장하는 기법상향식 운영체제페이지드 세그멘테이션, 디맨드 페이징, 페이지 교체 정책스레싱과 워킹셋, 입출력 장치,파일 시스템회고개념을 간단히 정리할 수 있는 시간이 있어 좋았고 한번 더 복습하고 부족한 부분을 찾아 보면서 공부해야겠다.
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 미션
3주차 미션운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터CPU 내부에 있는 초고속 메모리용량이 적고 가격이 비쌈휘발성의 성질을 가져 컴퓨터가 종료되면 데이터도 같이 사라짐캐시 메모리CPU와 RAM 사이에서 데이터 속도를 높이기 위한 메모리메인 메모리와 레지스터 사이 속도 차이가 있어서 필요한 데이터를 미리 가져와 저장하는 공간메인 메모리실행 중인 프로그램과 데이터를 저장휘발성 메모리보조기억장치데이터를 영구 저장하는 장치 (비휘발성)속도는 RAM보다 느리지만 대용량 저장 가능사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터프로세스가 접근할 수 있는 메모리의 최대 범위를 저장경계 레지스터 값을 벗어나면 프로세스를 종료메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?고정 분할 방식 (Fixed Partitioning)장점:같은 크기로 나누어 관리가 쉽고 구현이 간단하며 오버헤드가 적음단점:내부 단편화 발생 → 프로세스가 할당된 파티션보다 작으면 공간 낭비파티션 크기를 적절히 설정해야 하므로 유연성이 부족함가변 분할 방식 (Variable Partitioning)장점:내부 단편화 문제 해결 → 필요한 만큼만 메모리를 할당하므로 공간 낭비가 적음파티션 크기를 유연하게 조정 가능해 고정 분할 방식보다 유연한 운영 가능단점:외부 단편화 발생 → 작은 빈 공간이 여기저기 생겨 전체 메모리를 충분히 활용하기 어려움CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱멀티프로그래밍을 과도하게 증가시켜 페이지 부재 증가프로세스가 실제 작업을 수행하지 못하고 페이지 교체 작업에만 CPU 자원을 소비HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?이유를 함께 적어주세요. 실행 시키기엔 필수가 아니지만 휘발성 메모리를 실행하고 종료할때 데이터가 날아가기 때문에 저장할 수 있는 공간인 HDD/SSD는 꼭 필요하다고 생각함.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하면, 운영체제는 파일이 저장된 위치를 빈 공간으로 표시할 뿐, 실제 데이터는 그대로 남아 있어 새로운 데이터가 덮어 쓰기 전에는 복구가 가능함.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬장점: 거의 정렬된 배열에서는 빠르게 정렬 가능 , 구현이 쉬움단점: 큰 데이터는 비효율적시간복잡도: O(n²) (평균/최악) O(n) (최선)선택정렬장점: 추가적인 메모리 사용이 거의 없음단점: 데이터의 크기가 커질수록 성능이 매우 떨어짐시간복잡도: O(n²) (평균/최선/최악)삽입정렬장점: 거의 정렬된 배열에서는 매우 빠름단점: 선택 정렬과 비슷하게 데이터 크기가 커질수록 성능이 떨어짐시간복잡도: O(n²) (평균/최악) O(n) (최선)병합정렬장점: 큰 데이터를 정렬하는 데 적합하고 최악의 경우에도 O(n log n)을 보장단점: 이해와 구현이 어려움. 메모리 공간을 차지함시간복잡도: O(n log n) (평균/최선/최악)퀵정렬장점: 평균적으로 가장 빠른 정렬 알고리즘 중 하나단점: 피벗 선택이 잘못되면 성능이 급격히 떨어짐 (O(n²))시간복잡도: O(n log n) (평균/최선) O(n²) (최악)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요. 메모리가 부족한 환경에서는 스택 메모리를 많이 쓰는 재귀보다 반복문 기반의 타뷸레이션이 효율적일 것 같다 생각합니다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] CS - 2주차 발자국
학습 내용자료구조와 알고리즘재귀프로그래밍에서 콜스택과 같다.콜스택은 함수가 호출되면서 올라가는 메모리 영역상향식 재귀와 하향식 재귀가 존재 (재귀 함수를 사용하는 방식과 반복문을 사용하는 방식)버블 정렬: 앞과 뒤의 값을 비교해서 자리를 비교하는 알고리즘가장 단순하지만 성능이 좋지 않다.O(n^2)의 시간복잡도를 가지고 있다.선택 정렬: 정렬되지 않은 첫번째 값을 시작으로 마지막 원소까지 비교하여 가장 작은 값과 자리를 바꾸는 알고리즘이해와 구현이 간단하지만 버블정렬과 마찬가지로 O(n^2)의 시간복잡도를 가지고 있다.삽입 정렬: 정렬되지 않은 영역에서 데이터를 꺼내 정렬된 영역에 데이터 삽입버블 정렬과 선택 정렬과 장단점은 같음O(n^2)의 시간복잡도를 가지고 있다.데이터 삽입 시 역순으로 순회하면서 삽입할 원소와 비교 후 오른쪽 원소에 덮어 쓰기 진행.운영체제SJF, RR, MLFQ, 프로세스 간 통신, 공유자원과 임계구역, 세마포어, 모니터데드락, 교착상태 회피, 메모리 종류회고간단하게 정리하여 복습하는 시간을 가질 수 있어서 좋았다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] CS - 2주차 미션
2주차 미션운영체제FIFO 스케줄링의 장단점이 뭔가요?장점 : 먼저 들어온 작업을 먼저 처리하는 방식으로 구현이 단순하고 직관적단점 : 작업시간이 긴 작업이 앞에서 발생한다면 이 작업이 끝날때 까지 완전 끝날때 까지 뒤에 있는 작업들이 비효율적으로 대기시간이 길어짐. 대기시간이 길어지면 응답 시간이 길어질 수 있음.SJF를 사용하기 여러운 이유가 뭔가요?실행 시간 예측이 불가능 하고, burst time이 긴 프로세스가 아주 오랫동안 실행이 되지 않을 수 있음. burst time이 짧은 프로세스가 중간에 계속 들어오면 burst time이 긴 프로세스는 계속 뒤로 밀림.RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?컨텍스트 스위칭이 많이 발생해 오버헤드가 증가함.운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은 것이므로 I/O Bound Process라고 취급한다.반대로 타임 슬라이스 크기를 오버하여 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU Bound Process라고 취급한다.공유 자원 이란 무엇인가요?여러 프로세스가 동시 접근하여 사용하는 자원 (EX 파일)여러 프로세스가 사용하기에 Race Condition , Deadlock 등의 문제가 발생 할 수 있음문제 해결을 위해 여러 프로세스가 동시에 사용되면 안되는 구역인 임계구역을 설정하고 관리 해야함.,교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호 배제(Mutual Exclusion)한 번에 한 프로세스만 자원을 사용할 수 있어야 함.점유와 대기(Hold and Wait)이미 자원을 가진 프로세스가 추가 자원을 기다려야 함.비선점(No Preemption)프로세스가 자원을 강제로 빼앗길 수 없어야 함.순환 대기(Circular Wait)프로세스들이 원형으로 자원을 점유한 채 서로 기다려야 함.자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?기저조건이 없으면 무한 루프에 빠져 스택 오버 플로우가 발생할 수 있고 , 불필요한 연산이 증가 하여 성능이 저하됨.0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function OddSum(n){ if (n 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); // 파일을 이용하는 모듈 const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈 function traverseDirectory2(directory) { const files = fs.readdirSync(directory); for (const file of files) { const filePath = path.join(directory, file); const fileStatus = fs.statSync(filePath); // 파일 정보 가져오기 if (fileStatus.isDirectory()) { console.log('디렉토리:', filePath); traverseDirectory(filePath); // 재귀 호출 } else { console.log('파일:', filePath); } } } traverseDirectory("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
2025. 03. 09.
0
[인프런 워밍업 클럽 3기] CS - 1주차 발자국
학습 내용자료구조와 알고리즘 시간 복잡도 배열, 연결 리스트, 스택, 큐, 덱, 해시 테이블, 셋자료구조 7가지 구현하기 운영체제운영체제 개념프로세스와 쓰레드에 대한 개념 및 관리 방법CPU 스케줄링에 대한 개념 및 동작 방법 회고항상 배운 것에 복습하는 부분이 약하여 스터디에 지원하였다다시 한번 아는 것에 대한 정리와 복습을 하고 다시 개념 정리를 하는 시간을 가질 수 있어 너무 유익했다오히려 복잡하게 생각해 간단하게 설명을 하지 못한 부분을 강의를 통해 간단하게 정리할 수 있고머리 속으로도 정리 할 수 있어 더 성장 할 수 있을 거 같다.꼭 들었던 강의를 한번씩 더 복습하는 습관을 길러야겠다.
2025. 03. 09.
0
[인프런 워밍업 클럽 3기] CS - 1주차 미션
1주차 미션운영체제 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식 입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?폴링 방식을 사용하게 되면 CPU가 주기적으로 이벤트 발생 여부를 확인하는데 불필요한 연산 때문에 성능이 좋지 않고 , 계속 이벤트 체크를 해주어야 하기 때문에 자원이 낭비되는 문제가 발생함.이를 위해 인터럽트 방식을 사용해야 한다.인터럽트 방식은 이벤트가 발생했을 때 , 서비스 루틴(ISR)을 실행하여 이벤트를 처리하고 ISR은 비동기적으로 동작해 성능이 좋음. 프로그램과 프로세스가 어떻게 다른가요?프로그램 : 저장 장치에 저장된 명령문의 집합체 (파일 , 코드)를 뜻함프로세스 : 메모리에 올라가 실행중인 프로그램을 의미 멀티 프로그래밍과 멀티 프로세싱이 어떻게 다른가요?멀티 프로그래밍 : 메모리에 여러 프로세스가 올라온 형태멀티 프로세싱 : CPU 여러 개를 사용해 여러 작업을 동시에 처리하는 방식멀티 프로그래밍은 동시에 실행하는것 처럼 시분할 방식을 가지고 , 멀티 프로세싱은 병렬처리가 이루어져 여러 프로그램을 동시에 실행함. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB를 사용. 프로세스가 만들어지면 운영체제는 프로세스 정보를 가지고 있는 PCB를 생성. PCB 는 서로 연결되어 있는 연결 리스트 형태를 가지고 프로세스를 효율적으로 관리함.컨텍스트 스위칭이란 뭔가요?CPU가 실행 중인 프로세스를 변경할 때 , 현재 실행중인 프로세스의 상태를 저장하고 , 다른 프로세스의 상태값으로 교체.컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경되며 , 컨텍스트 스위칭이 자주 일어나는 환경에서는 오버헤드가 발생할 가능성이 있음.자료구조 & 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시맵을 사용하여 빠르게 검색하고 중복을 피하기 위해 키-값 저장을 할 수 있는 해시맵을 사용할 것같습니다. 학생의 고유 값인 학번 이나 이름을 키로 사용해 빠르게 검색하는 부분에 효율적으로 저장/관리 할 것 같습니다.여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.주문이 들어온 순서라면 큐를 사용하여 먼저 들어온 주문을 먼저 처리(FIFO) 선입선출 방식으로 처리하고 데이터의 삽입 삭제가 O(1)로 효율적인 처리가 가능하기 때문입니다.우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요. public class Stack { private final int[] stack; // 스택 배열 생성 private final int capacity; private int size; public Stack(int capacity) { this.capacity = capacity; this.stack = new int[capacity]; this.size = 0; } public static void main(String[] args) { Stack stack = new Stack(3); stack.push(1); stack.push(2); stack.push(3); stack.push(4); // 스택의 사이즈가 0일 경우 -1 return System.out.println(stack.peek()); // 제일 스택 위에 있는 값 3 System.out.println(stack.pop()); // 3 System.out.println(stack.pop()); // 2 System.out.println(stack.pop()); // 1 System.out.println(stack.pop()); // -1 } // 스택이 비었는지 검증 public boolean isEmpty() { return size == 0; } // 스택이 가득 차있는지 검증 public boolean isFull() { return size == capacity; } // 데이터 삽입 (출구 쪽에 삽입) public void push(int data) { if (isFull()) { // 가득 차있을경우는 스택에 값을 삽입하지 않음. return; } // 마지막 인덱스에 삽입 stack[size] = data; size++; } // 데이터 삭제 (출구 쪽에서 삭제) public int pop() { if (isEmpty()) { // 스택에 값이 없을경우 -1 return return -1; } // 마지막 인덱스의 데이터 반환 후 크기 감소 int poppedValue = stack[size - 1]; size--; return poppedValue; } // 스택 가장 위의 값 public int peek() { if (isEmpty()) { // 스택이 비었을 때 검증 return -1; } return stack[size - 1]; } }해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.(힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력)hashFunction(name){ let hashValue = 0; for (let i = 0; i
알고리즘 · 자료구조
2024. 10. 27.
0
워밍업 클럽 스터디 2기 [클린코드 & 테스트코드] - 4주차 회고
4주차 회고1. Mock을 마주하는 자세Test DoubleDummy : 아무 것도 하지 않은 깡통 객체Fake : 단순한 형태로 동일한 기능은 수행하나 , 프로덕션에서 쓰기에는 부족한 객체Stub : 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체. 그 외에는 응답하지 않는다Spy : Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체. 일부는 실제 객체처럼 동작시키고 일부만 Stubbing할 수 있다. (상태 검증)Mock : 행위에 대한 기대를 명세하고 , 그에 따라 동작하도록 만들어진 객체 (행위 검증)2. 더 나은 테스트를 작성하기 위한 구체적 조언한 문단에 한 주제하나의 테스트가 한 문단이라고 생각한다면 하나의 테스트는 하나의 주제만을 가져야 한다.테스트 환경의 독립성을 보장하자다른 테스트에 영향을 주지 않아야함테스트 간 독립성을 보장하자두개 이상의 테스트에 대해 서로 영향을 주지 않아야함Test Fixture 구성하기fixture : 고정물 , 고정되어 있는 물체테스트를 위해 원하는 상태로 고정시킨 일련의 객체Test Fixture 클렌징deleteAll vs deleteAllInBatch , Text Fixture를 정리하고 초기화@ParameterizedTestif문 같은 논리 구조가 들어가는 경우 지양하기하나의 테스트에 값이 바뀌는 경우 사용@DynamicTest인스턴스의 여러 시나리오 테스트할 경우 사용3. Appendix학습 테스트잘 모르는 기능 , 라이브러리 , 프레임워크를 학습하기 위해 작성하는 테스트여러 테스트 케이스를 스스로 정의하고 검증하는 과정을 통해 보다 구체적인 동작과 기능을 학습할 수 있다.관련 문서만 읽는 것보다 훨씬 재밌게 학습할 수 있다.Spring Rest Docs테스트 코드를 통한 API 문서 자동화 도구API 명세를 문서로 만들고 외부에 제공함으로써 협업을 원활하게 한다.기본적으로 AsciiDoc을 사용하여 문서를 작성한다Rest Docs vs SwaggerRestDocs장점테스트를 통과해야 문서가 만들어진다. (신뢰도가 높다)프로덕션 코드에 비침투적이다단점코드 양이 많다설정이 어렵다Swagger장점적용이 쉽다문서에서 바로 API 호출을 수행해볼 수 있다.단점프로덕션 코드에 침투적이다.테스트와 무관하기 때문에 신뢰도가 떨어질 수 있다.회고워밍업 클럽 2기의 모든 일정이 끝낫다. 한달이 어떻게 지나갔는지 모르도록 많이 바뻐서 따라가기 힘들었지만 일정을 따라가면서 소화한것이 뿌듯하다. 읽기 좋은 코드와 테스트 코드에 지식이 한줄 추가 된거같다. 시간이 될때 한번 부족한 부분에 대한 복습을 해야할 것 같다.
2024. 10. 20.
0
워밍업 클럽 스터디 2기 [클린코드 & 테스트코드] - 3주차 회고
3주차 회고1. 단위 테스트테스트하기 어려운 영역을 구분하고 분리하기외부로 분리할수록 테스트 가능한 코드는 많아진다.테스트가 어려운 부분을 분리해서 테스트 가능한 영역을 많이 만들자테스트하기 어려운 영역관측할 때마다 다른값에 의존하는 코드현재 날짜/시간 , 랜덤값 , 전역 변수 / 함수 , 사용자 입력외부세계에 영향을 주는 코드표준 출력 . 메세지 발송 , db에 기록하기 등순수함수 (테스트하기 쉬운 함수)같은 입력에는 항상 같은 결과외부 세상과 단절된 형태테스트하기 쉬운 코드 lombok@Data , @Setter , @AllArgsConstructor 사용 지양양방향 연관관계 시 @ToString 순환 참조 문제2. TDD프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 방법론테스트를 먼저 작성하고 기능 구현red - 실패하는 테스트 작성green - 테스트 통과 최소한의 코딩refactor(blue) - 구현 코드 개선 , 테스트 통과 유지선 기능 구현 , 후 테스트 작성테스트 자체의 누락 가능성특정 테스트 케이스(해피 케이스)만 검증할 가능성잘못된 구현을 다소 늦게 발견할 가능성선 테스트 작성 , 후 기능 구현복잡도가 낮은 (유연하고 유지보수가 쉬운) 테스트 가능한 코드를 구현할 수 있다쉽게 발견하기 어려운 엣지 케이스를 놓치지 않게 해준다구현에 대한 빠른 피드백을 받을 수 있다과감한 리팩토링이 가능해진다 회고시험이 있어서 진도를 많이 따라가지 못해서 돌아오는 주에는 진도를 열심히 따라가야겠다.단위 테스트 작성 과제를 제출하지 못했지만 추후에 강의를 다듣고 한번 진행해보는게 좋을거 같다.
2024. 10. 13.
0
워밍업 클럽 스터디 2기 [클린코드 & 테스트코드] - 2주차 회고
2주차 회고6. 코드 다듬기주석을 사용할 때 양면성과 언제 주석을 사용하고 주석 사용할 시 주의 사항을 학습변수 , 메서드를 나열 하는 순서를 고려할 때 어떤 시각을 가지고 고려하면 좋을지 학습패키지를 나눌 때 어떻게 정보를 제공하고 관리하는지 학습7. 리팩토링studycafe를 가지고 리팩토링을 진행 (Day7미션)코드의 중복 제거를 첫 순서로 시작하여 리팩토링 진행일급 컬렉션 적용 할 수 있는 부분을 찾아서 리팩토링객체의 책임 분리도메인 개념을 발견하여 리팩토링8. 기억하면 좋은 조언들능동적 읽기 오버 엔지니어링은탄환은 없다 회고Day7 미션을 하면서 내가 생각한 부분보다 더 디테일한 부분에 대해 배울 수 있었다.내가 생각한대로 리팩토링 할려하는데 시간이 없어서 강의를 참고하게 되어서 아쉬웠다.다음주도 시험이 겹쳐서 힘들겠지만 커리큘럼을 잘 따라가 마무리하고싶다.
2024. 10. 06.
0
워밍업 클럽 스터디 2기 [클린코드 & 테스트코드] - 1주차 회고
1주차 회고1. 추상중요한 정보를 잘 전달하고 전달하지 않아도 되는 정보는 생략하여 간결하게 만듬내 코드를 다른 사람이 알기 쉽도록 메서드명을 명확하게 지어냄코드 레벨에서 추상화 레벨을 일관적으로 유지메서드 선언부를 void 대신 반환할 값이 있는지 고민하여 테스트시 용이할 수 있도록 반환값 부여매직 넘버 , 매직 스트링을 상수로 추출하여 가독성 향상추상과 구체에 관한 미션2. 논리 , 사고의 흐름early return을 사용하여 else , else-if 사용을 지양추상화를 통한 사고과정의 depth를 줄이기. (중첩 분기분 , 반복문이 사고하는것에 도움이 된다면 그대로 두는것도 좋음)공백라인을 사용해 의미단위를 끊어서 정보전달이 수월하게 함부정어는 읽는사람을 한번더 생각하게 만들기 때문에 부정어를 사용하는 것을 지양의도한 예외와 의도치 않은 예외를 구분하고 커스텀 exception과 exception 클래스를 정의하고 exception handler를 만들어 처리optional orElse , orElseGet , orElseThrow3. 객체 지향 패러다임무분별한 getter 사용 자제 - getter 사용하기 이전 객체에게 메세지를 보내는 방법 고려setter 사용 자제 SOLID + 코드 리팩토링 미션 진도를 정해진 하루 양보다 다 따라잡지 못했고 정리하면서 듣지 않고 흘러가는대로 듣기만 한거 같아서 아쉬웠다. 강의와 미션에서 배운 것을 실무에서 직접 프로젝트를 만들때 한번 더 고려하고 생각해봐야 겠다.
백엔드