블로그

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

기존에 프로젝트를 진행하면서 테스트 코드를 작성하고 싶은 니즈가 있었기 때문에, 여러 인터넷 강의를 보던 중 [Practical Testing: 실용적인 테스트 가이드]라는 인터넷 강의를 보게 되었습니다. 책으로 보던 테스트 코드와 다르게 실무에서 어떻게 사용하는지 상세하게 설명해 주는 것이 좋아 완강하게 되었고, 실무에서도 직접 사용하였습니다.2개월 후 이메일을 통해 인프런 워밍업 클럽이라는 메일을 확인하게 되었습니다. 업무와 개인 프로젝트를 진행하느라 바쁘지만 다른 사람들의 개발 방식과 내가 개발 적으로 놓치고 있는 것이 많을 것이라는 생각에 참여하게 되었습니다. Day 2 "추상과 구체"1. "추상과 구체"에 대하여 인터넷 강의를 듣고 작성하게 되었습니다.스타크래프트 배럭의 유닛 생성 과정 1. 유닛 생성 주문 사용자가 배럭에서 어떤 유닛을 생성할지 선택하는 단계입니다. 배럭에서는 마린, 파이어뱃, 매딕, 고스트 등 다양한 유닛을 생성할 수 있으며, 선택 방식은 마우스 클릭이나 단축키를 통해 이루어집니다. 핵심은 배럭이 "유닛 생성 주문"을 받기만 하면, 그 다음 과정은 자동으로 진행된다는 점입니다. 2. 유닛 생성 유닛이 생성되는 과정입니다. 각 유닛마다 사용하는 무기나 특성이 다르지만, 결국 배럭에서 유닛이 "생성된다"는 본질적인 행위는 동일합니다. 예를 들어, 마린은 총을 쏘고, 파이어뱃은 화염방사기를 쓰고, 고스트는 저격총을 들고 있지만, 이 모든 유닛들은 결국 배럭에서 생성된다는 공통점을 가지고 있습니다. 3. 유닛 생성 알림 유닛이 완성되면 사용자에게 이를 알려주는 단계입니다. 사운드를 통해 알릴 수도 있고, 미니맵에 표시될 수도 있습니다. 중요한 것은 유닛이 생성되었음을 사용자에게 확실히 전달하는 것입니다. 정리 배럭에서 유닛을 생성하는 과정은 크게 "유닛 생성 주문 → 유닛 생성 → 유닛 생성 알림"의 흐름을 따릅니다. 유닛마다 특성은 다르지만, 이 과정은 본질적으로 동일하며, 이를 통해 유닛 생성의 핵심 개념을 추상화할 수 있습니다.추상과 구체에서 내가 생각했던 핵심은추상화는 중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.라는 말이었습니다. 그렇다면 어떻게 하면 이런 추상화를 잘하는 방법이 있을까라는 생각을 하게 되었습니다.이름 짓기이름을 짓는다는 행위는 추상적 사고를 기반으로 한다. 표현하고자 하는 구체에서 정말 중요한 핵심 개념만을 추출하여 잘 드러내게 표현한다는 말입니다. 그렇다면 어떻게 하면 이름을 잘 지을 수 있을까?단수와 복수를 구분하고이름을 줄이지 않고은어/방언을 사용하지 않고좋은 코드를 보고 습득하는 것 입니다.  추상화 레벨고수준 레벨은 소스코드에 전반적인 흐름에 대한 내용입니다.저수준 레벨은 세부사항에 대해 작성하는 코드입니다. 제가 현재까지 협업했던 실무에서 생각보다 추상화 레벨이 비슷한 분류로 묶여있던 프로젝트는 별로 없었던 것 같습니다. 함수로 호출하기 전에 for, if while 저 수준의 추상화 레벨에서 고 수준의 추상화 레벨을 동작시키는 경우도 많았고, [고수준 > 저 수준 > 고수준 >저 수준 ]으로 들어가는 함수들이 즐비하게 있었습니다. 그렇다면 어떻게 하면 일관성 있게 추상화 레벨을 지킬 수 있을까라는 생각을 하게 되었습니다이는 소스코드의 수정과 변경을 무서워하면 안 되는 것 같습니다. 예를 들면 초기에 코드를 작성하다가 기획서가 변경될 수도 있고, 스스로 잘못 구성하다 문득 좋은 방법이 떠오를 수도 있습니다. 이때 벌써 많은 시간과 코드를 구성해서 알고 있으면서도 넘어가는 경우가 저 또한 많았습니다. 하지만 결국에는 우회해서 코드의 추상화 레벨을 맞추지도 않고 작성했던 코드들이 미래에는 분석하기도 힘들고, 수정하고 있는 제 자신을 발견하니 넘어가면 안 되겠구나 생각하게 되었고, 현재는 시간이 걸리더라도 변경하고 추상화 레벨을 인지하면서 작성하려고 노력하고하고 있습니다. Day 4 SOLID를 활용하여 아래 코드를 수정S - Single Responsibility Principle (SRP) : 정의: 클래스는 단 하나의 책임만 가져야 한다.O - Open/Closed Principle (OCP) : 소프트웨어 엔티티는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다.L - Liskov Substitution Principle (LSP) : 자식 클래스는 부모 클래스에서 호출하는 동작에 대체가 가능해야 한다.I - Interface Segregation Principle (ISP) : 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 더 좋다.D - Dependency Inversion Principle (DIP) : 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다.public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }관점 지향으로 변경클래스에는 단 하나의 책임만 가져야 한다.현재 클래스를 전체가 작성되어 있지 않지만, 각각의 유호성 체크를 Order에서 만 진행하는 것이 과연 단 하나의 책임인가?라는 생각이 들었습니다.때문에 아래와 같이 item, items, user3개의 객체를 만들고 역할과 책임을 분리하게 작성하였습니다.item.java@Getter public class Item { private Long id; private String name; private BigDecimal price; @Builder public Item(Long id, String name, BigDecimal price) { this.id = id; this.name = name; this.price = price; } }Items.javapublic class Items { private final List<Item> itemList; public Items(List<Item> itemList) { this.itemList = List.copyOf(itemList); } boolean isItemNotAvailable() { return CollectionUtils.isEmpty(itemList); } public boolean isInvalidTotalPrice() { return calculateTotalPrice().compareTo(BigDecimal.ZERO) < 0; } private BigDecimal calculateTotalPrice() { return itemList.stream() .map(Item::getPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); } }User.java@Getter public class User { private Long id; private String name; @Builder public User(Long id, String name) { this.id = id; this.name = name; } public boolean isNullCustomerInfo() { return Objects.isNull(id); } }이를 통해서 아래의 validateOrder에서 어떤 데이터들이 올바르지 않는구나를 한눈에 볼 수 있게 변환하였습니다.@Slf4j @Getter public class Order { private Items items; private User user; @Builder public Order(Items items, User user) { this.items = items; this.user = user; } public boolean validateOrder() { if (items.isItemNotAvailable()) { log.info("주문 항목이 없습니다."); return false; } if (items.isInvalidTotalPrice()) { log.info("올바르지 않은 총 가격입니다."); return false; } if (user.isNullCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } return true; } } 지속하고 싶은 부분이제 1주 차 발자국이 완료하였습니다. 클린 코드에 다시 생각해 볼 수 있는 기회였으며 강의 내용은 하나같이 전부 필요한 내용이라고 생각됩니다. 습관이라는 게 마음대로 쉽게 변하지 않는다고 생각합니다. 인지하고 변화하려는 끊임없는 노력이 필요하다고 생각되고, 회고를 통해 항상 볼 수 있는 예제를 잘 만들어놓으면 크게 도움이 된다고 생각하고 작성하도록 하겠습니다. 아쉬웠던 점아직 1주 차이지만 생각보다 혼자 하고 있다는 생각이 더 드는것 같습니다. 다른 사람들의 작성한 내용은 볼 수 있어서 좋았지만 생각보다 피드백이 없었던 것 같습니다. 1기 2기 3기 ~ 이후에 좋은 개발자들 분들과 함께 피드백을 많이 받을 수 있으면 좋겠다는 생각이 들었고, 저 또한 노력하도록 하겠습니다. 시도해볼 점앞으로 많이 남았지만 완강하고, 미션을 완료하게 된다면 여기에서 머무르는 것이 아니라 주도적으로 회사에서도 진행해 봐도 좋을 것 같습니다. 남들에게 공유해 주면서 많은 지식을 쌓을 수 있을 것 같습니다. 감사합니다.실용적인 테스트와 클린 코드 학습 회고학습 배경[Practical Testing: 실용적인 테스트 가이드] 강의를 수강하며 실무에서 적용 가능한 테스트 작성법 학습인프런 워밍업 클럽 참여를 통한 추가 학습 진행Day 2: "추상과 구체" 학습 내용스타크래프트 배럭의 유닛 생성 과정 예시유닛 생성 주문사용자가 배럭에서 유닛(마린, 파이어뱃, 매딕, 고스트 등) 선택마우스 클릭이나 단축키로 주문주문 후 과정은 자동 진행유닛 생성각 유닛별 특성은 다르지만 '생성'이라는 본질적 행위는 동일예: 마린(총), 파이어뱃(화염방사기), 고스트(저격총)유닛 생성 알림사운드나 미니맵 표시를 통한 알림사용자에게 명확한 피드백 제공추상화에 대한 인사이트추상화의 핵심중요 정보는 유지하고 덜 중요한 정보는 생략효과적인 이름 짓기 원칙단수/복수 구분하기축약어 사용 피하기은어/방언 사용 피하기좋은 코드 참고하기추상화 레벨고수준: 전반적인 흐름저수준: 세부 구현 사항실무 적용시 개선점일관된 추상화 레벨 유지필요시 과감한 리팩토링코드 수정을 두려워하지 않기Day 4: SOLID 원칙 적용 실습SOLID 원칙 요약SRP: 단일 책임 원칙OCP: 개방-폐쇄 원칙LSP: 리스코프 치환 원칙ISP: 인터페이스 분리 원칙DIP: 의존관계 역전 원칙코드 리팩토링 예시리팩토링 전 코드에서 다음과 같이 개선:역할 분리Item: 상품 정보 관리Items: 상품 목록 및 검증User: 사용자 정보 및 검증Order: 주문 검증 통합회고좋았던 점클린 코드에 대한 새로운 시각 획득실무 적용 가능한 구체적 예제 학습지속적인 개선을 위한 동기부여아쉬운 점참여자 간 피드백 부족보다 활발한 상호작용 필요향후 계획강의 완강 및 미션 수행학습 내용 회사 업무 적용동료들과 지식 공유 

워미업클럽스터디

시크한 꼴뚜기

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

인프런 워밍업 클럽 2기 백엔트 과정에 참여하게 되었다. Kotlin과 Spring을 이용해서 포트폴리오 사이트를 만들어 보는 프로젝트이며 미니 프로젝트를 함께 수행한다.이전에 코틀린이나 스프링은 사용해 본 적이 없어서 많이 걱정했는데 쉽게 설명되어 있어서 이해하기 쉬웠다.강의입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기 https://www.inflearn.com/course/%EC%9E%85%EB%AC%B8%EC%9E%90-spring-boot-kotlin-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4/dashboard • 어드민 영역 : 관리자 페이지 • 타임리프 - Thymeleaf: 모델에 있는 데이터를 가져와서 동적으로 데이터를 뿌려서 동적인 화면을 만들어 줄 수 있도록 하는 문법--'템플릿 엔진'의 일종. html 태그에 속성을 추가해 페이지에 동적으로 값을 추가하거나 처리할 수 있다. 스프링에서 권장한다고 함.'템플릿 엔진' : 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어:: 웹 템플릿 엔진은 View Code(HTML) 과 Data Logic Code(DB) 를 분리 시킴 • 부트스트랩: 부트스트랩은 웹사이트를 쉽게 만들 수 있게 도와주는 CSS, JS 프레임워크부트스트랩 프레임워크는 글자, 인용문, 목록, 표, 입력폼, 버튼, 이미지, 아이콘 등의 자잘한 것뿐만 아니라, 드롭다운 메뉴, 내비게이션 바, 버튼, 탭, 리스트, 페이지 이동 바, 알림 메시지, 썸네일, 진행 바 등의 웹 페이지에서 많이 쓰이는 요소를 거의 전부 내장하고 있다. 따라서 디자인 할 때 소요되는 시간을 줄여줌 • 프레임워크 VS 라이브러리         :         제어의 주도권- 프레임워크 : 틀이 정해져 있고 그 안에서 활용해서 원하는 것 만듬- 라이브러리 : 사용자가 주도권을 가지고 원하는 것을 만들 수 있음 ※ 프레임워크 안에서도 라이브러리 사용가능SPRING• mvc 패턴소프트 아키텍쳐 디자인 패턴. model, view, controller 3가지 요소가 각각 독립된 기능을 담당하고 상호작용하는 형식으로 작동1. model: 데이터를 담음2. view: 데이터를 꺼내옴. 사용자에게 보여지는 화면 담당3. controller: 데이터를 넣음. 요청을 받아 작업을 수행함 • 레이어드 아키텍처처리의 과정을 구조화하는 방법 중의 하나: Controller, Service, Repository 로 레이어를 분리하고 각각 하나의 기능 만을 담당하게 하는 것 1. Controller : 사용자와의 상호작용 담당2. Service : 주요 로직 처리3. Repository : 데이터베이스와 상호작용 등등 이외에도 spring bean, jpa 등의 개념을 강의를 통해서 새롭게 알게 되었다. 더 이상의 자세한 내용은 생략하도록 하겠다...회고이번 미션1, 미션2 와 일주일 동안의 강의 수강을 통해서 어느 정도 spring과 친해진 것 같다. 다음 주에도 열심히 들어서 좀 더 체화해야겠다. node.js 와 생각보다 다른 부분이 많아서 헷갈리고 어려운데 열심히 해야겠다. MVC 패턴에 대해서는 계속 들어보기만 하고 직접 이렇게 나눠서 개발해본 적이 없는데 이 강의에서는 그런 식으로 개발을 진행하는 것 같아서 이에 대해서 더 익힐 수 있을 것 같아 기대가 된다.미니 프로젝트의 경우 미용실 예약 서비스로 잡았는데 아직 테이블 설계 단계이다. 핵심 기능에서 디자이너 찜 기능을 넣을 지 말지 고민 중인데 이는 진행 상황을 봐서 스터디 중에 넣거나 아니면 끝나고 추가적으로 개발할 생각이다.  * 이전에는 primary key인 id의 경우 int로 넣는 것보다 string으로 만드는 것이 더 낫다고 해서 그렇게 설계했는데 이번의 경우에는 어떻게 할지 아직 정하지 못했다. 다음주에 rest api 설계하니까 그때 같이 생각해보아야겠다.   

백엔드

조혜림

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

현업에서 기획자나 퍼블리셔, 개발자, 영업자와 협업하다 보면 원활한 커뮤니케이션을 위해 디자인 작업 계획을 구체화하여 논의할 일이 종종 발생한다.고객사에서 구체적인 방향 제시를 원하는 경우나 일관된 디자인을 구현하기 위해 퍼블리셔나 개발자에게 세부적인 디자인 정보를 전달하기 위한 경우 등 다양한 이유에서 시각적인 디자인 정보를 구체적인 데이터 값으로 정리해야 하는 순간이 얼마든지 발생할 수 있다.지금까지는 피그마를 활용할 수 없었기 때문에 (사실 피그마에 이런 기능이 있는지 조차 알지 못했다.) 이러한 데이터 값을 엑셀이나 문서로 자료화하거나 포토샵으로 이미지로 정리하여 다른 팀과 협업을 하곤 했다.그러나 실제 프로젝트가 진행되는 과정 중에 디자인 요소의 값이 변경되는 경우는 매우 자주 발생하는데 그 때마다 문서나 이미지 자료를 수정하는 건 상당히 번거로운 일이다. 더욱이 수정이 필요할 때마다 수정한 자료를 다른 팀에 공유하고 확인을 요청하고 각 팀에서 그 때마다 자료를 확인해야 하는 건 더더욱 번거로운 일이다. 그래서 결국은 자료를 만들어 놓고도 수정과 배포는 미뤄두고 퍼블리셔나 개발자에게 디자인 수정 사항을 별도로 세세하게 적어서 보내는 방식으로 협업을 진행할 수밖에 없었다.프로젝트를 진행할 때마다 이와 같은 일이 반복되면서 보다 편한 방법을 찾기 위해 노력하고 자료도 더 보기 편하게 정리하는 등 고민과 노력을 기울여왔지만 이는 처음 자료를 만들 때에는 보다 나아진 방향으로 발전했으나 수정이 필요한 단계에서 발생하는 비효율성을 줄여줄 수는 없었다.그런데 피그마는 상술한 모든 번거로움과 비효율적인 작업들을 단번에 개선해줄 수 있는 '배리어블' 이라는 강력한 기능을 가지고 있었다는 것을 이번 주 강의를 통해 처음으로 알게 되었다. 이번 주에 강의를 통해 배우게 된 배리어블의 특장점은 다음과 같다. 피그마 배리어블 디자인 시스템의 특징UI/UX 디자인 작업에 필요한 다양한 디자인 요소를 데이터화 하고 각 요소 별로 구체적인 값을 저장할 수 있다.요소별로 저장한 값만 검색되도록 모아서 볼 수 있고 쉽고 빠르게 값을 수정할 수 있다.수치로 환산이 가능한 값이라면 얼마든지 배리어블로 등록이 가능하다. (간격, 마진 등)구분하여 정리한 디자인 값을 피그마에서 직접 확인할 수도 있고 PDF 자료로 변환하여 배포할 수도 있다.다양한 플러그인을 활용할 수 있어 쉽고 빠르게 디자인 시스템을 제작할 수 있다. 피그마 배리어블 디자인 시스템이 협업에 미치는 영향시각적으로 존재하는 디자인 요소를 수치화하여 팀 간 협업에 활용함으로써 표준이 되는 가이드라인 제공이 가능하다. 프로젝트 진행 중 빈번하게 발생하는 디자인 요소 수정 사항을 빠르고 유연하게 대응할 수 있다.디자인 요소를 계층별로 정리하여 디자이너 뿐만 아니라 협업의 대상이 되는 다른 팀에서도 쉽게 계층 구조를 이해할 수 있다.각 요소별로 기능을 부여하여 퍼블리셔나 개발자가 디자인의 의도 및 의미를 이해하기 수월하다. 최근 UI/UX 구인구직 게시글을 보면 피그마는 더 이상 우대사항이 아닌 필수사항이 되었다. 수업 시작한 지 한 주 밖에 지나지 않았음에도 피그마에서 제공하는 막강한 기능을 보면 왜 피그마가 필수인지 알 수 있었다. 필요성에 대해 절감한 지금, 이제 남은 건 강의를 열심히 수강하고 강의 내용을 반복하면서 숙달하는 일이 제일 중요하겠다. 이를 위해 지난 한 주를 돌아보며 배운 내용을 확인하고 개선점과 보완할 점을 회고하고자 한다. 1주차 강의 내용디자인 토큰과 디자인 시스템, 배리어블의 기본 개념색상, 간격, 타이포, 아이콘 등 배리어블 구성 및 등록컴포넌트 제작 세팅 및 버튼 컴포넌트 제작1주차 미션색상, 간격, 타이포, 배리어블 등록아이콘 배리어블 등록 및 그림자, 그리드 시스템, 반응형 기준점 설정1주차 잘한 점피그마를 난생 처음 다뤄보면서 엄청나게 헤맸지만 포기하지 않고 어떻게든 미션을 다 완수하였다.강의를 들으면서 중간중간 끊으면서 선생님이 강의에서 작업하신 내용을 따라하고 미션은 강의 수강 후 별도로 시간을 내어 다시 제작해보면서 처음보다는 툴에 많이 익숙해졌다.미라클모닝...을 그래도 반은 실천했다. 4일 정도는 오전에 평소보다 한 시간 일찍 일어나서 강의를 먼저 들었다.1주차 개선할 점스터디에 참여하면서 공부를 습관으로 만들고 싶었는데 한 주의 절반만 실행한 점이 아쉬웠다. 한 주간 실행하려고 노력해보니 일과 공부를 병행하는 게 쉽지 않았고 이를 위해서는 시간 관리가 상당히 중요했다. 2주차부터는 보다 효율적인 방향으로 시간을 관리하여 오전에 공부하는 시간을 늘려보아야겠다.강의를 수강하면서 배운 점을 별도로 정리해두면 반복적으로 복습할 때도 유용하고 블로그를 작성할 때도 도움이 많이 되겠다는 생각이 들었다.피그마를 처음 다루기도 하고 최근 피그마에 대규모 업데이트가 진행되면서 UI 가 매우 크게 변화하는 바람에 강의 내용을 따라가는데 시간이 훨씬 많이 소요되었고 과제 제출 시간이 늦어졌다. (선생님께서 공지사항에 강의 수강은 이전 버전으로 수강하기를 권장하셨으나 공지사항을 미처 확인하지 못했다. 다음에는 공지사항을 미리 잘 확인해야겠다.) 그래도 시간은 많이 들었지만 다행히 처음에 비하면 툴에 많이 익숙해졌으니 2주차에는 과제를 당일에 제출할 수 있도록 노력해야겠다.

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

길잃은코끼리

[워밍업 클럽 스터디 2기 - 클린 코드, 테스트코드] 1주차 발자국

강의 수강 강의 내용 요약1주차는 섹션1~섹션5 까지 강의를 수강하였다.섹션2(추상)구체적인 실체에서 중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.어느 정도냐 에 따라 추상화 레벨이 생긴다적절한 추상화는 해당 도메인의 문맥 안에서, 정말 중요한 핵심 개념만 남겨서 표현하는 것섹션3(논리, 사고의 흐름)인지적 경제성 : 최소한의 정보로 최대 효율을 내보자 => 낮은 추상화레벨 -> 잘 읽히도록early return : else 사용을 지양하여 일찍 return 할 수 있다면 return 하자중첩 반복문, 조건문을 추상화를 통해 사고의 depth를 줄이자공백 라인을 잘 활용하여 의미 단위로 나누자부정어구를 쓰지 않아도 되는 상황인지 체크하고 부정의 의미를 담은 다른 단어가 있는지, 부정어구로 메서드 명을 구성하자사람은 happy case의 물두하는 경향이 있다 => 예외처리를 꼼꼼하게 하는 개발자가 되자항상 NullPointExecption을 방지하는 방향으로 경각심을 가지자 섹션4(객체 지향 패러다임)객체는 데이터와 코드의 조합이다. 공통된 관심사들을 분리시켜 객체로 만들어 유지 보수성을 올린다객체의 책임이 나뉨에 따라 객체간 협력이 발생한다SRP(단일 책임 원칙) : 하나의 클래스는 단 한가지의 책임만을 가져야 한다OCP(개방 패쇄 원칙) : 기존 코드의 변경없이 시스템의 기능을 확장할 수 있어야 한다.LSP(리스코프 치환 원칙) : 상속 구조에서 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환 할 수 있어야 한다.ISP(인터페이스 분리 원칙) : 인터페이스를 잘게 쪼개서 사용하지 않는 기능이 없도록 구현하자DIP(의존성 역전 원칙) : 의존성의 역방향(고수준, 저수준 모듈이 모두 추상화에 의존하는것) 인터페이스만 알고 있는 상태로 구현하자섹션5(객체 지향 적용하기)상속보단 조합을 사용하자(인터페이스를 활용)도메인의 어떤 개념을 추상화하여 표현한 값 객체(VO)를 사용하여 의미를 부여하고 추상화한다일급 컬렉션 VO와 비슷하게 컬렉션을 포장하면서, 컬렉션만을 유일하게 필드로 가지는 객체를 사용하여 의미를 부여할수 있음상수들의 집합인 enum은 상수와 관련된 로직을 담을 수 있는 공간을 제공해준다.변하는 것과 변하지 않는 것을 분리하고 다형성을 구현한다  일주일 간 회고일단 인프런 워밍업 스터디를 지원한 이유는 나는 기존에 이 두 강의를 듣고 있었다. 하지만 그냥 강의를 듣고 맹목적으로 코드를 이해하려하지 않고 따라치기만 했던 것 같았고 그 결과 내 머리속에 내용이 없었다. 그래서 이번 기회에 확실히 다져보자 라는 생각으로 지원을 하였다. 미션을 수행하고 공부를 하다보니 처음 수강을 했을 때는 필요성에 대해 잘 이해하지 못했으나 비로소 왜 필요한지 이곳에는 이렇게 사용하는 것이 맞을지 고민을 하게 되었고 조금은 발전 한 것 같아 좋았다.하지만 아쉬운 점도 있었다. 시간을 규모있게 사용하지 못한 것 같다. 강의가 전반적으로 길고 너무 많은 정보가 쏟아지는 지라 긴 시간동안 집중을 할 수 없었고, 그래서 한 번 보고 나중에 보고를 반복 하다 보니 생각 보다 많은 시간이 걸렸다. 이제 부터 학교 시험기간에 돌입을 한다. 점점 힘들어질것이다. 포기 하지 않고 시간을 규모있게 써서 완주 하고 싶다 미션미션 해결 과정(인프런 워밍업 스터디 클럽2기 백엔드(클린코드, 테스트 코드)🍀 Day4 미션 | Sung Jae's Blog (byuntil.github.io)위 블로그에 작성을 해놓았다. 미션 해결에 대한 회고정말 간단한 미션이었고, 그렇게 난이도 자체도 높지 않은 미션이었다. 하지만 고민해본 부분들은 상당히 많았다. 정말 이런 간단한 문제조차도 이렇게 고민 해야 하는 부분이 많은데 나중에 실무에서나 아니면 교육기관이나 프로젝트를 할 때 내가 정말 잘 해낼 수 있을지 덜컥 겁부터 난다.겁이 난다고 이 상태로 있을 것이 아니라 꾸준히 노력을 한다면 충분히 해 내리라는 자신이 있다.

백엔드인프런워밍업클럽2기클린코드

JiHye Shim

[워밍업 클럽 백엔드 스터디2기] 1주차 발자국✏️

강의 수강강의 내용 요약추상과 구체추상 : 구체적인 정보들에서 중요한 특정 측면만을 뽑아낸다 => 추상적 사고를 기반으로 이름 짓기 잘 쓰여진 코드한 메서드의 주제는 반드시 하나로, 메서드 단위로 구체적인 내용을 추상화Early Return사고의 depth 줄이기객체지향추상의 관점으로 바라보는 객체 지향SOLID상속과 조합, 다형성, VO 등을 활용한 객체 지향 적용 학습 내용 회고코드를 다 따라치고 이해하고 정리하면서 강의를 들으려고 노력해서, 시간이 오래 걸렸지만 그만큼 학습에 집중한 것 같아서 좋았던 것 같다. 하지만 아직 진행중..진도를 중간에 놓쳐서 지연된 점이 좀 아쉽다는 생각이 든다.미션미션 내용생각나는 추상과 구체의 예시 : 영화를 보는 과정을 구체 레벨에서 표현하기현재 상영 영화를 확인한다영화 시간표를 확인한다영화 예매와 결제를 한다영화시간에 맞춰 영화관을 간다영화관 좌석을 확인하여 앉는다영화를 본다  단순히 '영화를 본다'를 구체 레벨로 과정을 통해 설명하는 부분에서 추상과 구체의 개념 정리를 할 수 있었다. 코드 리팩토링(원문)public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }(리팩터링)public class Validate { public boolean validateOrder(Order order) { if (hasEmptyItems(order)) { log.info("주문 항목이 없습니다."); return false; } else { return isTotalPriceOverZero(order) && hasCustomersInfo(order); } } public boolean hasEmptyItems(Order order) { return order.isEmptyItems(); } public boolean isTotalPriceOverZero(Order order){ if(order.isOverZeroPrice()) { return true; } else { log.info("올바르지 않은 총 가격입니다."); return false; } } public boolean hasCustomersInfo(Order order) { if (order.hasCustomerInfo()){ return true; } else { log.info("사용자 정보가 없습니다."); return false; } } }처음 리팩터링 과제 진행할때 어려움이 있었는데, 강의 내용을 기반으로 최대한 메서드 단위로 부정어, 사고의 depth, Early Return을 고려해서 해결하고자 노력했다.SOLIDSRP : 단일 책임 원칙(Single responsibility principle)한 클래스는 하나의 책임만 가져야 한다. OCP : 개방-폐쇄 원칙 (Open/closed principle)소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다 LSP : 리스코프 치환 원칙 (Liskov substitution principle)프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 ISP : 인터페이스 분리 원칙 (Interface segregation principle)특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다 DIP : 의존관계 역전 원칙 (Dependency inversion principle)의존 관계를 맺을 때, 변하기 쉬운 구체적인 것보다는 변하기 어려운 추상적인 것에 의존해야 한다. SOLID의 대한 개념은 항상 헷갈렸는데, 직접 본인만의 언어로 정리하려고 노력해서 이해하는데 도움이 된 것 같다.미션 회고급하게 과제 목적으로 진행해서 놓친 부분이 많을 수도 있다는 생각에 아쉽다.그래도 강의 수강하고 진행해야하는 과제이기 때문에, 강의 내용을 정리하면서 더 잘 이해할 수 있는 과정을 같아서 좋았다.

백엔드백엔드워밍업스터디클럽클린코드

첫째주 발자국 👣

추상화이름짓기 메서드 선언부의 의미 추상화 레벨   추상화 레벨이 동등해야한다.매직넘버, 매직 스트링 상수로 추출하기논리, 사고의 흐름 뇌 메모리 적게쓰기 Early return, 사고의 depth 줄이기 공백 라인이 가지는 의미, 부정어 - 긍정문으로 바꾸기 해피 케이스와 예외처리 - 예외에 더 집중하자. Null 처리 주의하기 객체 지향 패러다임 추상의 관점으로 바라보는 객체 지향  객체 = 데이터+ 코드  객체설계 : 관심사의 분리 -> 높은 응집도와 낮은 결합도getter/ setter 자제하기 객체에 메시지 보내기 SOLID: SRP, OCP, LSP,ISP,DIPSRP : 단일 책임의 원칙OCP : 확장에는 열려있고 수정에는 닫혀있다.LSP : 부모가 있는곳을 자식이 대체할수있어야한다.ISP : 인터페이스를 기능단위로 쪼갠다.DIP : 고수준 모듈과 저수준모듈 각각 추상화를 의존하도록 하기 객체 지향 적용하기상속과 조합조합과 인터페이스를 활용하는것이 유연한 구조Value Object 도메인의 어떤 개념을 추상화하여 표현한 값 객체 일급컬렉션 : 컬렉션을 유일한 필드로 가지는 객체👩🏼‍💻첫째주 회고미션1 : 세수한다를 구체적으로 적어보았는데, 하나하나 생각해보니 저 단어에 참많은 행동들이 축약되있구나 라는 생각이 들었다. 추상화를 좀 더 이해할 수 있는 미션이었다.미션2 : 코드를 리팩토링 하는 것이었는데, if-else문이 너무 많아서 복잡해보였다. 그래서 얼리 리턴 구조로 우선 변경을 하고, if문 조건문에 ! (부정어)가 쓰여서 메서드를 추출해서 긍정문으로 바꿨다. 미션을 제출하고 보니 메서드중에 get으로 꺼내는게 있던데 이것도 수정해야하는 거 아닌가 라는 생각이 들었다. 강의 듣는 내내, 새롭게 접하는 부분이 많아서 이해하고 생각할 거리가 많았다. 그래서 하루에 해야할 분량이 너무 많게 느껴져 힘들었다. 그래도 끝까지 하는게 목표! 다음주도 화이팅 👏출처 https://inf.run/kHiWM

Groot

<워밍업 클럽 2기 - 백엔드 클린 코드, 테스트 코드> 1주차 발자국

강의 수강수강한 강의: Readable Code: 읽기 좋은 코드를 작성하는 사고법학습 내용 요약이번주는 가볍게 추상, 인지 부하를 줄여주는 코드 작성법, SOLID 위주로 공부했다.회고이번주는 익숙한 내용이 많아서 쭉쭉 진도를 나갈 수 있었다. 뒤에 가면 어렵지 않을까?역시 매주 미션이 주어지니 목표가 있어서 훨씬 의욕적으로 수강하게 되는 것 같다.계속 인프런 사이트에 접속하다보니 예전에 할인하길래 사두고 방치한 강의도 다시 보게 된다. 문득 이렇게 여유로운 날에 모두 공부해봐야 겠다는 생각이 든다. ㅎㅎ인프런의 노트 기능을 처음 써봤는데 내용을 상기하기 좋았다. 이미지도 첨부되어서 그냥 아무 맥락 없이 내 개인 노트에 남기기 보다 노트 기능으로 남겨두니 더 맥락있게 볼 수 있어서 좋았다. 앞으로도 활용해볼 것 같다.미션해결 과정이번주는 간단한 미션이라 큰 무리없이 진행할 수 있었다.회고간단한 코드도 직접 고쳐보고 내용을 적용해볼 수 있어서 좋았다. 원칙들을 내 언어로 풀이하는 것도 재밌었고 이해도를 높여주는 것 같다.앞으로도 아직 나에게 생소한 원칙/개념이 있다면 나만에 언어로 풀이해보면 좋을 것 같다. 

백엔드클린코드워밍업클럽2기자바

hong721816

[인프런 워밍업 클럽 스터디 2기 - 백엔드 클린 코드] 1주차 발자국 회고

학습 내용 추상화 추상화 : 복잡한 정보들 속 중요한 정보만 추출하여 남기고, 나머지는 버림좋은 추상화란? 1. 해당 도메인 영역 안에서, 2. 중요한 정보만을 표현했는가?추상화를 잘 할 수록 읽기 좋은 코드가 만들어진다..이름짓기 추상화의 대표적인 예시! 해당 변수나 메서드가 어떤 역할인지, 어떤 일을 하는지 단번에 알아챌 수 있어야 한다. 메서드에서의 추상화 : 한 메서드에서의 주제는 반드시 하나다.잘못된 추상화는 한 메서드가 2가지 이상의 일을 하고 있을 것. 추상화 레벨 : 하나의 세계 안에서는, 추상화 레벨이 동등해야 한다.// As-Is // 너무 구체적인 내용을 if 안에 담지 않았는가? public static void main(String[] args) { showGameStartComments(); initializeGame(); showBoard(); ... if (gameStatus == 1) { System.out.println("지뢰를 모두 찾았습니다. GAME CLEAR!"); break; } } // To-Be // 추상화 레벨을 비슷하게 public static void main(String[] args) { showGameStartComments(); initializeGame(); showBoard(); ... if (doesUserWinTheGame()) { System.out.println("지뢰를 모두 찾았습니다. GAME CLEAR!"); break; } } 인지적 경제성최소한의 인지로 최대의 효율 얻기Early return : 미리 return을 해버려 else의 사용을 최대한 줄이기앞선 조건을 기억하지 않기 위함!중첩 분기문, 중첩 반복문 : depth를 줄이기! but, 무조건 1depth로 만드는 것이 아닌, 추상화를 통한 사고 과정의 depth를 줄이는 것이 중요!사용할 변수는 가깝게 선언공백라인도 의미를 가진다. 부정어구 사용 자제 : !isLeftDirection() 보다는 , isRightDirection() 으로 부정연산자는 가독성이 떨어진다. 예외처리 : 항상 NPE를 방지하는 방향으로 !! 예외가 발생할 가능성을 낮추기, Optional을 고려하기  객체 설계하기새로운 객체 설계 시 1개의 관심사로 명확하게 책임이 정의되었는지 확인하기 getter / setter 사용 자제. update~ 같이 의도를 드러내는 네이밍 사용하기  SOLID 원칙단일 책임 원칙 - 하나의 클래스는 하나의 변경 이유 (책임) 만을 가지도록책임이라는 경계선이 사람마다 다르기 때문에, 책임을 볼 줄 아는 눈을 기르는 것이 중요하다개방-폐쇄 원칙 - 확장에는 열려있고, 수정에는 닫혀있기.시스템의 기능을 확장할 때, 최대한 기존 코드를 변경하지 않도록 설계하기리스코프 치환 원칙 - 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 함자식클래스가 부모클래스의 행동을 변경해서는 안된다. 인터페이스 분리 원칙 - 인터페이스를 잘게 쪼개서 자신이 사용하는 인터페이스에만 의존하도록의존성 역전 원칙 - 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안됨 두 모듈 모두 추상화에 의존해야 함 -> 저수준 모듈의 변경이 고수준 모듈에게 영향을 끼치지 않도록 4L 회고Liked기능 구현에만 급급하던 지난 프로젝트와 달리, 클린코드란 개념에 대해 배울 수 있어서 좋았다.특히, 인지적 경제성 파트에서의 Early return 과 부정어구 사용 파트에서 많은 깨달음을 얻었다. 내 코드를 돌아보며 이해가 안됐던 경험들을 개선시킬 수 있으리라 생각한다.SOLID 같은 개념도 그동안 많이 들어와서 잘 알고 있다고 생각했던 개념들이었지만,직접 코드를 수정해가면서 학습하니 기존 지식을 더 구체화할 수 있어서 정말 좋았다.  LackedOptional 을 그동안 너무 무의식적으로 사용했다. 그냥 NPE 예방에 효과적이라고 해서, 좋은게 좋은거지 라는 마인드로 사용했던 것 같다.이번에도 예외처리 파트에서 Optional 에 대해 간략하게 배웠는데, 아직 제대로 사용하는 법을 모르겠다.해당 내용에 대해 best practice 위주의 더욱 자세한 학습이 필요하다.  Learned상단의 학습 내용 Longed for학습 내용을 기록하고 해당 예시를 들 때, 단순 개념을 적는것보다는 코드로 보는게 더 수월할 듯 하다.다음에는 회고록에 개념을 정리하면서, 관련 코드예시를 든다면 더 좋을 것 같다. 미션 회고추상의 개념코드 리팩토링SOLID 개념 https://velog.io/@hong721816/%EC%9B%8C%EB%B0%8D%EC%97%85-%ED%81%B4%EB%9F%BD-2%EA%B8%B0-Day4-Mission접근 방법은 해당 블로그에 정리해 두었다.

백엔드

thagyun

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

[따라하며 배우는 자바스크립티, 리액트 A-Z - John Ahn] 1주차 회고:우선 시작하기 앞서 변명을 하자면, 지원 마감 공고가 몰려있어 자기소개서와 포트폴리오 수정으로 입사 지원에 시간을 더 쏟아 스터디에 집중하지 못했다. 그 결과 일주일 동안 day 2 파트(section 2~4)만 수강하게 되었다. 시간 관리의 중요성을 깨닫게 되는 한 주였다.그럼에도 불구하고 매일 1강이라도 들으려고 노력했고, 그 과정에서 개념은 알고 동작 과정을 자세히 몰랐던 내용을 학습할 좋은 기회가 되었다. 이번 주에는 입사 지원에 시간을 많이 할애했지만, 다음 주부터는 스터디에 집중할 수 있으므로 오전에 강의를 수강하여 하루를 시작하는 방식으로 생활 습관을 바꾸고자 한다.또한 밀린 강의와 과제를 리액트가 시작되기전에 마무리할 것이다. (아좌좌 💪🏻) 강의를 통해 배울 수 있었던 내용 정리섹션 2: 자바스크립트 기초console 객체는 항상 console.log()만 사용했었는데 다양한 객체가 존재하고 활용할 수 있는 방법을 알게 됐다.호이스팅 개념만 알고 어떻게 동작하는지 자세하게 몰랐는데 이번 기회를 통해 알게 됐다.Template Literals: backtick(`)을 사용하여 문자열을 표현한 것의 정확한 명칭을 알게 됐다.섹션 3: Window 객체 및 DOMWindow 객체: 브라우저 창 정보DOM 객체: 브라우저 내 웹 페이지 콘텐츠 정보CRP의 흐름을 배울 수 있었다.HTML로 부터 DOM Tree 생성DOM과 CSSOM을 결합하여 Render Tree 생성하여 콘텐츠, 스타일 정보 포함Render Tree로 부터 Layout 실행하여 요소의 크기 위치 계산Layout로 부터 Paint 실행하여 실제 화면 그리기섹션 4: Event이벤트 버블링이란 중첩된 요소에 이벤트가 발생했을 때 이벤트가 위로 전달 되는 것이벤트 캡쳐링이란 이벤트가 하위 요소로 전파되는 단계이벤트의 3단계 흐름: 캡처링 → 타깃 → 버블링이벤트 위임이란 하위 요소의 이벤트를 상위 요소에 위임하는 것 1번 과제(Day2)음식 메뉴 앱gitbub: https://github.com/thayoon/study/tree/main/%5BFE%5DInflearn_WarmingUP_Club_Study_2nd/day_2최대한 배운 내용을 생각하며 만들었습니다.기능 개요스타일: Bootstrap v5.3 CDN참고 메뉴판: 청자다방1. 카테고리 버튼 생성카테고리 버튼들이 한 그룹으로 모여 사용자에게 카테고리별로 메뉴를 볼 수 있는 기능 제공각 버튼의 id는 해당 메뉴의 카테고리와 일치하도록 설정2. 카테고리별 필터링 기능 구현사용자가 특정 카테고리 버튼을 클릭하면 해당 카테고리에 속하는 메뉴만 화면에 표시카테고리 버튼 클릭 이벤트는 이벤트 위임(Event Delegation) 방식을 사용해 효율적인 이벤트 처리를 구현3. 메뉴 리스트 생성 및 동적 출력메뉴 아이템은 Bootstrap의 카드 레이아웃을 사용하여 그리드 형태로 출력메뉴 데이터를 바탕으로 각 메뉴의 이미지, 이름, 가격, 상세 설명이 동적으로 생성됨구현 세부사항1. 카테고리 버튼 생성 및 이벤트 등록categorys 클래스를 포함한 <div> 요소 내에 버튼들이 배치, 각 버튼에 카테고리별 ID 설정<div class="categorys d-flex justify-content-center flex-wrap"> <button type="button" id="all" class="btn">ALL</button> <button type="button" id="coffee" class="btn">커피</button> <button type="button" id="ade" class="btn">에이드/주스</button> ... </div>버튼 클릭 시 해당 카테고리에 맞는 메뉴를 필터링하여 표시const categoryButtons = document.querySelector(".categorys"); categoryButtons.addEventListener("click", (event) => { if (event.target.type !== "button") return; // 버튼 외 요소 무시 if (event.target.id === "all") { createMenuItems(menus); // 모든 메뉴 표시 } else { createMenuItems( menus.filter((item) => item.category === event.target.id) ); // 카테고리별 메뉴 표시 } });2. 메뉴 리스트 동적 생성메뉴 정보는 JavaScript 객체 배열로 관리, 각 메뉴 항목을 Bootstrap 카드 형태로 출력const createMenuItems = (menus) => { const menuList = document.querySelector(".menu-list"); menuList.innerHTML = ""; // 이전 메뉴 리스트 지우기 for (const menu of menus) { const col = document.createElement("div"); col.classList.add("col"); const card = document.createElement("div"); card.classList.add("card"); const img = document.createElement("img"); img.src = menu.img; img.classList.add("card-img-top"); const cardBody = document.createElement("div"); cardBody.classList.add("card-body"); const title = document.createElement("h5"); title.classList.add("card-title"); title.textContent = menu.title; const desc = document.createElement("p"); desc.classList.add("card-text"); desc.textContent = menu.desc; const price = document.createElement("div"); price.classList.add("d-flex", "justify-content-end"); price.textContent = menu.price; menuList.appendChild(col).appendChild(card).appendChild(img); card.appendChild(cardBody); cardBody.append(title, desc, price); } };3. 초기 메뉴 출력페이지가 로드되면 모든 메뉴가 표시되도록 window.onload 이벤트를 활용해 초기 메뉴를 출력window.onload = function () { createMenuItems(menus); };

프론트엔드워밍업클럽

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

강의 수강  일주일 동안 Readable Code 1~4강까지 수강했다. 기본적으로 추상에 대해서 강조를 많이 해주셨고, 이를 바탕으로 클래스를 정리하고 객체지향프로그래밍 하는 내용을 강사님 본인의 노하우를 가득 담아 강의해주셨다. 지금까지 들으면서 좋았던 건 기존에 공부했던 문법 위주의 내용이 아닌 실제 개발에서 생각해야 하는 방법과 고려해야할 것들이라서 흥미로웠다. 그리고 무지성으로 사용했던 기능들에 대해 자세히 알려주시고 본인의 철학까지 들을 수 있었던 것이 강의를 재미있게 들을 수 있었던 포인트 같다.  일정이 꽤 빡빡하고 체력이 후달려서 권장 진도를 맞춰 듣지는 못했지만, 진도가 뒤쳐지고 있어도 포기하지 않고 조금씩이라도 강의를 듣고 미션을 진행했다는 점을 스스로에게 칭찬해주고 싶다. 다만 다음주에는 자투리 시간을 잘 활용해서 강의 진도를 따라 잡고싶다. 또한 배경지식이 조금 부족한 탓에 한 번 들어서는 완전한 이해가 어려운 것이 매우 아쉽다. 일단 강의를 들으며 따라 코딩해보고는 있는데 깊숙히 체득했다는 느낌이 들지는 않는 것 같다. 이를 어떻게 해결해야할지 아직 감은 오지 않는데... 진도표 속도를 따라잡은 후 뭔가 머리속에서든 개인기록으로든 코드를 뜯어보고 정리해서 작성을 해봐야겠다는 생각이 있다..미션 미션은 짧은 코드를 섹션3에서 배운 '뇌메모리 적게쓰기' 내용을 최대한 적용하려고 노력해봤다. 몇 개의 단계가 있는데 차근차근 하나씩 코드에 적용하고, 모르는 사람이 작성한 코드라고 생각하고 '읽기 쉬운가?' 를 반문하며 마무리를 했다.  솔직히 정말 괜찮은 코드를 작성했다! 라고는 할 수 없을 것 같지만 처음보다는 읽기 쉬운 코드가 된 것 같긴하다~ 이후로도 다른 코드를 가지고 리팩토링을 연습을 꾸준히 해야겠다. Readable Code: 읽기 좋은 코드를 작성하는 사고법 - 박우빈 강사님https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard

harugi7

운영체제

*이 내용은 인프런 그림으로 쉽게 배우는 운영체제를 수강하며 정리한 내용입니다. 운영 체제의 구조운영 체제의 핵심은 커널이야.커널은 프로세스와 메모리, 저장장치를 관리하는 핵심적인 기능을 담당해.사용자는 운영 체제의 커널에 직접 접근할 수 없고, 인터페이스를 통해서 접근할 수 있어.인터페이스는 GUI, CLI로 나눌 수 있어. 이 두가지는 텍스트냐, 이미지냐의 차이이지 커널에 접근하기 위한 목적은 같아!GUI -> 이미지로 커널과 상호작용 ( ex. mac, window )CLI -> 텍스트로 커널과 상호작용 ( ex. 리눅스 )커널은 사용자로부터 자신을 보호하기 위한 시스템 콜이라는 인터페이스를 갖고있어.시스템 콜 없이 애플리케이션이 하드디스크에 접근하게되면 중요한 정보를 덮어쓸 수 있어...시스템 콜을 이용하면 자동으로 빈 공간에 저장하도록 해줘 ( 복잡하네😅 ) 사용자, 애플리케이션은 커널과의 인터페이스로 시스템 콜을 사용한다고 했는데,하드웨어와 커널과의 인터페이스로는 드라이버를 사용해...! 컴퓨터 하드웨어와 구조대부분이 폰 노이만 구조를 하고있어.CPU와 메모리를 두는 구조로, 배선을 바꾸는 대신 소프트웨어만 바꿔주면 되므로 편해졌어!CPU와 메모리를 연결하는 버스를 통해 명령어를 읽고, 데이터를 읽고 써. 컴퓨터 하드웨어에는 메인보드가 있어. 메인보드는 다른 하드웨어를 연결하는 장치야. 마우스 키보드 등등...장치 간에 데이터를 전송하는 건 메인보드의 버스가 담당해.CPU와 메모리를 메인보드에 꽂아줘. ( 폰 노이만 구조니까~ )하드디스크 연결 단자에는 하드디스크를 꽂아주면 돼. 마찬가지로 그래픽카드 연결 단자에는 그래픽 카드를 꽂아줘.출력 단자의 모니터 선을 꽂으면 모니터가 작동하게 돼. CPU 구조Central Processing Unit의 약자로, 중앙 처리 장치라고 불려.산술논리 연산장치 ( Arithmetic and Logic Unit, ALU ) : 데이터 연산 담당제어 장치 ( Control Unit ) : 모든 장치들의 동작을 지시하고 제어하는 장치레지스터 : 계산을 위해 임시로 보관하는 장치 메모리 종류RAM ( Random Access Memory )랜덤으로 데이터를 읽어도 저장된 위치와 상관없이 읽는 속도가 같아.전력이 끊기면 데이터를 읽어버리기 때문에 메인 메모리로 사용돼.ROM ( Read Only Memory )전력이 끊겨도 데이터를 보관할 수 있지만, 데이터를 한번 쓰면 수정할 수 없어.컴퓨터의 부팅과 관련된 바이오스를 저장하는데 주로 사용돼. 컴퓨터의 부팅과정컴퓨터의 전원을 누른다.ROM에 저장된 바이오스가 실행된다. ( 바이오스: 전원, CPU, 메모리, 키보드, 하드디스크 등 주요 하드웨어에 이상이 없는지 확인해. )이상이 없다면 하드디스크에 있는 마스터 부트 레코드에 저장된 부트로더를 메모리로 가져와서 바이오스가 실행한다.만약 윈도우즈 운영체제와 리눅스 운영체제가 둘 다 설치되어있는 컴퓨터라면 어떤 운영체제를 실행할지 선택하는 화면이 나온다.운영 체제를 메모리로 불러오고 모니터에 바탕화면이 보이게 된다.이제부터 실행되는 모든 응용 프로그램은 메모리에 올라와서 운영체제가 관리한다. 인터럽트CPU가 입출력 장치에 데이터를 읽거나 쓰려고 하는 상황을 생각해보자.CPU는 입출력 작업이 들어오면 입출력 관리자에게 입출력 명령을 내려.CPU 관점에서는 입출력 명령이 언제 완료될지 알 수 없기 때문에 주기적으로 확인해줘야해!!이러한 방식을 폴링(Polling) 방식이라고 해☺폴링 방식의 단점은 주기적으로 CPU가 확인해줘야하니 성능이 좋지 않다는 점이야. 인터럽트는 폴링 방식의 단점을 해결한 방식이야.CPU가 입출력 관리자에게 입출력 명령을 내리고 자기는 다른 일을 해.입출력 관리자는 입출력 명령이 완료되었을 때 CPU에게 신호를 주고, CPU는 그 신호를 받아서 ISR(Interrupt Service Routine)을 실행시켜 작업을 완료해.ISR은 특정 인터럽트가 들어오면 그 인터럽트를 처리하는 방식이야.인터럽트는 비동기적으로 작동하기 때문에 성능에 이점이 있어.하드웨어 인터럽트 ( ex. 입출력 )소프트웨어 인터럽트 ( ex. 유효하지 않은 메모리 접근 ) 참조 : 그림으로 쉽게 배우는 운영체제 1주차 회고칭찬하고 싶은 점 : 기한을 지켰다 😅아쉬웠던 점 : 권장 커리큘럼을 지키지 못했다.다음 주에는 권장 커리큘럼을 지켜 수강하는 것이 목표입니다!

운영체제워밍업클럽CS

harugi7

CS 미션

운영체제1.while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트 프로그램과 프로세스가 어떻게 다른가요?프로그램: 실행 가능한 코드, 즉 명령어들의 집합입니다. 디스크에 저장된 정적인 상태입니다.프로세스: 실행 중인 프로그램을 의미하며, 운영체제에 의해 관리되는 동적인 개체입니다. 프로그램이 메모리 상에서 실행되면 프로세스가 됩니다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍: 여러 프로그램이 메모리에 적재되어 있는 상태에서, CPU가 이들 프로그램을 번갈아가며 실행하는 방식입니다. CPU는 항상 바쁘게 작업을 처리하게 됩니다.멀티프로세싱: 여러 CPU를 사용하여 여러 프로그램을 동시에 실행하는 방식입니다. 여러 프로세서(혹은 코어)를 사용하여 작업을 병렬 처리할 수 있습니다.  운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB 컨텍스트 스위칭이란 뭔가요? CPU가 현재 실행 중인 프로세스의 상태(레지스터, 프로그램 카운터, 스택 등)를 저장하고, 다음 프로세스를 실행하기 위해 해당 프로세스의 상태를 복원하는 작업 자료구조와 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시맵(HashMap)을 선택할 수 있습니다. 해시맵은 키-값 쌍으로 데이터를 저장하며, 학생의 학번이나 이름을 키로 사용하고, 그에 대한 정보를 값으로 저장할 수 있습니다. 해시맵은 평균적으로 O(1)의 시간 복잡도로 빠르게 검색할 수 있어, 많은 학생 정보에 대한 접근이 효율적입니다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.큐(Queue)를 선택할 수 있습니다. 큐는 선입선출(FIFO, First In First Out) 방식으로 데이터를 처리하는 자료구조입니다. 주문은 들어온 순서대로 처리해야 하므로, 큐를 사용하면 가장 먼저 들어온 주문을 가장 먼저 처리할 수 있습니다.

워밍업클럽CS미션

harugi7

자료구조

*이 내용은 인프런 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)을 수강하며 정리한 내용입니다. 프로그램자료구조와 알고리즘으로 이루어져있어.실력이 있는 사람은 적절한 자료구조를 선택해 적절한 알고리즘으로 원하는 결과를 얻지. 시간복잡도특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간이야.하지만 각자의 컴퓨터 성능에 따라 해결하는 시간이 달라지겠지?!그럼 코드에서 성능에 가장 많은 영향을 주는 부분은 어떤 것일까?바로 반복문이야. 따라서 해당 알고리즘의 반복문을 보고 성능을 평가해 😀예를 들어볼게!arr = [1, 4, 3, 6]위와 같은 배열이 있을 때, 3을 찾는 알고리즘을 구상한다고 해보자.그럼 반복문을 통해 배열을 전체 탐색해보면 되겠지?이렇게되면 3의 위치에따라 시간복잡도가 달라질거야...위와 같은 경우때문에 세가지 경우로 시간복잡도를 나눠.Big-Ω : 최선의 경우 한번에 찾음Big-O : 최악의 경우 배열의 길이만큼 걸림Big-Θ : 평균의 경우 배열의 길이 중간만큼 걸림 Big-O보통 Big-O를 사용해. 위와 같은 경우에는 Big-O가 배열의 길이인 4가 되겠지?즉 O(n) = n 이 되는 경우야.O(n)같은 경우는 입력이 많아질수록 계산량이 많아져. 이를 선형시간 알고리즘이라고 해.O(1)은 상수시간 알고리즘이라고 해. 입력의 크기와 상관없이 상수의 시간이 걸린다는 뜻이야.입력의 크기와 상관없이 100번의 시간이 걸린다고 해도 O(1)으로 표기해!그 외에도 여러 알고리즘이 있어.O( 1 ) > O( log(n) ) > O( n ) > O( nlog(n) ) > O( n**2 ) > O( 2**n ) > O( n! )오른쪽으로 갈수록 성능이 좋지 않아. 만약 n**2 + 2n + 100의 성능을 보이는 알고리즘이 있다면가장 영향을 많이 미치는 n**2만 남기면 돼. 즉 O(n**2)이야.3n**2 + 100이라면?O(3n**2)?맞아.하지만 상수는 큰 의미가 없으므로 O(n**2)으로 표기하면 돼. 배열배열은 값을 접근하고 읽는데에 O(1)만큼의 시간이 걸리므로 접근에는 용이하지만,데이터를 추가하고 제거하는데에는 내부적으로 필요한 단계가 많이 들기때문에, 성능이 좋지 않아.또한 미리 공간을 할당하기 때문에 낭비되는 공간이 존재할 수 있다는 단점이 있어!하지만 일반적인 배열과는 다르게 자바스크립트에서의 배열은 불연속적으로 값을 할당해. Linked List일반적인 배열의 단점을 보완하려면 어떻게 하면 좋을까?바로 저장하려는 데이터들을 메모리 공간에 분산해 할당하고, 이 데이터들을 연결하면 돼.위 행위는 노드(node)라는 것을 만들어 수행해.노드는 데이터를 담는 변수, 다음 노드를 가리키는 변수 하나를 갖고있어.첫 노드의 주소만 알고있다면, 모든 노드에 접근할 수 있어.이를 Linked list라고 해.장점으로는 배열처럼 초기 크기를 알아야한다는 단점이 없어!또한 중간에 데이터를 삽입하려면, 다음을 가리키는 변수만 바꿔주면되기때문에 간단하다는 장점도 있어.단점으로는 데이터 참조가 O(n)의 성능을 가진다는 거야. 배열 vs Linked List 참조 : 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편) 1주차 회고칭찬하고 싶은 점 : 기한을 지켰다 😅아쉬웠던 점 : 권장 커리큘럼을 지키지 못했다.다음 주에는 권장 커리큘럼을 지켜 수강하는 것이 목표입니다!

알고리즘 · 자료구조워밍업클럽CS

코틀린 백엔드 프로젝트 2기 - 1주차

1주차에서 학습한 내용의 범위는 섹션2 ~ 섹션3 6 까지의 내용이다. 섹션 2 에서 학습한 내용은 Spring웹 프레임워크, HTTP, REST API, DBMS, JPA 에 관한 부분이다. Spring웹 프레임워크로서 동적 웹 개발을 도와주는 도구이다 백엔드에서 사용되는 다양한 종류의 프레임워크가 있는데 그 중 자바 진영에서 가장 많은 발전을 해왔고 가장 유명한 프레임워크가 바로 spring 프레임워크이다.스프링 프레임워크는 MVC 패턴을 주로 사용하는데사용자의 데이터를 모델에 담기 위해 작업을 하는 controller사용자의 데이터를 담아두는 model담긴 데이터를 꺼내와 사용자에게 보여주는 view이 3가지를 MVC 라고 한다.스프링은 controller - service - repository의 레이어드 아키텍쳐를 기반으로 개발을 한다.컨트롤러는 클라이언트로부터 전달받은 데이터를 검증하는 인터페이스로 서비스 레이어를 호출한다.서비스 레이어는 프로젝트 목적에 맞는 비즈니스 로직을 처리하는 레이어이며 리포지토리를 호출하여 여러가지 삽입, 조회, 수정, 삭제를 실행한다.리포지토리는 데이터베이스에 접근하여 서비스로직이 호출한 기능을 수행한다. HTTP네트워크를 통해 통신할때 지켜지는 통신 규약으로 다양한 요청 메서드를 통해서 API 호출을 할 수 있다. GET, POST, PUT, PATCH, DELETE의 메서드를 사용하며 각 메서드는 REST API의 행위로서 사용이 됩니다. REST API HTTP 통신을 하는 어플리케이션간의 규칙이며 강제성을 띄지는 않지만 핵심적인 내용으로 URL을 통한 자원의 표현, HTTP 메서드를 통해 행위를 표현하며 HATEOS를 준수하여 클라이언트의 행위 가이드가 되어줍니다. DB 여러 사용자가 공유하기 위한 목적으로 사용되는 통합, 관리데이터의 집합으로 DBMS를 통해서 데이터들을 관리할 수 있습니다. 가장 널리 쓰이는 관계형데이터베이스를 통해 강의를 진행할 예정이며 관계형 데이터베이스는 테이블을 통해 저장을 합니다. JPAJava Persistence API의 약자로 자바 ORM 기술의 표준 인터페이스입니다. 자바 또는 코틀린으로 생성된 객체를 데이터베이스의 테이블로 매핑하여 사용해주고 그 필드들을 컬럼으로 매핑해줍니다. ORM 기술을 사용하여 개발자가 직접 쿼리를 작성하지 않게 해줍니다. ORM기술은 특정 데이터베이스에 종속적이지 않은 사용이 가능하며 다양한 DBMS로 변환이 가능하고 데이터를 객체 중심적으로 볼 수 있어 유지보수에 유리합니다.단점으로 복잡한 쿼리를 작성하는 상황에서의 한계점, 성능 최적화가 이루어 지지 않은 점, 그리고 초기 학습 곡선이 크다는 점입니다.ORM은 많은 개념과 설정이 필요하기 때문에 학습에 많은 시간이 소요됩니다 영속성 컨텍스트JPA에서 엔티티를 관리하는 임시 메모리의 개념이다.특징 1차 캐시 영속성 컨텍스트는 DB에서 조회한 엔티티를 1차캐시에 저장합니다. 동일한 트랜잭션의 동일한 쿼리일경우 1차캐시의 엔티티를 반환합니다. 이로인해 성능을 향상시킵다더티체킹(변경감지)영속성 컨텍스트에 저장(스냅샷), 트랜잭션 진행 중 엔티티의 필드 변화 시 현재 상태와 저장된 스냅샷을 비교변경이 감지되면 트랜잭션이 종료되기전 해당 필드에 update 쿼리를 실행하고 커밋 시점에 해당 쿼리를 DB에 전송 지연로딩(쓰기지연, Lazy Loading)실제로 필요한 시점까지 데이터를 조회하지 않고 대기하는 방식해당 엔티티가 실제로 사용될 때 DB에서 가져오는 방법멤버 객체 내부에 소속이라는 객체가 존재한다고 가정맴버를 조회할 때는 소속 객체를 로드하지 않음맴버의 소속을 조회하는 시점이 되어야만 로드를 함동일성 보장 같은 트랜잭션 안에서 같은 엔티티에 대하여 동일한 객체를 보장한다.1차 캐시와 연관이 있는것 같음, 동일 엔티티를 여러번 조회하여도 동일한 객체를 반환함 1주차의 섹션 3 학습내용은 6강까지의 강의를 수강하였습니다.https://start.spring.io 사이트를 통해서 프로젝트를 생성하였고 git, github를 이용하여 프로젝트 진행 사항을 관리할 수 있게 세팅하였습니다.프로젝트의 클래스들을 생성하면서 각 클래스 엔티티에 @Id, @GeneratedValue, @ olumn 등 데이터베이스에서 인지할 수 있는 어노테이션들을 학습하였고추상클래스에는 @MappedSuperClass 어노테이션을 선언하여 클래스를 상속받는 클래스들의 필드를 테이블의 컬럼으로 사용할 수 있게 해주었습니다.

백엔드

jin02019

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

1주 회고 (KPT 템플릿 활용)Keep (만족했고, 앞으로 지속하고 싶은 부분)섹션2의 내용인 '추상'에 대해서 그동안 이렇게까지 깊게 생각해본적 없었는데, 강의 덕분에 추상을 객체지향적인 관점과 함께 생각해볼 수 있었다.'캡추상다'처럼 객체지향에 대해 거의 암기식으로 생각을 했었는데 코드와 자세한 설명으로 인해 필요성을 느꼈고 더 와닿게 배울 수 있었다.평일에 퇴근하고 공부를 해야한다는 생각은 했었지만, 그동안 피곤하다는 이유로 실천하는 것이 어려웠다. 그렇지만 워밍업 클럽에 참여하며 강제성이 생겨 조금씩이라도 공부를 할 수 있었다. 이번 기회에 공부습관을 잘 만들어서 지속적으로 이어졌으면 좋겠다.Problem (부정적인 요소로 작용했거나 아쉬웠던 점)지난 달 말부터 새로운 프로젝트에 참여하게 되면서 쉬는 날에도 업무를 해야하는 경우가 생겨 스터디에 투자할 수 있는 시간이 적었다.이로 인해 강의 진도를 커리큘럼대로 따라가지 못해 밀리거나 미션을 마감기한 전에 급하게 제출하는 경우가 있었다.Try (Problem에 대한 해결 방식으로 다음에 시도해볼 점)워밍업 클럽에 참여하는 동안에는 주말의 휴식, 여가시간을 줄이고 강의내용과 미션에 좀 더 집중해봐야겠다.배웠던 내용을 정리하면서 강의를 수강하다보니 강의를 듣는 시간이 오래 걸렸다. 커리큘럼보다 진도가 늦어진 경우에는 강의를 정리하기보다는 먼저 정해진 진도까지 수강하고 여유가 있을 때 복습하는 겸 강의를 정리하면 좋을 것 같다.미션 정리day2 미션 _"추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다.헬스장에서 운동을 하는 과정을 구체 레벨에서 표현한다면? 헬스장에 도착해 출입 카드 등을 통해 출입을 인증한다.운동복과 운동화를 착용한다.준비운동 또는 스트레칭을 통해 근육을 풀어준다.기구 또는 맨몸을 사용하여 신체를 조절한다.헬스장을 나가며 출입을 종료한다.day4 미션 1) 아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다. 2) SOLID에 대하여 자기만의 언어로 정리해 봅시다.https://www.inflearn.com/blogs/8394

프로그래밍 언어워밍업클럽백엔드발자국

인프런 워밍업 스터디 클럽 2기 -백앤드 클린코드,테스트코드 1주차 발자국

https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%951주차 진도는 readable 강의 세션 1~ 세션 4까지 였다.취직하면 유용할 리더블코드랑 테스트 코드 강의를 쿠폰 사용해서 할인받아서 살수있어서 쵝오! (뿌듯) 이 강의 를 들으면서 스터디에 참여할수있고 일석이조! 무엇보다 테스트코드 짜기 힘들어서 고민하고 있던 찰라여서 리더블코드 뒤에 배우는 테스트 코드 강의도 매우 기대된당! 실무에선 테스트 코드 짜는데 시간을 매우 많이 쓴다고 들었당.. 개발자 사회에 나가기 무서워 바들거리는 나약한 늙은 취준생..에겐 암튼 찰떡이당. 숙제도 화, 목 이렇게 두개 있어서 부지런히 해야했다! (하지만 부지런하지 못해 last minute에 허겁지겁 했지..)게으르고 가련한 취준생 에게 이렇게 숙제도 있어서 주워진 시간에 맞춰야하는 강의를 들어야 하는 스터디는 너무 좋은거 같아서 기쁘당! >_< 알려주신 분들께 감사!   4LS-회고법을 사용해보장!Liked (좋았던 점) 강사 선생님이 내어 주신 숙제를 통해 강의에서 배운거를 한번 적용하거나 정리할수 있고 또 함께 스터디 하는 분이랑 같이 배운거에 대해서 이야기할수있고 모르는건 물어볼수 있어서 좋았다. 개발자 친구들 생긴 기분 >_<v기간 내에 진도를 나가야지 숙제도 할수있고 또 스터디니 모르는건 같이 공부하는 사람들이랑 이야기하니 좋았당.스프링 오픈톡에서 추천받아서 참여한거라서 같이 스터디에 참여하신 분도 계시고 그래서 이번에 코드리뷰도 해주셔서 더 많이 배웠당! 유익한 시간!모르는 미지의 세계에 대한 격한 두려움이 있는 비전공자지만 이번 강의에 내가 좋아하는 뇌과학이랑 시도 나오고 추상화에 대해서 생각해보면서 추상화와 시랑 비교해볼수있어서 조금은 그 두려움이 사라진거 같기도 하다! Lacked (아쉬웠던 점)생각보다 양이 많고 나는 코드까지 따라치니 시간이 많이 걸려서 이제 부터는 더 부지런히 준비해야한다. ☹ 이건 내가 좀 더 노력하면 되는 문제! 하지만 현직 개발자분들에겐 초큼 양이 많지 않을까 싶지만 난 좋음!Learned (배운 점)지겹게 배운 SOLID 한번 더 배우니 조금 더 머리에 잘 정리된거 같고 좋다 이제 조금 워드보단 원리로 더 친숙해진거 같아서 굳.. 리더블 코드라는 강의 주제 답게 실무에서 리더블 코드의 중요성에 대해서 다시 생각하게 되었다. 1- 이름 짓기의 중요성 개발자들은 실무에서 찰떡같은 이름을 짓기위해서 많은 생각하는 시간을 보낸다고 한다. 협업하는 프로젝트일수록 진짜 이름 짓기가 중요하다. 내 시간도 절약되지만 타인의 시간도 절약시켜주니. 관용어처럼 줄이는 단어가 아니면 짧게 줄이는 이름보다 직관적으로 바로 이해할수있게 풀네임으로 짓는게 좋다고 한다. 메서드 이름과 함께 param을 연결 시켜서 문장 만들면 더 직관적인 코드가 된다. 이건 진짜 센스가 필요할거같다.. 연습해봐야지!  2- 뇌 메모리 적게 사용하기코테도 프로젝트도 겨우 겨우 구현하기 바빠서 한번도 생각 못해본건데 똑똑한 방법 같다. 너무 하나 하나 메서드로 만드는거 아닌가 했지만 깔끔해지긴 했다. 상황에 따라서 어떤게 더 직관적일지 판단해서 사용하는게 좋을거같다.if()문 안에 들어간 계산 법까지 메서드로 만드는 방법. 😮 3- Optional 사용 최소화하기 원래도 옵션널에서 꺼낼때 .get().getId() 이런 방식으로 코드가 짜여지는게 싫어서 .orElseThrow 사용해서 exception을 받아오긴 했는데 optional로 들어간 객체는 클래스안에서 반환할때 그냥 객체보다 무겁다고 한다. 이거 몰랐당!! .orElse랑 .orElseGet 이 두개가 조금 차이가 있으니 사용할때 조심하장.orElse()는 들어가보면 삼항?연산자( (number==7) ? true : false)를 사용하기 때문에 확정된 값만 사용한다.(null이 아닐때도 실행된다고 한다).orElseGet - null인 경우만 실행된다. 4- abstract 와 interface의 차이점 Abstract Class상속: 단 하나의 클래스만 상속받을 수 있다 (단일 상속).특징: 공통된 속성과 메서드를 포함하고, 자손 클래스에서 반드시 구현해야 할 추상 메서드를 가질 수 있다.용도: 관련된 클래스들 사이의 기본적인 구조와 행동을 정의하는 데 유용하다.예시: 기본 클래스에서 공통 기능을 구현하고, 자식 클래스에서 이를 확장할 수 있다.Interface상속: 여러 개의 인터페이스를 구현할 수 있으며, 인터페이스 간의 다중 상속이 가능하다.특징: 메서드 선언만 포함되며, 구현은 제공하지 않는다. 각 클래스가 필요에 따라 메서드를 구현해야 한다.용도: 특정 기능이나 역할을 정의하고, 서로 다른 클래스들이 이 기능을 공유하도록 한다.조합: 인터페이스를 잘게 나눠서 여러 개로 만들 수 있어, 불필요한 메서드를 피하고 필요한 기능만 구현하도록 할 수 있다. 예시: 자동차 만들기Abstract Class (차)자동차의 기본적인 구조와 공통 속성을 정의합니다. 예를 들어, Car라는 추상 클래스가 있을 수 있습니다. 이 클래스는 모든 자동차가 공통적으로 가지는 속성(예: 브랜드, 모델, 연료 종류 등)과 메서드(예: startEngine(), stopEngine())를 포함할 수 있습니다. Interface (기능들)인터페이스는 자동차가 수행할 수 있는 다양한 기능을 정의합니다. 예를 들어, Driveable, Flyable, Electric 같은 인터페이스가 있을 수 있습니다. 각 인터페이스는 특정 기능을 나타내며, 이를 구현하는 클래스는 해당 기능을 실제로 수행하는 메서드를 구현해야 합니다. 예시: abstract class Car { String brand; String model; abstract void startEngine(); abstract void stopEngine(); } interface Driveable { void drive(); } interface Flyable { void fly(); } interface Electric { void charge(); } 차 (Abstract Class): 자동차의 기본 구조와 공통 기능을 정의.기능들 (Interfaces): 자동차가 가질 수 있는 다양한 기능을 정의하여, 여러 클래스가 이를 구현할 수 있도록 함. Longed for (앞으로 바라는 점)미리 미리 열심히 해서 조금 더 깊이 있게 공부 하고 싶당.. 이건 나만 부지런해 노력하면 되는 일.. ☹ 다음에는 cs도 들어보곱.. 햐..  

인프런워밍업그터디클럽리더블코드클린코드인프런스터디

bbcc

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

회고이미 어느 정돈 알고 있다고는 생각해도, 강의를 들으며 복습 겸 몰랐던 부분을 추가로 알 수 있어 좋았다.운영체제와 자료구조 모두, 실무에서도 알고 구현하는 것과 모르고 구현하는 것은 차이가 있기 때문에 주기적으로 공부해야 한다.특히 운영체제도 그렇고. 일부 도메인 실무에서 종종 쓰이는 락프리 알고리즘을 구현할 때 사용되는 것의 기본이 큐 자료구조라(스택으로도 구현이 가능하나 대부분 글로벌 큐를 사용하니), head에 이어 tail이 왜 필요한지 등을 놓치지 않고 설명해주셔서 좋았다.  운영체제 간단 요약 <운영체제의 커널>- 인터페이스 통해 접근: 사용자의 직접 접근 불가- GUI: 그래픽으로 된 인터페이스 / CLI: 텍스트로 상호작용- 어플리케이션: 시스템 콜(인터페이스)을 통해 하드웨어 접근 <CPU 하드웨어 구조>1. 제어 장치- 모든 장치들의 동작을 지시하고 제어2. ALU(산술논리 연산장치)- 실질적인 연산을 담당3. 레지스터- CPU 내에서 계산을 위해 임시로 보관하는 장치 [인터럽트]- 폴링 방식의 문제 해결- 입출력 작업이 들어오면 입출력 관리자에게 명령을 내림- ISR 인터럽트 서비스 루틴: 특정 인터럽트가 들어오면 이를 처리하는 함수.- 비공기적으로 동작하기 때문에 성능에 이점 <컴퓨터 부팅 과정>1. ROM에 저장된 바이오스 실행2. 바이오스는 전원, CPU, 메모리, 키보드, 하드디스크 등주요 하드웨어에 이상이 없는지 체크 (이상 있으면 부팅 X)3. 바이오스가 부트로더-Ex.Window Boot Manager-를 메모리로 가져와서 실행- 운영체제가 2개 이상 설치되어 있다면 어떤 운영체제 선택할지 나옴4. 바이오스가 운영체제 메모리로 불러오고,응용 프로그램은 메모리에 올라와서 운영체제가 관리 PCB(Process Control Block)- 프로세스가 만들어지면 운영체제는해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장- PCB는 연결리스트: 운영체제는 프로세스가 종료되면연결리스트에서 해당 프로세스의 PCB를 제거한다 <프로세스 상태>1. 생성: 프로세스 생성 - 빈 스택, 빈 힙 등을 만들어 공간 확보,PCB 만들어서 값을 초기화2. 준비 (대부분의 상태): CPU 할당 대기3. (대기): 실행 일시 중지4. 실행 : 스케줄러 선택5. 완료: PCB 제거 <문맥 교환 플로우>프로세스01 인터럽트 발생 =>현재 CPU의 레지스터 값 등을 현재 프로세스01 PCB에 저장=> 타 프로세스02가 CPU를 사용하다가, 점유 시간이 다 되면운영체제는 다시 인터럽트를 발생 시킴 <프로세스와 스레드>프로세스: 서로 독립적, 안정성- 프로세스 간에는 IPC 통신이 필요스레드: 공유되는 공간에서 문제가 생길 수 있음,스택영역 제외 공유 가능 - 오버헤드 적음 <CPU 스케줄링 목표>1. 리소스 사용률2. 오버헤드 최소화3. 공평성4. 처리량 증가5. 대기시간 최소화6. 응답시간 최소화  자료구조 간단 요약 연결 리스트(Linked List)노드(Node)라는 요소들이 포인터를 통해 서로 연결되어 있는 자료구조스택(Stack)후입선출(LIFO, Last In First Out) 구조큐(Queue)선입선출(FIFO, First In First Out) 구조해시 테이블(Hash Table)키(Key)와 값(Value) 쌍으로 데이터를 저장셋(Set)데이터의 중복을 허용하지 않는 자료구조

KUMU

[Inf-WUP] 1주차 발자국

웹 서비스를 구성하는 요소클라이언트요청하는 주체 (브라우저)서버응답하는 주체DB에서 Data의 삽입, 수정, 조회, 삭제 -> 클라이언트에 반환데이터베이스데이터의 집합DBMS : 데이터의 집합을 저장하고 관리하는 역할 (보통 데이터베이스라고 하면 DBMS 의미)웹 서비스 실행 과정DNS 서버(전화번호부와 같은 역할. 주소를 다 갖고 있음)에서 도메인 전송DNS 서버가 도메인에 해당하는 IP 주소 찾아 알려줌해당 IP로 요청. 일반적으로 HTTP 통신. 이때 서버가 작업 처리를 위한 필요 데이터를 함께 전달작업 처리 (DB 삽입, 조회, 수정, 삭제 등)DB는 서버가 요청한 결과 반환조회 : 조회된 데이터 전달삽입, 수정, 삭제 : 작업의 성공 여부 응답서버는 클라이언트에게 작업 수행 결과 응답. 웹 브라우저가 화면으로 표현할 수 있는 HTML 포맷의 데이터 전달, 사전에 클라이언트와 협의된 규격의 데이터 전달 웹 프레임워크와 Spring웹 프레임워크; 동적 웹 서비스 개발을 편리하게 만들어주는 도구백엔드Java, Kotlin : SpringJavaScript, TypeScript : Express.js, Nest.jsPython : DjangoRuby : Ruby On Rails프론트엔드JavaScript : React(라이브러리), Angular, Vue.js프레임워크 vs 라이브러리; '제어의 주도권'프레임워크 : 틀 안에서 주어진 것들을 활용해 원하는 것 제작라이브러리 : 사용자가 주도권을 가지고 원하는 것 제작 Spring Framework; Java 기반의 웹 프레임워크MVC 패턴(Model-View-Controller)소프트웨어 아키텍처 디자인 패턴사용자의 요청을 받아 데이터와 화면을 전달하는 과정에서 각각의 역할 분담Model : 데이터를 담음.View : 사용자에게 보여지는 화면을 담당. Model에서 데이터를 꺼내올 수 있음Controller : 요청을 받아 작업을 수행. 작업의 결과 데이터를 Model에 넣을 수 있음레이어드 아키텍처(Controller-Service-Repository)Presentation(Controller) : 클라이언트가 요청할 수 있는 인터페이스 정의. 전달 받은 데이터 검증, Service의 메소드 호출Business(Service) : 목적에 맞게 데이터 처리. 일반적으로 Repository의 다양한 데이터베이스 처리 메소드 호출 -> 저장, 수정, 조회, 삭제Data Access(Repository) : 데이터베이스에 접근하여 작업 요청. 다양한 데이터베이스 처리 방법 제공 시 여러 서비스에서 공통적으로 사용 가능이점 : 별도의 컨벤션이 없다면 역할을 구분할 코드 재사용, 확장성, 협업 커뮤니케이션 등이 더욱 원활Spring Bean과 의존성 주입(Dependency Injection)스프링에서 관리되는 객체(Java 클래스의 인스턴스) 의미제어의 역전 IoC(Inversion of Control) : 스프링 Bean으로 지정된 클래스는 개발자가 직접 인스턴스를 생성, 관리하지 않고 스프링 컨테이너가 주체가 됨Bean에서 다른 Bean을 사용(의존)하는 경우 -> 스프링 컨테이너에서 의존성 주입의존성 주입 : 한 객체가 사용하는 다른 객체를 객체 내부에서 직접 만들지 않고, 외부에서 주입받아 사용하는 방법스프링 실행 -> 컴포넌트 스캔 -> Bean으로 지정된 클래스들의 객체 모두 생성 (한 Bean이 사용하는 다른 Bean이 있다면 그 Bean을 먼저 생성)스프링부트에서 의존성을 주입받는 방법생성자(Constructor); 가장 선호하는 방식의존성 변경 방지스택오버플로우 에러 방지NullPointerException 방지@Service class PresentationService( private val presentationRepository: PresentationRepository ){ //생략 }@Service class PresentationService{ private val presentationRepository: PresentationRepository constructor(presentationRepository: PresentationRepository) { this.presentationRepository = presentationRepository } //생략 }수정자(Setter)@Service class PresentationService{ private lateinit var presentationRepository: PresentationRepository //서비스 인스턴스, 레포지토리 인스턴스를 다 만들어 둠 //이후 실행 시 Autowired 인스턴스 찾아서 행동함 @Autowired fun sePresentationRepository(presentationRepository: PresentationRepository) { this.presentationRepository = presentationRepository } //생략 }필드(Field)@Service class PresentationService{ @Autowired private lateinit var presentationRepository: PresentationRepository //생략 }HTTP와 REST APIHTTP; HyperText Transfer Protocol 네트워크로 통신하는 두 컴포넌트 간의 통신 규약HTTP 요청/응답RequestStart Line : HTTP 메서드, URL, HTTP 버전을 표현Header : 컨텐츠의 길이나 유형, 클라이언트의 정보 담음Body : 서버에서 작업 처리를 위해 필요한 실질적인 데이터 담음. 최근에는 JSON 포맷 주로 사용ResponseStart Line : HTTP 버전, 상태 코드 , 상태 메시지를 표현Header : 컨텐츠의 길이나 유형, 서버의 정보 등을 표현Body : 응답의 결과 데이터 담음.서버 사이드 렌더링 방식 : HTML 사용클라이언트 사이드 렌더링 방식/서버 간의 통신 : JSON 사용HTTP 요청 메서드GETRead 작업을 요청 시 사용브라우저의 주소창은 항상 GET 메서드로 요청GET 요청 시 일부 HTTP 라이브러리에서는 Body에 데이터를 담을 수 없음따라서 데이터를 보내야 할 경우 쿼리 파라미터를 주로 사용POSTCreate 작업 요청 시 사용브라우저에서는 사용 X, Postman과 같은 별도의 툴을 사용해야함PUTUpdate 작업 요청 시 사용PATCHUpdate 작업 요청 시 사용DELETEDelete 작업 요청 시 사용HTTP 상태 코드; 응답에서 요청의 처리 결과를 표현하는 코드200 : OK201 : Created202 : Accepted300 : Multiple Choices400 : Bad Request401 : Unauthorized403 : Forbidden404 : Not Found405 : Method Not Allowed415 : Unsupported Media Type500 : Internal Server Error502 : Bad Gateway503 : Service Unavailable504 : Gateway Timeout REST API; HTTP 통신으로 동작하는 어플리케이션 기능을 정의하는 컨벤션※강제성이 없으며 클라이언트와 서버 간에 합의만 있다면 PST 메서드의 처리 결과가 삭제될 수도 있음. URL도 개발자 재량임REST API 핵심URL을 이용한 자원의 표현URL만으로 어떤 자원에 대한 요청인지 이해 가능하게 함HTTP 메서드를 이용한 행위의 표현CRUD에 부합하도록 적절한 HTTP 메서드를 사용하여 요청이 어떤 행위를 할 것인지 파악할 수 있게 함HATEOAS 준수HTTP 응답에 링크를 포함하여 클라이언트가 다음에 할 행동을 가이드REST API 예시회원가입O : POST /membersX : PST /createNewMember회원정보 조회(특정 회원)O : GET /members/1X : POST /getMemder?memberId=1가능한 REST를 준수하되, 팀 컨벤션 개설 필요클라이언트에서 서버로 데이터를 전달하는 방법Query Paratmeter(=Query String)컨트롤러에 @RequestParam 어노테이션으로 가져올 수 있음HTTP Request Body컨트롤러에 @RequestBody 어노테이션으로 가져올 수 있음Path Variable(=경로 변수)URL에 접근하고자 하는 자원의 식별자 표현.@PathVariable 어노테이션으로 가져올 수 있음데이터베이스; 데이터의 집합DBMS(DataBase Management System)DB를 저장하고 관리할 수 있는 응용 프로그램보통 웹 개발에서는 데이터베이스 = DBMS임 관계형 데이터베이스데이터를 행과 열로 이루어진 표의 형태로 저장행(Recode) : 한 개의 데이터열(Column) : 데이터의 특성후보 키 : 유일한 레코드를 식별할 수 있는 컬럼의 최소 조합기본 키 : 후보 키 중 대표로 지정한 것 대표적인 관계형 데이터베이스Oracle DatabaseMySQLPostgreSQL 비관계형 데이터베이스(NoSQL)관계형 데이터베이스를 제외한 모든 종류의 데이터 베이스대표적인 비관계형 데이터베이스MongDB문서형 데이터베이스데이터를 비정형적으로 저장RedisKey-Value 스토어 데이터베이스캐시 용도로 주로 사용JPA(Java Persistence API)란;자바 ORM 기술의 표준 인터페이스ORM(Object Relational Mapping); 객체 관계 매핑ORM의 장점개발자가 직접 쿼리를 작성하는 과정이 생략 -> 생산성 향상데이터에 객체지향적 관점으로 접근 가능구체적인 DBMS에 대한 의존성 감소ORM의 단점JPA로 데이터베이스를 정확히 다루려면 지식 필요ORM만으로 원하는 기능을 모두 구현하기에는 한계가 있음 트랜잭션정의여러 개의 데이터베이스 작업을 하나로 묶어주는 논리적 단위커밋 : 트랜잭션으로 묶인 모든 작업을 영구히 반영롤백 : 트랜잭션으로 묶인 모든 작업을 원상복구 영속성 컨텍스트정의JPA에서 엔티티를 관리하는 임시 메모리, 버퍼와 같은 개념 실습Intellij Github 연동프로젝트 생성Terminal 창에서 아래 명령어 입력git initView -> Tool Window -> Commit commit 창에서 Changes 선택 후 Ctrl+Alt+LGithub에서 레포지토리 생성View -> Git -> Manage Remotes레포지토리 URL 추가View -> Tool Window -> Gitmain 브랜치 push어노테이션@Entity : Entity 어노테이션을 달아줘야 JPA에서 테이블과 매핑되는 엔티티 클래스라는 것을 알 수 있음@GeneratedValue(strategy = GenerationType.IDENTITY) : PK 생성 전략을 정해줌GenerationType.TABLE : PK를 만들기 위한 테이블을 전용으로 만들어 PK 생성GenerationType.SEQUENCE : 순서대로 번호를 따지는 기능 MySQL은 사용 불가GenerationType.IDENTITY : 기본키 생성을 DB에 위임GenerationType.AUTO : JPA가 내부 알고리즘을 따라 자동으로 전략 결정@Column(name = "column_name") 이 필드가 어떤 이름을 가진 컬럼과 매핑되는지 개발자가 직접 지정@Column(nullable = false, updatable = false) : 값이 null일 수 없고 이 필드의 처음 생성된 값이 변경된다면 오류 발생됨@MappedSuperclass : 이 클래스를 상속 받는 클래스가 안에 있는 필드들을 해당 엔티티에 있는 테이블의 컬럼과 매핑@CreatedDate : JPA Entity가 생성된 시간 자동으로 세팅@LastModifiedDate : 마지막으로 수정된 일시는 언제인지@OneToMany : 현재 클래스와 타겟 엔티티가 1:n 관계@Enumerated(value = EnumType.STRING) : 자료형이 enum클래스일때 사용하는 어노테이션EnumType.STRING : 이름을 그대로 넣어줌fun findAllByIsActive(isActive: Boolean): List<ClassName> : JPA에서 알아서 쿼리 생성함select * from achievement where is_active = :isActive @Query("select e from Experience e left join fetch e. details where e.isActive = :isActive") : JPQL, 자바의 객체지향적인 쿼리fun countAllByCreatedDateTimeBetween(start: LocalDateTime, end: LocalDateTime): Long시작점으로 넣어준 시간과 종료점으로 넣어준 시간 사이의 모든 데이터를 세서 넣어줌ex. 오늘 방문자 수를 알아낼 수 있음 회고워밍업 클럽을 시작하며 가장 먼저 든 생각은 미리미리 해야겠다는 것이다... 대학교에 다니고 있어 미션과 발자국을 수행하며 강의를 병행할 수 있을지 걱정되어 1주차를 미리 들었다. 엔티티, 리포지토리를 직접 개발하며 이전에 배웠던 데이터베이스 내용이 좀 더 와닿았고, 어떤 식으로 구현이 되는지 알아가는 과정이 재미있었다.미션 회고우선, ERD를 처음부터 직접 설계하는 것은 처음이라 내 서비스에서 꼭 필요한 데이터가 무엇인지부터 추린 다음 해결하였다.가이드에 있는 ERD Cloud를 이용하였는데 데이터베이스 ERD 설계에 대한 내용을 다시 되짚어보는 기회가 되었다.2주차 미션과 강의를 미리 수행하며 1주차 미션을 보니 ERD 설계에서 수정해야할 부분이 눈에 보였다. 강의를 따라가며 차근차근 수정해나가야겠다.

백엔드워밍업클럽백엔드

클린코드 발자국 - 1주차 (워밍업 클럽 2기 - BE 박우빈)

이번 주 핵심 요약추상화를 통해 얻을 수 있는 이점을 이해하고 체득하면 더 도움 됨.도메인 지식과 연관지어, 문제 해결을 위한 하나의 도구, 하나의 개념...현재 다루는 코드의 목적이 분명해지고, 작업을 이해하기 용이해 짐느끼기에, 코드를 추상화하고 리팩토링하고 요약하는 과정은, 어떤 주제에 대해 말로 풀어 설명하는 것과 유사한 것 같기도? 순차적이고 논리적인 방식의 말이 듣고 이해하기 좋은 듯이, 작업의 순서와 목적, 작업 내용이 빠르게 눈에 들어오도록...SOLID => 위의 내용들을 체계화하고 정리한 핵심 개념으로, 알아두면 손해는 없을 듯. 되새겨보자 강의 수강학습 내용 + 이해한 내용추상추상이 뭔데? -> 묶고, 덜어내는 것(????). 공통된 특성을 찾아 묶은 뒤, 더 상세한 부분은 뭉술하게 덜어내는 것(중요하지 않아서 X, 나중에 SOLID 등의 개념과 함께 더 나은 방식으로 구체화...)클린 코드에 대해...우리는 코드를 많이 쓰는 것도 좋지만, 많이 읽어야 함(실제로도 읽는 비율이 높고...). 그렇기에 내 코드를 읽기 쉽게 쓴다는 것은 제일 먼저 나 자신, 나아가 동료들에게 정말 좋은 역량 -> 클린 코드. 변수, 클래스명을 잘 짓거나, 적절한 위치에 적절한 depth와 위치를 유지하는 것만으로 정말 가독성이 좋아진다.결국 읽는 것은 사람사람의 뇌가 어떻게 동작하느냐를 간단히라도 이해하고, 그 과정에 맞게 코드가 읽히도록 리팩토링해보자. 뇌가 한번에 기억할 양을 줄이고(좁은 작업에 집중시키기 => 메소드 분할, 연산 줄이기 => Early return 등...), 현재 작업에 기대하는 시나리오에 맞게 코드를 전개.객체 지향과 SOLID처리해야할 작업(도메인)에 집중해서 작업한 뒤, 객체 지향적 관점으로 코드를 다시 훑어보자. 이 때 SOLID 사용하면 도움 됨. 기초적이고 순수한 Java 객체 개념에 집중하면 코드를 더 알아보기 쉽게 정리하는 역량이 향상됨. 결국 도메인을 위해 복잡한 구조의 어떤 객체를 마련하기보다, 매우 작은 작업 단위를 처리하도록 설계된(아주 많이 추상화된) 객체를 조합하고 구체화하는 식으로 작업함이 좋다고 나는 이해함.  칭찬, 아쉬움, 보완칭찬해요: 강의 빼놓지 않고 들은 것만으로 칭찬 ㅎㅎ아쉬워요: 코드를 따라 작성하는 과정을 매우 많이 스킵함보완할것: 실습 과정을 더 가져보자 미션 수행미션과 수행과정내가 생각하는 추상과 구체란...내가 확실히 아는 지식은, 편하게 말로 설명할 수 있어야 한다는 관념이 있는데 그것을 여실히 느꼈던 미션. 강의를 이해했다 생각했지만 이것을 나만의 언어로 풀어낼 때 은근 어려움이 많더라...SOLID에 대해 정리해보고 코드 리팩토링 해보기외국어로 쓰여진 개념이라 몇 개는 정말 이해하기 어려웠음... 코드는 직접 읽어보고 '어 여긴 이해하기 어려운데...' 하는 부분을 중점적으로 리팩토링 했음. 크게 SOLID를 사용하진 않은 듯. 강의 때 배운 개념과 거의 부합하는 보완 사항이라 쉬웠음.미션 회고첫 주라 그런지 거의 강의만 들어도 처리 가능한 수준의 과제들이였던 듯. 지식 개념을 정말 내 언어로 편히 표현할 수 있을 정도로 내 것으로 만들었는지에 대해 주안을 둔 느낌이었음. 그래야 리팩토링 때 그것들을 내 것처럼 적절히 사용 가능할 테니까... 마무리Java 기초 개념 중 모르는 게 몇가지 있더라... (ex. Enum, Optional 등...). 이런 것들 따로 알아봐야 하는데 못했음. 남은 커리큘럼 보니 실습 분량이 많아질 것 같으니 기초 문법들은 잡아두고 들어가야 하지 않을까... 그래도 평소 코드를 작성하며 느꼈던 점들이 강의 내용에 많이 녹아 있는 것 같아 다행스럽기도 하고, 이해가 쉬웠음. 강사님께서 여러 예로 설명 들어주시는데 이해 잘 되어서 다행.

백엔드기초클린코드Spring

zooxop

인프런 워밍업 스터디 클럽 2기 백엔드(클린코드&테스트코드) 발자국 - 1주차

인프런 워밍업 클럽 2기, 백엔드(클린코드&테스트코드) 과정에 참여하고 있습니다.이번 1주차에는 클린 코드를 추구하는 이유와 클린한 코드를 작성하는 방법, 객체 지향적 사고, 객체 지향으로 프로젝트를 리팩토링하는 디테일한 스킬을 예제와 함께 배웠습니다.강의 링크: Readable Code: 읽기 좋은 코드를 작성하는 사고법  [학습내용 핵심 요약]자세한 설명이나 예제 및 코드는 강의 저작권 보호를 위해 기재하지 않았습니다. 1. 추상클린 코드의 목적: 가독성 향상, 유지보수 용이성 증대, 시간과 자원 절약추상화: 중요 정보 추출, 불필요 정보 생략하는 과정컴퓨터에서 추상화: 복잡한 데이터와 로직 단순화, 이해도 향상적절한 추상화: 도메인 문맥 고려, 핵심 개념만 표현이름 짓기: 추상적 사고 기반, 도메인 문맥 내 이해 가능한 용어 사용메서드 추상화: 단일 책임 원칙, 명확한 의도 전달메서드 선언부: 적절한 메서드명, 파라미터, 반환 타입 선택추상화 레벨: 동일한 추상화 수준 유지, 일관성 있는 코드 작성매직 넘버/스트링 제거: 상수 추출로 의미 부여, 가독성 향상좋은 코드 습득: 업계 표준 용어 학습, 지속적인 개선 2. 논리, 사고의 흐름뇌 메모리 효율화: 최소 인지 노력으로 최대 정보 제공범주화와 인지적 경제성: 효율적 정보 처리 위한 핵심 전략Early return: 코드 가독성 향상, 불필요한 중첩 구조 제거사고의 depth 줄이기: 반복문, 조건문 구조 단순화, 변수 근접 선언부정어 사용 주의: 긍정 표현 선호, 메서드명에 부정 의미 포함 고려해피 케이스와 예외 처리: 예외 발생 가능성 최소화, 의도적/비의도적 예외 구분Null 처리: NullPointerException 방지, Optional 활용 고려Optional 사용 지침: 반환 타입에만 사용, 파라미터로 받지 않기, 빠른 해소Optional 해소 방법: 풍부한 API 활용 (orElseGet, orElseThrow, ifPresent 등)orElse, orElseGet, orElseThrow 차이 이해: 실행 시점과 용도 구분즉시 평가와 지연 평가 개념 숙지: Optional 메서드 사용 시 고려 3. 객체 지향 패러다임객체 지향: 추상화된 데이터와 코드의 결합, 객체 간 협력과 책임 중시관심사의 분리: 높은 응집도, 낮은 결합도 추구객체 설계: 비공개 필드/로직, 공개 메서드로 외부와 소통객체 생성 주의점: 단일 책임, 생성자에서 유효성 검증, setter 자제getter 사용 최소화: 객체에 메시지 전송 권장필드 수 최소화: 복잡도 감소, 불필요한 데이터 제거SOLID 원칙: 객체 지향 설계의 기본 원칙들SRP: 단일 책임 원칙, 변경 이유 하나로 제한OCP: 확장에는 열려있고, 수정에는 닫혀있어야 함LSP: 상속 관계에서 하위 클래스가 상위 클래스를 대체 가능해야 함ISP: 인터페이스 분리, 불필요한 의존성 제거DIP: 추상화에 의존, 의존성 역전을 통한 유연성 확보도메인 지식: 만드는 것이 아닌 발견하는 것의존성 주입(DI)과 제어의 역전(IoC) 개념 이해 4. 객체 지향 적용하기상속보다 조합 선호: 유연성 증가, 결합도 감소Value Object: 도메인 개념 추상화, 불변성/동등성/유효성 보장VO vs Entity: 식별자 유무와 동등성 판단 기준 차이일급 컬렉션: 컬렉션을 포장한 객체, 가공 로직 포함 가능Enum 활용: 상수 집합과 관련 로직 관리, 도메인 개념 명시적 표현다형성 활용: 반복적 if문 단순화, OCP 원칙 적용변하는 것과 변하지 않는 것 분리: 추상화와 구체화 구분도메인 개념 도출: 발견하는 과정, 현실 세계 흉내내기설계 접근: 근시적/거시적 관점에서 미래 예측유연한 코드 작성: 변경 가능성 고려, 재설계 용이성 확보완벽한 설계 없음: 현 시점 최선의 설계 추구일급 시민 개념: 변수 할당, 파라미터 전달, 함수 반환 가능컬렉션 반환 시 주의: 새로운 컬렉션으로 복사하여 반환Enum vs DB: 변경 빈도에 따른 선택객체 지향 설계: 현실 세계 완벽 반영이 아닌 모방  [고민했던 점]섹션 5. 객체지향 적용하기 중 CellPosition 을 분리하는 부분에 대한 강의를 들을 때, 강사님이 치고 계신 코드가 Minesweeper 파일인지 GameBoard 파일인지 헷갈릴때가 많았습니다. 강의를 멈추고 코드를 다시 읽어보다보니, 어떤 클래스에 들어있는지 한눈에 안들어오거나, 위치가 기억이 잘 안나거나 헷갈리는 메서드가 꽤 많았다고 느꼈습니다.Cell 이나, GameLevel, Handler 는 명확한 느낌을 받았습니다. Cell 안에 들어있는 메서드는 명확하게 Cell 에 대한 update 또는 get 동작을 수행하도록 설계되어 있다고 느꼈기 때문입니다.그런데 제 머릿속에는 "지뢰찾기" 라는 게임 그 자체에 "Board" 라는 개념이 항상 함께하는데, 그 "Board"를 Minesweeper 가 아닌 다른 파일로 쪼개놓았기 때문에 메서드의 위치가 헷갈린다는 느낌을 받았습니다. 제가 생각하기에는, GameBoard 라는 클래스가 일반적인 Board 기반 게임이 아닌, "지뢰찾기"에 특화된 로직을 포함하고 있기 때문에 헷갈린다는 느낌이 강하게 드는 것 같습니다. 예를 들어, initialize() 메서드 내부에는 Cell을 지뢰 칸으로 설정하는 로직과 숫자 칸으로 설정하는 로직이 녹아들어 있습니다. "지뢰찾기"만을 위한 로직이 녹아있는 것입니다. 그렇다면..?1. 추가적인 추상화?처음에는 GameBoard 내의 지뢰찾기 관련 로직을 별도의 클래스로 분리하는 것을 고려했습니다. 하지만 이는 "이른 최적화"의 함정에 빠질 수 있다는 생각이 들었습니다.2. 현실적인 접근현재로서는 이 GameBoard를 다른 보드 게임에 재사용할 계획이 없습니다. 따라서 과도한 추상화는 오히려 코드의 가독성을 해칠 수 있다고 판단했습니다. 결론지금으로서는 가장 좋은 방법은 GameBoard 라는 클래스 이름을 MinesweeperBoard 라는 이름으로 바꾸는게 좀 더 낫지않을까? 라는 결론을 내리는것이 가장 최선의 선택이 아닌가 싶습니다. 애초에 GameBoard 라는 이름이 추상적인 "Game"으로 시작하기 때문에, initialize 내부에 지뢰찾기와 관련된 로직이 녹아있는 것이 어색하게 느껴진것 아닌가? 라는 생각입니다. 그래서 클래스의 이름을 좀 더 구체적으로 변경하면, 비교적 덜 헷갈리지 않을까? 라는 생각입니다. 이상으로, 1주차 학습 내용 요약과 강의를 들으며 고민해봤던 내용을 정리한 발자국 포스팅을 마칩니다.

백엔드워밍업클럽백엔드클린코드테스트코드발자국회고

채널톡 아이콘