블로그

V_브이_v

[인프런 워밍업 클럽 스터디 2기]: JPA가 그래서 뭔데;;

인프런 스터디 2주차 발자국입니다.이번 주는 강의를 들으면서 진도를 수행하던 중에 PROJECT_SKILL 테이블이 h2 DB에서 조회되지않는 문제를 발견하고 왜 안되는지 찾아보았고 그과정에서 JPA: 영속성 콘텍스트 라는 녀석 때문에 테이블이 생성되지않았다는 점을 배웠습니다.그래서 이번주는 JPA와 영속성 콘텍스트에 대해서 혼자 자습을 조금 해보았는데,,,너무 혼자 시간을 허비한거 같습니다궁금한 내용들이 꼬리를 물고 계속 생겨서 🫤 차라리 쉽게 설명해주는 강의를 찾아서 배웠으면금방 지나갈 거 같은 개념에 시간을 많이 쓴거 같아 아쉬웠습니다.아무튼 아래는 이번주에 혼자 자습하면서 배워본 내용들을 정리한 것입니다.전부 다 외운건 아니고 어느정도? 얕게는 이해를 마쳤다고 생각합니다.혹시나 틀린 내용이 있다면 지적 부탁드립니다. 감사합니다.0. ORM이란 무엇인가ORM(Object-Relational Mapping)은 객체 지향 프로그래밍에서 데이터베이스와 상호작용하기 위한 기술로, 객체와 관계형 데이터베이스 간의 데이터를 매핑하여 변환하는 역할을 합니다. ORM은 데이터베이스의 테이블과 객체 지향 언어의 클래스를 연결해주어, 개발자가 SQL 쿼리 없이도 객체를 사용하여 데이터베이스 작업을 수행할 수 있게 합니다.ORM의 주요 개념객체 지향적인 접근: ORM을 사용하면 데이터베이스의 테이블을 객체로 다룰 수 있다.이는 데이터베이스의 행(row)을 객체의 인스턴스로 변환하고, 컬럼을 객체의 속성으로 변환하는 것을 의미한다.자동화된 매핑: ORM은 SQL 쿼리 생성과 데이터베이스와의 상호작용을 자동으로 처리하므로, 개발자가 비즈니스 로직에 집중할 수 있게 도와준다.대표적인 ORM 도구: Hibernate, JPA(Java Persistence API), MyBatis 등이 있다.   1. JPA란 무엇인가JPA(Java Persistence API)는 ORM 기술의 표준 인터페이스로, 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 명세를 제공한다. JPA는 직접적으로 ORM 기능을 제공하는 것이 아니라, ORM 기술을 위한 규칙과 표준을 정의하여, 다양한 구현체(Hibernate, EclipseLink 등)가 기능을 수행함.JPA의 정의 및 역할ORM 표준 인터페이스: JPA는 ORM 기술의 표준을 정의하여, 개발자가 특정 구현체에 의존하지 않고 일관된 방식으로 데이터를 처리할 수 있게 한다.구현체의 예시: JPA의 구현체로는 Hibernate, EclipseLink, OpenJPA 등이 있으며, 이들 구현체는 JPA의 인터페이스를 구현하여 실제 데이터베이스 작업을 수행한다.개발자들이 JPA를 사용하는 이유생산성 향상: JPA는 데이터베이스 작업을 객체 지향적으로 처리할 수 있게 함으로써, SQL 쿼리 작성의 부담을 줄이고 코드의 가독성을 높인다.유지보수 용이성: 엔티티 매핑을 통해 데이터베이스의 구조 변경에 따른 코드 변경을 최소화할 수 있다.데이터베이스 독립성: 특정 데이터베이스에 종속되지 않으며, 다양한 데이터베이스로 쉽게 이식할 수 있는 애플리케이션을 구축할 수 있다. JPA를 사용할 때 주의해야 할 사항성능 문제: 잘못된 엔티티 설계나 관계 매핑으로 인해 성능 문제가 발생할 수 있으므로, 캐시와 페치 전략을 적절히 사용해야 합니다.복잡한 설정: 영속성 컨텍스트, 트랜잭션 관리, Fetch 전략 등 복잡한 설정과 개념을 이해하지 않으면 예상치 못한 동작이 발생할 수 있습니다.자동 쿼리 생성 기능의 오해: Spring Data JPA에서 제공하는 기능과 JPA 자체의 기능을 혼동하지 않도록 주의해야 합니다. 2. JPA의 특징객체 지향적인 데이터베이스 접근: JPA는 데이터를 객체로 매핑하여 직접 조작할 수 있게 합니다. 이를 통해 SQL의 복잡한 문법 없이도 데이터를 처리할 수 있습니다.자동화된 데이터베이스 스키마 관리: JPA의 스키마 설정 옵션(create, update, validate 등)을 통해 데이터베이스 스키마를 자동으로 생성하거나 검증할 수 있습니다.1차 캐시: JPA 표준에서 지원하는 기능으로, 영속성 컨텍스트 내에서 관리되며 트랜잭션 범위 내에서 데이터를 캐시한다. 동일한 트랜잭션 내에서는 데이터베이스에 재접근하지 않고 메모리에 저장된 엔티티를 사용한다.2차 캐시: JPA 표준에는 포함되지 않고, JPA의 구현체(예: Hibernate)에서 지원하는 기능이다. 2차 캐시는 애플리케이션 범위에서 동작하며, 여러 영속성 컨텍스트 간에 데이터를 공유하여 성능을 최적화한다. 이를 사용하려면 Ehcache, Hazelcast, Infinispan 등과 같은 캐시 프로바이더를 통합해야 한다고 하는데 아직 무슨 말인지 잘 모르겠다...영속성 컨텍스트: 엔티티 매니저가 관리하는 영속성 컨텍스트는 엔티티의 상태를 추적하고, 동일한 트랜잭션 내에서 동일한 데이터를 캐싱하여 성능을 향상시킬 수 있다.Fetch 전략: 데이터 로딩 방식으로 즉시 로딩(EAGER)과 지연 로딩(LAZY)이 있으며, 성능과 자원 사용을 최적화할 수 있다.Cascading(영속성 전이): 부모 엔티티의 상태 변경이 자식 엔티티에도 자동으로 전이되도록 설정할 수 있다.영속성 콘텍스트에 대해서도 자습했는데 아직 내용이 정리되지않아서 다음번 블로그 글에서 작성해보도록 하겠습니다.  

스프링자바JPA

yeonjin1939

[인프런 워밍업 클럽 CS 2기] 2주차 미션

운영체제 FIFO 스케줄링의 장단점이 뭔가요?장점단순하며 직관적입니다.단점한 프로세스가 완전히 끝나야만 다음 프로세스 진행이 가능하다는 점에서 실행 시간이 짧고 늦게 도착한 프로세스가 실행 시간이 길고 빨리 도착한 프로세스의 작업을 기다려야 합니다.I/O 작업이 있을 시 CPU는 작업이 끝날 때 까지 쉬기 때문에 효율성이 낮습니다. SJF를 사용하기 어려운 이유가 뭔가요?두 가지의 이유가 있습니다.어떤 프로세스가 얼마나 실행될지 예측이 어렵습니다.Burst Time이 긴 프로세스는 Burst Time이 짧은 프로세스 작업이 계속 들어올 시 순서가 계속 밀려나 아주 오랜 시간 동안 실행되지 못할 수 있습니다. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요? 타임 슬라이스 값이 아주 작을 경우, 잦은 컨텍스트 스위칭 발생으로 오버헤드가 커집니다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU Bound Process는 CPU 사용 시간이 길기 때문에 CPU를 스스로 반납 하는 경우가 적고 타임 슬라이스 크기를 오버해 CPU를 강제로 빼앗기는 상황이 많습니다I/O Bound Process는 CPU 사용 시간이 짧기 때문에 CPU를 스스로 반납 하는 경우가 많습니다. 공유자원이란무엇인가요? 프로세스 간 통신(IPC)을 할 때 공동으로 이용하는 변수나 파일을 뜻합니다. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?교착상태가 발생하려면 다음의 네 가지 조건을 모두 충족해야 합니다.상호 배제: 어떤 프로세스가 리소스를 점유 했다면 다른 프로세스에게 해당 리소스는 공유 되면 안된다.비선점: 어떤 프로세스가 리소스를 점유 했다면 다른 프로세스는 해당 리소스를 빼앗을 수 없다.점유와 대기: 어떤 프로세스가 리소스를 가지고 있는 상태에서 다른 리소스를 원하는 상태원형 대기: 점유와 대기를 이루는 프로세스들이 원형을 이루는 형태  자료구조와 알고리즘 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?자기 자신을 계속 호출하며 메모리가 가득 찰 때까지 반복합니다. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ if (n <= 0) { return 0; } if (n % 2 !== 0) { return n + sumOdd(n - 2); } else { return sumOdd(n - 1); } } console.log(sumOdd(10)) // 25

CS자료구조알고리즘운영체제

Jiyeon Hwang

[인프런 위밍업 클럽 2기 디자인] 2주차 발자국 및 회고

인프런 위밍업 클럽 2기 2주차  일주일간의 학습에 대한 회고 컴포넌트 주제로 학습하면서 입력, 디스플레이, 피드백 등 다양한 종류의 컴포넌트를 만들 수 있다는 것을 알게 되었습니다. 매일 커리큘럼에 따라 진도를 나가면서 재사용되는 UI 요소를 효율적으로 관리할 수 있는 컴포넌트와 인스턴스 개념을 익혔고, 디자인 시스템이 더 매력적으로 느껴졌습니다. 아직 디자인 시스템이나 피그마에 대한 기본적인 지식은 부족하지만, 강의를 따라가며 하나씩 배워가는 재미가 있었습니다. 다만, 미션이 3개나 있어서 체력적으로 힘들었습니다. 다음 주도 걱정이네요.ㅠ  일주일 동안 잘한 점 하루 목표량을 꾸준히 지킨 점 미션 포기하지 않은 점 아쉬웠던 점 오토 레이아웃(Fill, Hug, Fix)과 컴포넌트에 대해 개념을 정확하게 이해하기보다는 대략 느낌으로 학습한 것 같음 보완하고 싶은 점 체력적으로 힘들어서 복습하지 못한 점 아직 컴포넌트를 완벽하게 마스터하지 못했기 때문에 다음주에는 더 명확하게 정리해 보고 싶음 다음 주에는 기본적으로 커리큘럼을 따라 학습하고, 미션도 포기하지 않고 끝까지 해내고 싶습니다. 이번 주 한번 포기할지 고민했던 순간이 있었거든요.

UX/UI디자인시스템

[인프런 워밍업 스터디 클럽 2기 백엔드] 2주차

해당 글은 인프런 박우빈 강사님의 「Readable Code: 읽기 좋은 코드를 작성하는 사고법」을 바탕으로 작성하였습니다.  2주차 요약해당 블로그 글에는 강의에 등장하는 예시 코드는 작성하지 않고, 이론적인 부분만 요약해 작성합니다. 예시 코드는 우빈 님의 git repository에서 다운 받을 수 있습니다. 주석의 양면성 - 주석은 죄악이다 vs 어느 정도는 남겨라!주석이 많다는 것은 비즈니스 요구사항을 코드에 잘 녹이지 못했다는 이야기코드를 설명하는 주석 → 주석에 의존하는 코드!이는 적절치 못한 추상화 레벨이라는 뜻!좋은 주석이란?리팩토링 시 히스토리를 전혀 알 수 없는 코드가 난관...후대에 전할 의사 결정의 히스토리를 코드로 표현할 수 없을 때 주석으로 상세히 설명한다.자주 변하는 정보는 지양해서 작성해야 한다. 만약 관련 정책이 변하거나 코드가 변경되면 주석도 업데이트해야 한다.주석이 없는 것보다, 부정확한 주석이 더 치명적!! 우리가 가진 모든 표현 방법을 총동원해 코드에 의도를 녹이고, 전달해야 할 정보가 남았을 때 주석을 사용하는 것이다. 변수와 메서드 나열 순서변수는 사용하는 순서대로 나열한다. ⇒ 인지적 경제성을 고려한 방식메서드의 순서는 사용하는 객체 입장에서 생각하기public 메서드에서 사용되는 private 메서드를 바로 하단에 배치 하기 vs public 메서드를 모아 상단에 배치하고 private 메서드는 모두 하단에 배치하기 정답은 없지만, 코치님의 경우세는 공개 메서드를 상단에 배치하시는 것을 선호공개 메서드끼리도 기준을 갖고 배치한다!상태 변경(update 등) >> 판별(valid 등) >> 조회 순으로 배치비공개 메서드는 공개 메서드에서 언급된 순으로 배치공통 사용 메서드라면 가장 하단에 배치 패키지 정리패키지는 문맥으로써 정보 제공이 가능패키지를 쪼개지 않아도 너무 쪼개도 관리가 어렵다!대규모 패키지 변경은 팀원과의 합의를 이룬 후에 해야 한다. ⇒충돌 방지!처음 패키지 생성 시부터 잘 나눠놓자! IDE에 도움 받기포맷 정렬: ctrl + alt + l코드 품질 향상: sonarlint 플러그인 사용하기포맷 규칙: .editorconfig단, 포맷은 IDE에서 규정한 기본 포맷팅에 익숙해지는 것이 좋다!절대적인 것이 아닌, 지속적으로 개선/반영하기  미션 3과 중간 점검.코치님께서 제공해준 프로젝트 폴더 중, 스터디 카페 시스템의 리팩토링이 과제였다.git 링크 미션 3은 7장을 보지 않고 '순수 자기 힘으로 리팩토링 하기'가 목표였지만 강의를 보고 따라치는 것과 직접 이론을 적용하는 것은 큰 차이가 있었다. 5장까지가 제일 중요한 내용이라고 생각해 해당 파트까지는 최대한 적용해보고 싶었지만, 현실은 적절한 메서드 추출과 객체 분리부터가 고난이었다. 무엇보다도 아직도 일급 컬렉션을 어디서 어떻게 적용해야 할지 감이 안 와 갈 길이 정말 멀구나...! 라고 느껴졌다.강의 마지막에 은탄환은 없다, 정답은 없다. 라고 말씀해주셨지만, 아무리 생각해도 복수 정답에도 가깝게 다가가지 못한 것 같다. 사고 방식을 전환하는 강의니, 간을 갖고 꾸준히 마주해야 할 문제인 것 같다. 중간 점검 라이브에서 다른 분들의 과제와 피드백해주신 걸 보고 많은 걸 또 얻어갔다.IDE에서 메서드 추출 시 자동으로 static 이 붙어버리니, 주의해야 한다.NPE 방지를 위해 null 대신 별도의 상수 값을 넣어 처리하는 방법등등...  1시간 30분에 못 미치는 시간이었음에도, 너무나 유익한 라이브였다. 깜짝 라이브를 꼭 진행해주셨으면 하는 작은(?) 바람이 생겨버렸다.🤣🤣

백엔드워밍업클럽

jin02019

인프런 워밍업 클럽 2기(클린코드/테스트 코드)_1주차 발자국

2주 회고Keep (만족했고, 앞으로 지속하고 싶은 부분)이번 강의를 수강하며 이전에 참여했던 교육 과정에서 리팩토링을 진행했던 기억이 났었다. 그때는 하나로 합쳐져 있던 프로젝트에서 뷰쪽을 나누고 프레임워크를 적용하는 수준이었는데 섹션 6과 7에 나오는 내용들을 알고 있었다면 좀 더 다른 방향으로도 확장되게 리팩토링을 할 수 있었겠다는 생각이 들었다. 이번 강의 내용을 잘 정리해두었다가 실무에서 리팩토링을 해야하는 경우가 생기면 잘 적용해보며 효과적으로 리팩토링을 진행해봐야겠다. Problem (부정적인 요소로 작용했거나 아쉬웠던 점)강의를 다 수강하지 못해 day7 미션을 제출하지 못했다. 진도대로 강의를 수강하거나 및 미션 수행을 제대로 하지 못해 아쉽다.Try (Problem에 대한 해결 방식으로 다음에 시도해볼 점)프로젝트에 투입이 될 줄 모르고 워밍업 클럽에 참여한 것은 아니었지만 예상보다도 더 강의도 밀리고 미션 수행도 어려웠다... 😂 포기할까라는 생각도 들었지만 이왕 벌어진 일이니 잘 병행해서 마무리할 수 있도록 마음을 다잡아보았다.중간점검 라이브 때 다른 사람들의 질의응답이나 미션을 보며 다들 어떻게 일도 하면서 공부도 이렇게 열심히 하는지 신기하면서도 반성하는 마음을 가졌다.남은 절반의 기간동안 다시 시작하는 마음으로 강의를 최대한 밀리지 않게 들어봐야겠다.

백엔드워밍업클럽발자국

성우

[인프런 워밍업 스터디 클럽 2기 FE] 2주차 발자국

Symbolsymbol은 유니크한 식별자를 위해 사용 (보여지는게 같더라도 내부에서는 다른 값을 가진다)설명을 넣을수도 있다.(설명이 없다면 어떠한 심볼인지 알기가 어렵다)getOwnPropertyNames와 for/in에서는 기본적으로 속성이 숨겨진다Iterator & GeneratorIterable === 반복가능, for..of, Symbol.iterator 값을 가지면 가능Iterator next()를 호출해서 두 개의 속성을 가진 객체를 반환하는 객체Generator는 사용자의 요구에 따라 여러 값을 반환할 수 있음 함수 실행 중에 일시적으로 정지, 재시작이 가능제너레이터를 사용한 라이브러리는 Node.js의 프레임워크 Koa, 비동기 처리를 위한 리덕스 미들웨어 Redux Saga 등이 존재Design Pattern디자인 패턴의 장점최고의 솔루션, 재사용성, 풍부한 표현력, 향상된 의사 소통, 코드 리팩토링 필요 없음, 코드베이스 크기 감소싱글톤 : 클래스의 인스턴스화를 하나의 객체로 제한팩토리 : 비슷한 객체를 반복적으로 사용하는 경우(유사한 여러 객체를 많이 찍어내기 위함..?)중재자 : 객체 그룹에 대한 중앙 권한을 제공상태 : 객체가 특정 상태를 나타내는 객체 집합에 상태별 논리를 제공(스스로 행동을 변경할 수 있게 허가)모듈 : 코드를 파일을 더 작고 재사용 가능한 조각으로 분할옵저버 : 옵저버들이 특정 Subject들을 관찰 후 알림React 리액트는 UI를 랜더링하는데 관여하기 때문에 프레임워크가 아닌 라이브러리이다리액트는 여러 컴포넌트 조각으로 이루어져있음여러개의 컴포넌트가 모여서 하나의 페이지를 이룬다(클래스형, 함수형 컴포넌트 2개가 존재)가상돔을 사용해 바뀐 부분만 브라우저 돔에 적용한다(돔을 조작하는 비용을 줄일 수 있게 됨)Missonhttps://github.com/Sungw0o/JS-React/tree/main/frontend/mission/chap6비밀번호 만들기https://github.com/Sungw0o/JS-React/tree/main/frontend/mission/chap7타이핑 측정기리액트 미션은 아직 jsx가 익숙치 않아서 4,5 섹션을 복습 한 뒤에 해봐야겠다..

bbcc

인프런 워밍업 클럽 스터디 2기 CS 2주차 발자국

회고: 운영체제에서 CPU 스케줄링과 프로세스 동기화 등에 대해 알차게 학습한 이번주. 알고리즘은 강의에 맞춰, 따로 문제를 더 풀어보고자 했는데 그러진 못했다.하지만 집에 밤 혹은 자정 넘어 오는 수많은 야근 속에서도 강의를 밀리지 않고 꾸준히 들은 나를 스스로 칭찬해본다. 다음주도 꾸준히 해보기. 운영체제 간단 요약 선입 선처리 스케줄링- FIFO 알고리즘- '평균 대기 시간'이 길어질 수 있음- 현대 운영체제에 안쓰이고 <일괄 처리 시스템>에 쓰임 SJF 최단 잔여 시간 우선 스케줄링- Burst time이 짧은 것부터 우선 실행- SJF 사용하기 어려운 이유?(1) 어떤 프로세스가 얼마나 실행될 지 예측하기 힘들다(2) Burst time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수 있음 RR 라운드 로빈 스케줄링- 한 프로세스가 할당 받은 시간(타임 슬라이스)동안 작업을 하다가,완료하지 못하면 준비 큐의 맨 뒤로 가서 자기 차례를 기다리는 방식- 동시에 실행하는 거처럼 + 오버헤드가 크지 않은 타임 슬라이스여야 함. ✔ 공유 자원: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등✔ 경쟁 조건: 여러 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황 ✔ 임계구역 Critical section: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역: 임계구역 문제 해결조건 중 1. 상호 배제(1) 임계영역엔 동시에 하나의 프로세스만 접근한다.(2) 동시에 여러 요청이 와도 하나의 프로세스의 접근만 허용한다.(3) 임계구역에 들어간 프로세스는 빠르게 나와야 한다. 세마포어 Semaphore 하드웨어적 해결방법, 피터슨, 데커 알고리즘 3개는 busy wating을 사용하기 때문에 자원 낭비도 심하고 알고리즘도 복잡하다.세마포어는 임계구역(critical section)에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어간다. 모니터  세마포어의 문제는 잘못된 사용으로 인해, 임계구역이 보호받지 못한다는 것이다.모니터는 프로시저 호출에 대해서 동기화하여 안전하게 공유 자원을 사용할 수 있도록 돕는다.프레임워크나 라이브러리 차원에서 제공한다. 데드락(Deadlock, 교착 상태) 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황  알고리즘 간단 요약 선택정렬해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 그 위치에 어떤 원소를 넣을지 선택하는 알고리즘 버블정렬배열 내의 두개의 인접한 Index를 비교하여 더 큰 숫자를 뒤로 보내 차곡차곡 쌓아 정렬하는 방법. 배열의 뒷쪽부터 정렬하는 알고리즘.

윤승현

[인프런 워밍업 클럽 CS 2기] - CS 2주차 미션

[운영체제] 1. FIFO 스케줄링의 장단점이 뭔가요?장점은 단순하고 직관적이다.단점은 한 프로세스가 완전히 끝나야 다음 프로세스가 시작되기 때문에 실행 시간이 짧고 늦게 도착한 프로세스가 실행 시간이 길고 빨리 도착한 프로세스의 작업을 기다려야 한다는 것이다. 2. SJF를 사용하기 어러운 이유가 뭔가요?어떤 프로세스가 얼마나 실행될 지 예측하기가 힘들고 Burst Time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수도 있기 때문에 SJF를 사용하기가 어렵다. 3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?타임 슬라이스가 아주 작으면 컨텍스트 스위칭이 너무 자주 일어나게 되고, 타임 슬라이스에서 실행되는 프로세스의 처리량보다 컨텍스트 스위칭을 처리하는 양이 훨씬 커져서 오버헤드가 커지는 상황이 발생한다. 4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은거니 I/O Bound Process일 확률이 높고 반대로 CPU를 사용하는 프로세스가 타임 슬라이스 크기를 오버해서 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU 사용이 많은 것이니 CPU Bound Process일 확률이 높다. 5. 공유자원이란무엇인가요?프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일들이 있는데 이런 것들을 공유 자원이라고 한다. 6. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호 배제 : 어떤 프로세스가 한 리소스를 점유했다면 그 리소스는 다른 프로세스에게 공유가 되면 안된다.비선점 : 어떤 프로세스가 리소스를 점유하고 있는데 다른 프로세스가 그 리소스를 빼앗을 수 없어야 한다.점유와 대기 : 어떤 프로세스가 한 리소스를 가지고 있는 상태에서 다른 리소스를 원하는 상태여야 한다.원형 대기 : 점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있는 것 이다.  [자료구조와 알고리즘] 1. 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?무한 재귀 호출 : 기저 조건이 없거나 잘못 설정되어 재귀 호출이 끝나지 않고 계속 반복될 수 있다. 이 경우 함수는 끝없이 자기 자신을 호출하며, 결국 무한 루프에 빠지게 된다.스택 오버플로우 : 재귀 호출이 계속되면 함수 호출에 필요한 메모리가 쌓이게 되는데, 대부분의 시스템에서 사용할 수 있는 스택 메모리에는 한계가 있기 때문에 프로그램이 비정상적으로 종료된다. 2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ // 재귀 로직 } console.log(sumOdd(10)) // 25 public class Main { public static void main(String[] args) { int n = 10; System.out.println(sumOdd(n)); // 25 출력 } // 재귀 함수 public static int sumOdd(int n) { // n이 0보다 작으면 더하지 않음 if (n <= 0) { return 0; } // n이 홀수인 경우 더하기 if (n % 2 != 0) { return n + sumOdd(n - 1); } else { // n이 짝수인 경우 다음 홀수로 넘어가기 return sumOdd(n - 1); } } }   

인프런워밍업클럽CS미션

윤승현

[인프런 워밍업 클럽 CS 2기] - CS 2주차 발자국

강의 수강[운영체제]SJF(Shortest Job First) : Burst Time이 짧은 프로세스를 먼저 실행하는 알고리즘을 만들기로 하고 SJF(Shortest Job First)라는 이름을 붙였다. 한글로 해석하면 “짧은 작업 먼저” 라는 뜻이다.RR(Round Robin) : RR 알고리즘은 한 프로세스에게 일정 시간만큼 CPU를 할당하고 할당된 시간이 지나면 강제로 다른 프로세스에게 일정 시간만큼 CPU를 할당한다.MLFQ(Multi Level Feedback Queue) : MLFQ는 기본적으로는 CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 타임 슬라이스를 선택한다.프로세스 간 통신 : 프로세스는 독립적으로 실행되기도 하지만 다른 프로세스와 데이터를 주고 받으며 통신을 하는 경우도 있다.통신은 한 컴퓨터 내에서 실행되고 있는 다른 프로세스와 할 수도 있고 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와 할 수도 있다.공유자원 : 프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일들이 있는데 이런 것들을 공유자원이라고 한다.임계구역 : 여러 프로세스가 동시에 사용하면 안되는 영역을 정의했는데 이를 “임계 구역(Critical Section)” 이라고 한다.세마포어 : 프로세스 간의 동기화를 위해 사용되는 변수이다.모니터 : 모니터는 따로 운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법이다.교착상태(데드락) : 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태를 ‘교착상태’라고 한다. [자료구조와 알고리즘]재귀 : 함수가 자기 자신을 호출하는 프로그래밍 기법이다. 어떤 문제를 해결하기 위해, 그 문제를 더 작은 하위 문제로 나누고, 그 하위 문제를 해결하는 방식으로 문제를 푸는 것이다.하노이 탑 : 세 개의 막대와 여러 개의 크기가 다른 원반을 사용하여 첫 번째 막대에 쌓인 원반을 세 번째 막대로 모두 옮기는 문제이다.재귀적 해법은 n-1개의 원반을 보조 막대를 사용해 목표 막대가 아닌 다른 막대로 옮긴다. 그리고 가장 큰 원반을 목표 막대로 옮기고 n-1개의 원반을 다시 목표 막대로 옮긴다.버블 정렬 : 인접한 두 원소를 비교하여, 필요하면 자리를 교환하는 과정을 반복하여 정렬하는 알고리즘이다.선택 정렬 : 리스트에서 매번 가장 작은 원소를 찾아서, 정렬되지 않은 부분의 첫 번째 원소와 교환하는 방식이다. [회고]칭찬하고 싶은 점강의를 들으면서 노션으로 강의 내용을 정리하는 점발자국도 작성하고 미션도 해결한 점시간표대로 학습을 진행하지는 않았지만 한 주차마다 들어야 하는 강의는 다 들었다.아쉬웠던 점시간표에 맞게 학습을 하지 않은 점, 저번 주에도 시간표에 맞게 학습을 하지 않아서 이번 주는 꼭! 시간표에 맞게 학습하자고 다짐을 했지만....ㅠㅠ 시간표 대로 학습을 하지는 않았지만 시간이 날 때 마다 강의를 수강했다.보완하고 싶은 점3주차부터는 시간표에 맞게 학습하기! (최대한 노력하자!)회사 퇴근하고 시간 더 내서 꼼꼼히 학습하자!미션[회고]미션을 하면서 공부한 내용들을 다시 복습하는 점이 좋았다. 복습을 하면서 내가 놓쳤던 부분들을 알고 가니 더 이해가 되는 것 같다.[CS 2주차 미션 링크]https://www.inflearn.com/blogs/8829  

발자국CS발자국인프런워밍업클럽

워밍업 클럽 스터디 2기 2주차

반정도의 시간이 지나간 스터디 2주차 섹션 6) 코드 다듬기좋은 주석우리가 가진 모든 표현 방법을 총동원해 코드에 의도를 녹여내고, 그럼에도 불구하고 전달해야 할 정보가 남았을 때 사용하는 주석변수와 메서드의 나열 순서객체는 협력을 위한 존재외부 세계에 내가 어떤 기능을 제공할 수 있는지를 드러냄(정해진 답은 아니지만.. ) 공개 메서드를 상단에 배치하는 것이 좋음공개 메서드 : 객체에서 외부 세계에 제공할 수 있는 기능공개 메서드들끼리도 기준을 가지고 배치하는 것이 좋음중요도 순, 종류별로 그룹화하여 배치공개 메서드 중요도가 높은 순메서드에서 상태 변경메서드가 가지고 있는 상태를 변경하는 메서드판별boolean값으로 반환받는 상태조회값을 가져오는 조회 메서드비공개 메서드는 공개 메서드에서 언급된 순서대로 배치공통으로 사용하는 메서드라면 (가장 하단과 같은) 적당한 곳에 배치중요한 것은, 나열 순서로도 의도와 정보를 전달할 수 있다는 것Intellij IDE 활용코드 포맷 정렬 단축키 : Ctrl + ALT + LSonarlint : 오류, 버그, 스타일 등을 알려주어 문제점 개선을 도와주는 Plugin.editorConfig : 확장자마다 스타일을 다르게 줄수 있게 도와주는 설정파일섹션 8) 기억하면 좋은 조언들능동적 읽기복잡하거나 엉망인 코드를 읽고 이해하려 할 때, 리팩토링하면서 읽기공백으로 단락 구분하기메서드와 객체로 추상화 해보기주석으로 이해한 내용 표기하며 읽기git reset --hard 가 있다핵심목표는 우리의 도메인 지식을 늘리는 것, 그리고 이전 작성자의 의도를 파악하는 것오버 엔지니어링필요한 적정 수준보다 더높은 수준의 엔지니어링ex) 구현체가 하나인 인터페이스인터페이스 형태가 아키텍처 이해에 도움을 주거나 근시일 내에 구현체가 추가될 가능성이 높다면 Ok구현체를 수정할 때마다 인터페이스도 수정해야 함코드 탐색에 영향을 줌. 애플리케이션이 비대해 짐ex) 너무 이른 추상화정보가 숨겨지기 때문에 복잡도가 높아진다.후대 개발자들이 선대의 의도를 파악하기가 힘들다.은탄환은 없다.만능해결사는 없다!클린 코드도 은탄환이 아니다.실무 : 2가지 사이의 줄다리기지속 가능한 소프트웨어의 품질 VS 기술 부채를 안고 가는 빠른 결과물대부분의 회사는 돈을 벌고 성장해야 하고 시장에서 빠르게 살아남는 것이 목표이런 경우에도 클린 코드를 추구하지 말라는 것이 아니라 미래 시점에 잘 고치도록 할 수 있는 코드 센스가 필요하다. 결국은 클린 코드의 사고법을 기반으로 결정하는 것모든 기술과 방법론은 적정 기술의 범위 내에서 사용되야 함도구라는 것은 일단 그것을 한계까지 사용할 줄 아는 사람이 그것을 사용하지 말아야 할 때도 아는 법적정 수준을 알기 위해, 때로는 극단적으로 시도해보자클린코드는 도구이다. 필요한 상황에서 적정 기술을 사용하도록 하자

예진안

인프런 워밍업 클럽2 cs <day8>

알고리즘정렬 : 배열을 가지고 하는 알고리즘 버블 정렬, 선택정렬 -> O(n*n)버블정렬첫번째 배열의 수(a)와 다음 수(b)와 비교하여 a>b일 시 b와 교체되고 작은 수는 정렬된 배열이기 때문에 나중에 비교대상이 아니게 된다. 선택정렬정렬되지 않은 첫번째 배열안의 원소 값과 그다음 배열안 원소~끝까지 다 비교하고 첫번째보다 작을 경우 자리를 바꿔 정렬  운영체제메모리레지스터 : 메모리중 속도가 가장 빠르고 값도 비싸다.캐시메모리 : 느린 RAM과 빠른 레지스터 중간에서 레지스터가 필요할 데이터를 미리 보기 좋게 저장한다.RAM : 실제로 프로세스들이 올라가서 작업하는 공간보조저장장치 : 메모리 중에서 효율이 제일 좋은 유일한 비휘발성 메모리메모리와 주소물리 주소 : 메모리의 실제 주소논리 주소 : 사용자 입장에서의 주소 사용자는 실제 물리주소를 알 수 없기 때문에 실행될 주소를 0번지라고 가정하고 프로세스를 작업한다. 물리주소를 일일히 신경쓰지 않고 프로그램 개발물리주소로는 0x2000번지이지만 논리 주소로는 0x0번지라고 인지된다.RAM은 항상 운영체제 영역과 사용자공간을 따로 빼놓는다.이때 사용자 공간에서 운영체제 영역을 침범하면 안되기 때문에 ->? 왜여?경계레지스터를 사용해서 선을 긋는다.경계레지스터 : 메모리 관리자가 사용자 프로세스가 경계 레지스터 값을 넘어갔는지 확인 넘어갔다면 해당 프로세스를 정지 시켜버린다. CPU에 있다.메모리를 가져오는 방식사용자 : ㅌㅌㅌ번지 데이터가져와.-->CPU : 응 알겠어~ ㅌㅌㅌ번지 데이터~. 메모리관리자야~ ㅌㅌㅌ번지 데이터좀~ --> 메모리관리자 : ㅌㅌㅌ번지 데이터? 음~ 재배치 레지스터엔 물리주소를 xxxx를 가리키는 번지네 알겠어~ xxxx번지데이터 보내줄게~메모리 할당 방식가변 분할 방식 : 메모리에 프로세스가 들어올 때 프로세스 크기에 맞게 메모리에 할당 시킨다.연속된 메모리에 프로세스 할당외부단편화 발생 고정 분할 방식 : 메모리에 프로세스에 들어올 때 정해진 크기에 맞게 프로세스를 잘라 메모리에 할당 시킨다.단순하고 오버헤드가 없다.내부단편화 발생외부단편화 : 순서대로 프로세스가 할당되고 프로세스a와 프로세스b가 작업을 마친상태. 60mb짜리 프로세스가 들어올 때빈공간이 총 60mb이지만 고정분할 방식이 아니기때문에 많은 양의 손실이 생긴다.해결 방법 : 조각모음 조각모음으로 메모리에 들어있는 프로세스를 멈추고 하나하나씩 땡겨서 이동시킨다. ->오버헤드 발생내부단편화: 낭비공간이 쪼그만한하게 생기는 현상 해결방법 : 버디시스템 메모리를 2승수단위로 쪼갠 후 할당하는 방식 (2048바이트를 1024바이트 두개로, 1024바이트를 512바이트두개로, 512바이트를 256바이트 두개로 ....)들어가야할 프로세스 크기에 알맞는(프로세스크기보다 크지만 낭비가 제일 적은) 메모리에 할당시켜서 최소한의 낭비를 줄인다. -> 내부단편화가 생겨도 전보다는 덜하다!어제 복습 블로그 글올렸어야했는데 ㅜㅜ 오늘 하니까 드문 기억만 나네

알고리즘 · 자료구조알고리즘운영체제인프런워밍업클럽2cs

조혜림

[인프런 워밍업 클럽 스터디 2기] 프로덕트 디자인 2주차 발자국

이번 주부터는 본격적으로 피그마를 활용하여 다양한 컴포넌트를 제작하였다. '컴포넌트' 의 정의가 '재사용이 가능한 독립된 모듈' 이라는 점에서 컨텐츠 내에서 실제 사용 시 확장성과 범용성을 고려해야 했으며 컴포넌트끼리 활용할 때에도 결합 또는 조합이 가능한 구성에 대해서 배울 수 있는 시간이었다. 금주에 배운 강의 내용은 다음과 같다.  입력 컴포넌트버튼, 체크박스라디오버튼, 스위치버튼라벨과 컨트롤 그룹텍스트 필드와 텍스트 상자셀렉트입력 폼과 같이 데이터 입력이 필요한 페이지 또는 컨텐츠에서 매우 자주 활용되는 입력 컴포넌트를 제작하였다. 입력 컴포넌트는 이후 디스플레이나 피드백에도 자주 활용되기 때문에 디자인 일관성을 고려하여 범용적인 디자인으로 설계할 필요성이 있었다. 또한 컴포넌트 제작 시 테스트의 중요성을 깨닫게 된 시간으로 텍스트 내용을 길게 쓰거나 컨텐츠의 가로, 세로 영역값을 넓히거나 줄이는 등의 테스트를 진행해보면 틀어지거나 깨지는 등의 문제 상황을 자주 확인할 수 있었다. 다른 컴포넌트와 결합하여 사용하는 빈도가 많은 컴포넌트인 만큼 테스트를 꼼꼼하게 진행하여야 추후 다른 컴포넌트 제작 진행 시 시행착오를 줄일 수 있겠다. 디스플레이 컴포넌트아바타, 아코디언, 뱃지, 툴팁, 구분선칩카드, 테이블테이블이나 카드 게시판 내에서 시각적인 정보를 전달하는 컴포넌트를 제작하였다. 디스플레이 컴포넌트에서 제작한 컴포넌트를 조합하여 카드나 테이블과 같은 테이블을 쉽고 빠르게 제작 또는 수정할 수 있어서 다시 한 번 피그마 기능의 우수함을 느끼게 된 시간이기도 했다. 디스플레이 컴포넌트를 조합하면서 부터 본격적으로 다양한 컴포넌트를 조합할 필요성이 커졌는데, 이는 컴포넌트 조합 시 상위 프레임 또는 그룹의 오토 레이아웃에 대한 이해를 요구하였다. 오토 레이아웃 설정 시 선택할 수 있는 옵션은 다음의 세 가지가 있다.  fixed가로 또는 세로에, 혹은 가로와 세로 모두에 고정적인 값을 부여. 부모 영역의 값을 확장하더라도 자식 영역의 값이 fixed라면 값이 변하지 않음.hug해당 요소가 보유한 컨텐츠 값에 해당하는 가로 또는 세로 값을 인식하여 값을 부여.hug로 설정된 경우 텍스트 내용을 처음 설정보다 더 길게 쓰더라도 유연하게 내용에 맞게 가로 값이 변화함. fill부모 영역의 값을 인식하여 해당 크기에 맞게 자식 영역의 값을 맞추어 늘리거나 줄임.자식 개체가 여러 개인 경우 부모 영역의 값을 기준으로 1/n 만큼의 값을 각각 가져감. 피드백 컴포넌트알림(경고) 메시지토스트스켈레톤 로더와 로딩 스피너프로그레스 바슬롯 컴포넌트와 모달사용자에게 알림, 로딩 등과 같은 다양한 상호작용을 하는 컴포넌트를 제작하였다. 사용자가 예상지 못한 상호작용이 발생할 수 있는 컴포넌트인 만큼 해당 컴포넌트를 제작할 때에는 사용자의 편의성과 경험을 고려해야 할 필요성이 높아졌다. 또한 컴포넌트 내에 스켈레톤 또는 스피너 애니메이션을 제작함으로써 개발자와 해당 컴포넌트에 대해 공통된 이미지와 기능을 구체화하고 공유할 수 있게 됨과 동시에 예기치 못한 상황에 대기를 해야하는 유쾌하지 않은 상황에 사용자의 불쾌감을 낮추고 보다 긍정적인 경험을 제공하는 방법을 배우는 시간이 되었다.  온라인 특강 : 챗GPT를 활용한 디자인 가이드 제작다양한 기업에서 활용하는 디자인 가이드를 확인해보고 여러 디자인 가이드 중 공통된 내용을 분석하며 이를 기반으로 챗GPT를 활용하여 쉽고 빠르게 디자인 가이드를 제작하였다. 디자인 가이드의 내용이 방대한 만큼 일일히 하나하나 작성하기에는 작업량이 방대한데 챗GPT를 활용하여 제작하게 되면 직접 제작하는 방식보다 훨씬 수월하고 효율적으로 디자인 가이드를 제작할 수 있었다. 금주에는 수요일에 공휴일이 있었음에도 불구하고 강의를 듣고 과제를 수행하는 데에 예상보다 시간이 훨씬 많이 소요되어 과제를 제 시간에 한 번도 제출하지 못하였다...🙄 쉽지 않았지만 본격적으로 컴포넌트를 제작하고 조합하면서 제작할 수 있는 범위가 확장되었던 2주차를 돌아보며 개선할 점과 보완할 점을 회고하고자 한다.  2주차 잘한 점예상한 시간보다 훨씬 많은 시간이 소요되어 심리적으로 초조해졌지만 처음 배우는 초심자에게는 빠르게 가는 것보다 (어차피 빠르게 갈 수도 없지만) 느리더라도 꼼꼼하게 배우는 게 맞다고 판단하여 강의를 수강하면서 중간중간 강의를 멈추면서 선생님께서 작업하신 내용을 따라하고 강의를 다 듣고 난 이후에도 시간을 할애하여 배운 내용을 다시 복습해보았다.테스트의 중요성을 인지한 이후부터 텍스트를 길게 써보거나 컨텐츠 영역 값을 줄이고 키우고 하는 등 테스트를 여러 번 진행해보았다. 테스트를 진행하다 보니 문제 상황에 자주 부딪혔고 이를 해결하는 과정에서 오토 레이아웃에 대해 이전보다 많이 이해할 수 있게 되었다. 제시간에는 한 번도 제출하지 못했지만...그래도 이번 주에 어떻게든 미션을 다 완수하였다.2주차 개선할 점미라클모닝...을 하루도 못했다. 돌아오는 주에는 일찍 자고 일찍 일어나서 오전에 강의를 꼭 수강해야겠다.과제를 제시간에 한 번도 제출하지 못했다. (진짜 이렇게 될 줄은 상상도 못했다...) 여러 가지 이유가 있었겠지만 이제 피그마에 많이 익숙해졌으니 3주차에는 시간 계획을 더 철저하게 하여 과제를 미리 진행할 수 있도록 해야겠다.

UX/UIUI/UXFigma프로덕트디자인디자인시스템워밍업스터디

jenhuhh

인프런 워밍업 프로덕트 디자인 2기 2주차 발자국

강의 요약1주차 마지막 날에 foundation을 점검하는 시간으로 섹션이 마무리가 되었고, 본격적으로 컴포넌트를 만들기 전 개념들을 설명해주셨다.강의에서 진행할 컴포넌트 만드는 순서 (1~4번 ♾)기본 싱글 컴포넌트 만들기베리언트 프로퍼티를 제외한 모든 프로퍼티 등록하기boolean, instance swap, text인스턴스 복사 후 테스트베리언트 프로퍼티 만들기state > status > style > size의 순서로 보통 추가함테스트 Naming Convention우선 네이밍 컨벤션 팁을 알려주셨고, 강의에서는 주로 camelCase로 적용하였다. 다른 규칙은 어떤게 있는지 좀 더 찾아봤는데, 제일 많이 알려진 건 아래 4가지 케이스였다.Snake case: 단어를 밑줄(_)로 구분하고 모두 소문자로 작성 (e.g., this_is_snake_case)Kebab case: 단어를 하이픈(-)으로 구분하고 모두 소문자로 작성 (e.g., this-is-kebab-case)Camel case: 첫 단어는 소문자, 이후 단어의 첫 글자는 대문자로 작성 (e.g., thisIsCamelCase)Pascal case: 모든 단어의 첫 글자를 대문자로 작성 (e.g., ThisIsPascalCase)너무도 당연한 얘기지만, 레이어명을 바로바로 바꾸시는 볼드님 보고 정말 많이 반성했다. (평소 레이어명 Frame258232으로 방치 중인 나.. 🥲)컴포넌트 만들기이번 주는 입력, 디스플레이, 피드백 3 가지 컴포넌트를 만들었다. 특히 컴포넌트를 만들면서 베리어블을 적용한 건 처음이라 굉장히 흥미로웠다. 아직 회사 실무에 베리어블을 적용하기 전인데, 작업할 때 자연스럽게 베리어블을 찾는 내 모습을 보며, 구조에 대해 이해가 점점 더 되고 있는걸 느꼈다.디자인 시스템을 만든 경험이 있기 때문에 이미 잘 알고 있다고 생각했는데, 이번 주는 같은 컴포넌트를 만들면서도 얼마나 더 효율적으로 관리할 수 있는지에 대해 많은 것을 배웠다. (역시 배움에는 끝는 없다.) 특히 슬롯 컴포넌트를 활용해서 모달만드는 방법이 정말 재밌었고, 이와 같이 효율적인 관리와 확장성을 고려한 방법들이 더욱 인상 깊었다. 앞으로 실무에서도 적극 활용할 수 있을 것 같다.유용한 플러그인Contrast - 색상 대비를 확인하고 접근성 기준을 충족하는지 검사해주는 플러그인. 해외에서는 접근성 기준을 굉장히 중요하게 생각한다고 하셨다.컴포넌트를 만들던 중 Placeholder 색상이 좀 진해보여서 색상을 한 단계 낮췄는데, 바로 접근성 기준 fail을 받았다. 🥲 어렵네 어려워특강 및 온라인 세션어제는 (12일) 온라인 세션이 진행되었고, ChatGPT를 활용해 디자인 시스템을 구축하는 방법에 대해 배웠다. 처음에는 문서 다듬기 정도로만 활용할 수 있다고 생각했는데, 디자인 워크플로우에 AI를 활용하는 방식이 굉장히 인상적이었다.프롬프트 프레임워크C - Context (맥락)I - information (정보)G - goal (목적)O - output (결과물) 회고잘한점 미션 #3 우수자로 선정 되었다. ✌아쉬운점또 강의를 들으며 노트를 바로바로 쓰지 못하였다... 특히 이번주는 휴일도 적고, 회사 프로젝트 때문에 시간이 부족해 미션을 완수하는데만 너무 급급했던 것 같다.다음주 계획오늘 온라인 세션에서 배운 플러그인으로 문서 정리해보기강의 들으면서 만든 컴포넌트로 다양한 예시 만들어볼 것

UX/UI워밍업클립

[워밍업 클럽] BE 클린코드&테스트 2주차 발자국

강의 요약능동적 읽기복잡하거나 엉망인 코드를 읽고 이해하려 할 때, 리팩토링을 하자.공백으로 단락 구분메서드와 객체와 추상화 해보기주석으로 이해한 내용 표기하며 읽기언제든지 rollback 할 수 있다겁먹지 말자목표는 도메인 지식을 늘리는 것.작성자의 의도를 파악하는 것.오버 엔지니어링적정 수준보다 더 높은 수준의 엔지니어링구현체가 하나인 인터페이스아키텍처 이해에 도움을 주거나, 추가될 가능성이 높다면 OK구현체를 수정할 때마다 인터페이스를 수정해야함코드 탐색에 영향을 줌. 애플리케이션이 비대해 짐.너무 이른 추상화정보가 숨겨지기 때문에 복잡도가 높아진다.의도 파악하기 어렵다.경험의 영역이다. 경험을 쌓자.은탄환은 없다. (No Silver Bullet)체스를 코딩하려면?인터페이스와 클래스로 구현하자! → 유지보수 하기 쉬울거야!but 체스는 500년동안 변하지 않았다..클린코드는 은탄환이 아니다.지속가능한 소프트웨어의 품질 vs 기술 부채를 안고 가는 빠른 결과물둘 사이에서의 줄다리기를 잘 해야한다.클린 코드를 항상 생각하면서 추후 수정이 쉽도록 작성해야 한다.모든 기술과 방법론은 적정 기술의 범위 내에서 사용되어야 한다.도구라는 것은, 일단 그것을 한계까지 사용할 줄 아는 사람이 그것을 사용하지 말아야 할 때도 아는 법이다.적정 수준을 알기 위해, 때로는 극단적으로 시도해보자.경험이 중요하다. 미션 회고이번 미션은 StudyCafePassMachine 의 코드를 리팩토링 하는 것이었다.처음 코드를 받아본 순간 막막했다. 어디서부터 어떻게 리팩토링 해야하지? 이렇게 하는 게 맞을까? 라는 고민이 끝없이 이어져 끝내 시간내에 미션을 완료하지 못하였다.무한한 고민속에 잠식되어 있다가, 결국 강의를 보면서 리팩토링을 따라갔다.가장 인상깊었던 리팩토링은 추상화 관점의 차이이다. 초기 FileHandler로 짜여져 있던 코드를 Provider 로 추상화 한 후, 이를 구체화한 FileProvider로 리팩토링하였다.이를 통해 파일로 입력을 받지 않고, 구글 sheet나 엑셀로 입력을 받더라도 구현체만 새로 구현하면 기존 코드를 고칠 필요가 없이 편하게 유지보수가 가능해지기 때문이다.고수준에 의존하지 않고 추상화한 저수준에 의존하여 코드를 작성한다. 라는 말이 이 강의를 통해 와닿게 되었다.이런 상황이 현재 재직중인 회사에서 정말 많이 나타나는데, 회사에 적용하여 유지보수하기 쉬운 코드를 작성할 수 있을 것 같다.  느낀점가장 좋았던 점은 금요일에 중간점검을 통해 다른 분들의 코드를 같이 보는 것이었다.강사님이 코드리뷰를 진행하면서 나와 다른 사람들의 생각의 공통점과 차이점을 알 수 있었다.또한, 강사님의 친절한 피드백이 코드리뷰에만 적용되는 것이 아니라 지금까지 내가 작성해온 코드, 추후 내가 작성할 코드에 대해 이정표를 제시해 주는 것 같아 매우 만족스러웠다. 

[미션] 인프런 워밍업 클럽 2기 CS 2주차

운영체제FIFO 스케줄링의 장단점이 뭔가요? 장점: 단순하고 직관적임단점: 한 프로세스가 완전히 끝나야 다음 프로세스가 실행될 수 있기 때문에, 실행시간이 짧고 늦게 도착한 프로세스가 실행시간이 길고 빨리 도착한 프로세스의 작업을 기다려야한다. 즉, CPU 사용률이 떨어지는 결과가 발생한다. SJF를 사용하기 여러운 이유가 뭔가요?어떤 프로세스가 얼마나 실행될지를 계산하는 것이 어렵고, 실행시간이 긴 프로세스는 실행시간이 더 짧은 프로세스가 생길 때마다 대기해야하므로 아주 오랫동안 실행되지 않는 문제가 발생할 수 있다. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?  컨텍스트 스위칭이 너무 자주 발생해서 오버헤드가 커지는 문제가 발생한다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU 자원을 프로세스가 스스로 반납하면 I/D Bound Process일 확률이 높다고 판단하고, CPU 자원을 강제로 뺏기는 프로세스는 CPU Bound Process일 확률이 높다고 판단한다. 공유자원이란무엇인가요?프로세스들 간에 공유되는 자원을 말한다. (변수, 파일 등) 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호배제, 비선점, 점유와 대기, 원형대기위 4개의 조건을 모두 만족해야 교착상태에 빠질 수 있다.  자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?재귀함수가 멈추지 않고 무한루프에 빠져서 계속 동작하다가 콜스택 메모리를 초과하면 프로세스가 강제 종료된다. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.# Python def sumOdd(n): if n <= 0: return 0; if n % 2 == 1: return sumOdd(n - 2) + n else: return sumOdd(n - 1) print(sumOdd(8))function sumOdd(n){ // 재귀 로직 if (n <= 0) return 0; if (n % 2) == 1: return sumOdd(n - 2) + n; else: return sumOdd(n - 1); } console.log(sumOdd(10)) // 25

알고리즘 · 자료구조워밍업클럽자료구조알고리즘운영체제

spacebar

[인프런 워밍업클럽 백엔드 스터디 2기] 2주차 발자국

2주차 학습내용Readable Code : 읽기 좋은 코드를 작성하는 사고법 강의를 학습하며 작성한 내용입니다.1주차에 이어 강의를 듣는데 이미 진도가 약간 밀려있어서 진도표대로 수강하는 데에는 약간 어려움이 있어서 아쉽다. 코드 다듬기주석의 양면성 주석에 너무 의존하면, 추상화 레벨이 적절하지 않아 저품질 코드가 된다. 전해야 할 히스토리를 도저히 코드로 표현할 수 없을 때 주석으로 설명한다.변수와 메서드의 나열 순서 패키지 나누기 패키지를 쪼개지 않으면 관리가 더 어려워진다. (너무 쪼개도 어렵다) 대규모 패키지 변경은 conflict가 발생 가능하므로 팀원과 합의 후에!  리팩토링 연습중복 제거와 메서드 추출 객체에 메시지 보내기I/O 통합일급 컬렉션 적용 메서드 책임의 위치 - Day7 미션 사실 이번에는 시간적 여유가 부족해 미션 제출일까지 미션을 다 수행하지 못했다.기본적인 래픽토링인 중복을 제거 이후에는 '추상화 레벨 맞추기'에 집중하려고 했다. 강의를 보면서 실습할 때와 달리 코드에 대한 이해가 부족해서 어려움을 느꼈다. 강의에서 설명하시는 객체의 책임 분리와 일급 컬렉션 반환 부분은 혼자서는 생각하기가 어려웠다. 앞으로도 반복해서 학습해야 할 것 같다. 기억하면 좋은 조언들능동적 읽기 능동적 읽기 -> 눈으로만 읽지 말고, 리팩토링을 해보면서 읽자. (공백으로 단락 구분, 메서드 추출 등)  git reset --hard로 언제든지 돌아갈 수 있다.도메인 지식을 늘리는 것이 능동적 읽기의 목표  오버엔지니어링 필요한 수준 이상의 엔지니어링 -> ex) 너무 이른 추상화  중간점검(라이브) 중간점검 라이브에서 사전에 받은 질문들에 대한 답변과 미션 피드백을 들을 수 있었다. 다른 분들은 개발과 리팩토링에 대해 어떤 고민을 갖고 있는지와 그에 대한 강사님의 생각을 들을 수 있어서 유익한 시간이었다. (신입 기준) 주니어 개발자를 뽑을 때 빠르게 적응할 수 있는지와 기존 학습의 주도성을 주로 보며 기술 자체는 크게 기대하지 않는다.알고 있다고 한 기술에 대해서는 어느 정도까지 학습과 고민을 했는지 보여줄 수 있어야 한다.커밋은 의도적으로 나누는 것이 좋다.당장은 완벽한 클린코드를 만드는 게 불가능하더라도 최소한의 리팩토링을 하고 주석이라도 달아 다음에 어떤 방향으로 갈지 기록해둬야 한다. 사실 강의를 들으면서도 '내가 리팩토링 강의를 들을만큼 충분한 개발 지식과 경험을 갖고있는 게 맞나?'하는 생각이 들 때가 있지만 내가 하고 있는 개발에도 충분히 적용할만한, 적용해야 하는 부분들이 많은 것 같다.   

채널톡 아이콘