블로그

99ekdus

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

 📃 학습 내용 요약학습 내용추상과 구체 좋은 추상화란 해당 도메인의 문맥 안에서 중요한 핵심만 남겨서 표현하는 것이다.추상화의 핵심은 '이름 짓기'!잘 쓰여진 코드의 메서드는 오직 하나의 주제만 갖고 있다.코드를 작성할 때, 동등한 추상화 레벨로 맞추는 것이 좋다.논리, 사고의 흐름 뇌의 메모리에 적은 정보를 올리도록 코드를 작성하자.Early return을 통해 else의 사용을 지양하자.중첩된 분기문, 중첩된 반복문에서 메서드를 추출해 사고의 depth를 줄여보자.공백 라인을 통해 상대방이 이해해줬으면 하는 단락이 무엇인지 강조하기객체 지향 패러다임SOLID  ✏ 회고Liked (좋았던 점) : 추상화의 개념, 추상과 구체의 관계를 명확히 이해하게 되었고, 코드를 작성에 대한 자신감이 생겼습니다.Lacked (아쉬웠던 점) : 다른 분들의 코드를 읽으면서 느낀 건데, Day 4 미션에서 리팩토링을 할 때, 추상화 레벨을 동등하게 맞추지 않은 것이 아쉬움이 남습니다..!Learned (배운 점) : 추상화의 의미를 다시 한번 깨달았습니다! 추상화는 단순히 코드를 짧게 만드는 것이 아니라, 개발자가 더 효율적으로 코드를 작성하고 유지 보수할 수 있도록 돕는 중요한 역할을 한다는 것을 알게 되었습니다.  📌 Day 2 미션추상 : 아이유 콘서트 티켓팅을 한다.구체 :제일 먼저 티켓팅을 하기 전에 콘서트 정보를 확인하고, 가고 싶은 날짜와 좋은 좌석을 미리 정한다. 티켓팅 날, 컴퓨터 또는 스마트폰을 준비해서 원하는 웹 브라우저에 접속해 멜론 티켓 홈페이지에 들어가 로그인을 한다.아이유 콘서트 예매 페이지에 들어가 정각이 될 때까지 긴장을 풀며 기다린다.정확한 시간에 예매 버튼을 클릭하고, 본인의 예매 대기 순서를 기다린 다음에 날짜를 선택한다.좌석을 선택하고, 티켓 가격과 할인 수단 확인 후 마지막으로 결제를 한다.마이페이지에 들어가 예매 내역을 확인한다.두근거리는 마음으로 콘서트 날까지 기다린다.😄 추상 : 아이유 콘서트를 봤다.구체 :신나게 즐기기 위해 체력 단련을 하고, 아이유 노래의 응원법을 외운다.콘서트 당일 날 보조배터리와 물, 간식 등을 챙겨서 편한 옷을 입고 집을 나선다.목적지인 상암월드컵경기장까지 지하철을 타고 간다.여유 있게 콘서트 시작 2~3시간 전에 도착해 티켓 부스에 가서 티켓을 수령하고, 아이유 응원봉인 아이크를 구매한다.공연장 주변에서 시간을 보내다가, 콘서트 시작 시간에 맞춰 들어간다.아이유 콘서트가 시작되는 순간부터 끝날 때까지 현장의 열기를 느끼며, 행복한 시간을 만끽한다.새로운 추억을 간직하며, 다음 콘서트를 기대한다.  📌 Day 4 미션public boolean validateOrder (Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } if (order.getTotalPrice() <= 0) { log.info("올바르지 않은 총 가격입니다."); return false; } return true; }불필요한 if (order.getTotalPrice() > 0) 조건을 제거했다.주문 항목이 없거나 총 주문 가격이 0보다 작은 경우 false를 반환하고 있으므로, 추가적으로 검사할 필요가 없다.else연산을 지양하기 위해서 각 if문에서 false 를 일찍 return 한다.!(order.getTotalPrice() > 0) 에서 부정 연산자(!)를 없애고, order.getTotalPrice() <= 0 으로 변경하여 코드의 가독성을 높였다. 단일 책임의 원칙 SRP (Single Responsibility Principle)한 클래스는 하나의 책임만 가져야 한다. 한 사람이 여러 가지 일을 동시에 해서 효율성이 떨어지는 것보다 여러 사람이 각자 맡은 일에 최선을 다하는 게 더 좋다. 레스토랑에서 주문 받는 사람, 요리 하는 사람, 계산 하는 사람 따로 있듯이 클래스도 각자의 역할에 집중해야 코드가 복잡해지지 않고 유지 보수 하기 쉽다.개방-폐쇄 원칙 OCP (Open-Closed Principle)확장에는 열려 있지만, 수정에는 닫혀 있어야 한다. 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 새로운 코드를 추가하여 시스템을 확장하는 것이다.리스코프 치환 원칙 LSP (Liskov Substitution Principle)자식 클래스는 언제든지 부모 클래스를 대체할 수 있어야 한다. 자식 클래스는 부모 클래스가 사용되는 모든 곳에서 사용될 수 있어야 한다.인터페이스 분리 원칙 ISP (Interface Segregation Principle)하나의 거대한 인터페이스보다는 여러 개의 작은, 특정한 클라이언트를 위한 인터페이스를 사용해야 한다. 레스토랑 메뉴판에서 너무 많은 메뉴를 한꺼번에 보여주는 것보다 종류별로 메뉴를 분리하여 보여주는 것이 고객들이 원하는 음식을 쉽게 찾을 수 있어 편하다. 인터페이스도 특정 기능에 맞게 분리해야 클라이언트가 필요한 기능만 사용할 수 있다.의존성 역전 원칙 DIP (Dependency Inversion Principle)고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화된 인터페이스에 의존해야 한다. 레스토랑에서 요리를 할 때, 특정 브랜드의 재료만 의존하지 않게 해야 한다. 하나의 브랜드만 사용하지 않고, 다양한 브랜드의 재료를 사용함으로써 맛을 더 업그레이드 시킬 수 있다. 

워밍업클럽2기

masiljangajji

[인프런 워밍업 클럽 2기 1주차 회고] - 그래서 클린코드가 뭐냐

클린 코드는 무엇일까요? 보통 "읽기 좋은 코드"라는 말을 하곤 합니다.그런데 "읽기 좋다"는 무엇을 의미할까요? 주석을 아예 달지 않으면 읽기 좋은 코드일까요? 이건 좀 아닌 것 같고...변수의 이름을 잘 짓는 것? 이것만으로는 좀 부족한 것 같고... 이런 고민을 해결하고자 클린 코드 & 테스트 스터디에 참여해 활동한 지 1주 차가 됐습니다. 첫 주차는 객체 지향의 가장 기본이 되는 "추상화"에 대해서 말하는 시간이었습니다.물리적으로 나뉜 세션은 여러 가지였지만, 다룬 내용들이 대부분 "추상화"를 뒷받침하는 요소였기 때문에 1주 동안 추상화에 대해서 말했다 해도 괜찮을 것 같습니다. 그리고 이 부분은 매우 중요하다고 생각하는 것이, 기본이 곧 쉽다는 의미는 아니기 때문입니다.기본은 너무나 중요해서 기본이라 부르는 것이지, 쉬워서 기본이라 부르는 것은 아니니까요. 스터디의 진행은 기본적으로 인프런을 통해 온라인으로 학습하고 미션을 통해 학습도를 점검하는 방식으로 진행됩니다.1주차 미션 자체는 실질적으로 코드를 작성하여 검증하는 느낌은 아니었고, "나는 강의에서 이렇게 말했는데, 너는 어떻게 생각해?"라는 느낌이었습니다.그 생각을 묻는 질문에 대한 답변이 곧 미션이고, 저의 경우에는 블로그에 글을 기재하는 방식으로 수행했습니다.https://masiljangajji-coding.tistory.com/66https://masiljangajji-coding.tistory.com/68 이 글에서 가장 하고 싶은 말은 "클린 코드", "TDD", "DDD" 등은 그저 도구라는 것입니다.저 모든 것들은 단순히 "이렇게 하면 좋다더라~"를 한 단어로 묶어 개념화한 도구입니다.따라서 도입하는 것이 생산성을 높이면 도입하면 되는 것이고, 떨어지면? 도입하지 않아도 됩니다. 주석을 달았더니 팀이 코드를 더 쉽게 이해하고 생산성이 증가하는데? -> 그럼 주석을 다는 게 클린 코드입니다.주석을 다는 행위로 인해 코드의 가독성이 증가했기 때문입니다. 소프트웨어를 개발하는 사람들은 생각도 soft하게 할 필요가 있지 않나 생각합니다.어떻게 커스터마이징하느냐에 따라서 우리 팀만의 클린코드 컨벤션이 존재할 수 있다고 생각합니다. 한 줄로 정리하면, XX를 하면 클린 코드? XX를 안 하면 클린 코드? 이런 게 아니라,생산성을 증가시키면 그게 뭐가 됐든 클린 코드라 생각합니다. 강의 내용에 대해서 말하자면 평소에 생각하던 부분들과 일치하는 부분이 많아 그리 어렵지 않게 들을 수 있었습니다.그런데 가끔 "아, 이렇게도 생각할 수 있네?", "이런 게 기준이 될 수 있겠네?" 하는 부분들이 있어 생각했던 것보다 이미 많은 것을 얻어간 느낌입니다. 사실 강의 자체의 퀄리티가 좋습니다. ㅋㅋㅋ 이번 주는 강의를 듣고 미션을 수행하는 것이 조금 버거웠습니다.강의의 양 자체가 적지 않기도 했고, 더 우선적으로 수행해야 할 과제들이 있어 더욱 그러지 않았나 생각됩니다. 주말 동안 재충전의 시간을 갖고 돌아오는 월요일부터는 다시 달려보도록 하겠습니다.

백엔드백엔드클린코드cleancodecleancoderedable

Jiyeon Hwang

[인프런 위밍업 스터디 2기 디자인] 1주차 발자국 및 회고

 1. 강의 수강일주일 동안 학습했던 내용Figma의 베리어블, 색상, 간격, 타이포그래피, 아이콘, 그림자 효과, 반응형 기준점 그리고 입력 컴포넌트를 만드는 과정에 대해 집중적으로 학습했습니다. 스스로 칭찬하고 싶은 점 피그마 베리어블 개념을 습득하는데 많은 시간을 투자하고 매일 디자인 공부한 점 아쉬웠던 점 강의를 듣고 미션까지 수행하는데 생각했던 시간보다 3배 이상 소요되었는데요. 아직 피그마가 익숙하지 않아서 한 단계 진행할 때마다 강의를 보고 또 보고 모르는 부분은 검색하면서 작업했습니다.보완하고 싶은 점하루 진도 맞춰 가면서 미션에만 집중했는데요. 이번엔 디테일한 부분들도 생각하면서 작업해 보고 싶습니다. 그리고 시간도 더 넉넉하게 잡고 매일 디자인 공부하기 다음 주 학습 목표 미션 꼭 제출하기 피그마 부족한 기초 부분을 따로 더 공부하기 회고 이번주 강의를 통해 디자인 시스템의 필요성도 배우고 피그마 베리어블에 대한 좋은 점을 듣는 순간 꼭 완강하고 싶은 생각이 들었는데요. 베리어블 구조, 이름을 만드는 과정에서 같이 협업하는 사람들과 기획적으로 커뮤니케이션을 해야 하는 부분도 새롭게 크다는 걸 느꼈습니다. 그리고 피그마에서 플러그인을 많이 사용해보면서 실용적이고 넘 재미있었습니다.  2. 미션 #1 로컬베리어블 primitive, theme, semantic 색상 베리어블 등록 타이포그래피 스타일 플러그인을 사용해 등록 #2 feather 아이콘 컴포넌트화 그림자 효과 스타일 그리드 등록하기 기타 베리어블(투명도, 간격, 그림자) 등록  미션을 어떤 관점에서 접근했는지? 최대한 미션 목표에 맞춰서 작업을 했습니다. 강의를 튜토리얼 느낌으로 접근하면서 피그마랑 친해진 느낌을 받았습니다. 문제를 해결하는 과정은 무엇이었는지? 타이포그래피에서 생각지도 못하게 폰트가 없어서 폰트를 등록하는 방법을 검색하면서 문제를 해결했습니다. 아이콘 등록 부분도 깨져서 당황했지만, 앤트맨 방법을 계속 도전해 보니 성공해서 좋았습니다. 순간 아이콘을 하나씩 다 만들어버릴까? 라는 생각도 했습니다. 미션 해결에 대한 간단한 회고 피그마를 처음 접하면서 스터디를 시작 전에 기초 부분을 독학으로 공부한다고 했는데요.이번에 피그마가 업데이트가 되면서 인터페이스부 분을 너무 달라서 당황했지만, 쉬운 부분은 검색하면서 해결할 수 있어서 좋았습니다.

UX/UI피그마베리어블디자이시스템인프런워밍업클럽스터디2기

gord23p

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

 운영체제1.while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트cpu는 입출력 관리자에게 입출력명령 > 다른 작업 > 입출력관리자 입출력 완료로 CPU에게 신호 > 인터럽트 서비스 루틴을 실행시켜 작업 완료시킴2. 프로그램과 프로세스가 어떻게 다른가요?프로그램은 하드디스크 등 저장장치에 저장된 명령문의 집합체이고 프로세스는 실행 중인 프로그램 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램이다3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍은 메모리에 여러 개의 프로세스 올라오고멀티프로세스는 cpu관점으로 cpu가 여러 개의 프로세스 처리한다4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB 사용프로세스 만들어지면 운영체제는 해당 프로세스의 정보를 가진 PCB를 만들고 저장5. 컨텍스트 스위칭이란 뭔가요?프로세스 실행 중 다른 프로세스를 실행하기 위해 실행하던 프로세스를 저장하고 다른 프로세스로 교체하는 작업  자료구조와 알고리즘1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시 테이블 고유한 값이 아닌 키-값으로 중복된 키를 허용하지 않으면 어떤 학생이든 학생의 정보를 중복하지 않고 저장할 수 있다또한 열람도 해야 하기에 빠른 데이터 읽기의 장점을 가진 해시테이블 적합하다 2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.큐 먼저 들어오는 순서대로 처리되는데 주문의 경우 삽입은 중간 삽입이 없고 순서대로 주문번호가 늘어가는 구조여서 큐가 적합하다

숨곰

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

1주차 회고Keep현재 만족하며 이어가고 싶은 것미션을 수행할 때 먼저 다른 사람의 코드를 보지 않고 스스로 작성해보려고 노력했다.미션을 완성한 이후에 강의를 들으며 부족한 부분을 파악하고 리펙토링하는 방식으로 진행했다.내가 잘 알고 있는 부분과 부족한 부분을 명확히 파악할 수 있어서 좋았다.Problem개선이 필요한 부분인프런 워밍업 클럽에 시간 투자를 많이 못 한 것 같다.. 이번 주에는 미션을 한 개밖에 못했는데 다음 주에는 시간 배분을 잘 해서 미션을 더 많이 하고 싶다.Try다음 리뷰 때까지 시도해 볼 것매일 하루에 2시간은 워밍업 클럽에 투자하자!미션을 완성한 이후에 다른 사람들의 코드도 구경하기 1주차 학습 내용따라하며 배우는 자바스크립트 A-Z자바스크립트 기초, Window 객체 및 DOM, Event에 대해서 학습했다. 이번 미션을 바닐라 자바스크립트로 구현해서 강의내용을 실습해보며 체화할 수 있었다.미션 - 음식 메뉴 앱프레임워크를 쓰지않고 자바스크립트만으로 구현하는 것이 불편하고 생산성이 떨어진다고 느껴졌지만, 자바스크립트에 대한 이해도가 높아지면 결국 다른 프레임워크의 본질을 알 수 있다고 생각하기 때문에 의미있었다!

웹 개발인프런워밍업클럽FE2기발자국

sodychoe

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

1주차 강의 섹션2-추상✅추상은 컴퓨터과학을 발전시킨 핵심적인 개념이다 내가 알아야 하는 것과 몰라도 되는 것을 구분하자추상과 구체를 구분하자. 구체에서 의미 있는 특징을 뽑아 추상화하자 의미를 드러낼 수 있는 변수명, 메서드명을 사용하자메서드마다 추상화 수준을 동일하게 유지하도록 노력하자매직 넘버, 매직 스트링(상수) 를 사용해보자  섹션3-논리, 사고의 흐름✅사고의 깊이를 줄이고, 처리해야 할 정보를 줄이자 코드를 작성할 때에도 똑같다Early return 을 통해 조건문에서 기억해야 할 정보량을 줄이자반복문 등에서 indent 를 줄여보자공백도 의미가 있다이중 부정을 바꿀 수 있는 지 고민하자사용자의 데이터는 불신하고 예외 처리를 하자 섹션4-객체 지향 패러다임✅책임과 관심사가 명확하게 구분된 객체들이 서로 소통하는 프로그램을 만들자관심사를 분할하여 응집도를 높이고 높은 추상화 수준을 사용할 수 있다객체를 존중하자객체 지향 SOLID 5원칙 : SRP, OCP, LSP, ISP, DIPSingle Responsibility Principle(SRP) : 하나의 클래스는 하나의 책임을 가져야 한다Open-Closed Principle(OCP) : 확장에는 열려 있고 변경에는 닫혀 있어야 한다Liskov Substitution Principle(LSP) : 하위 타입으로 대체해도 문제 없어야 한다Interface Segregation Principle(ISP) : 최소한의 인터페이스에 의존하자Dependency Inversion Principle(DIP) : 구체보다는 추상에 의존하도록 설계하자 섹션5-객체 지향 적용하기Value Object 까지 수강함 회고 강사님께서 레거시 코드를 리펙터링하는 식으로 수업이 진행되었다수업 코드가 있는 레포지토리를 fork 해서 진행하는 만큼 강의 진도를 커밋해서 구분해두면나중에 복습하기 좋을 것 같아 강의별로 한 내용을 커밋 메시지로 요약하고 푸쉬해두었다각 수업마다 무엇을 했는지 알아보기도 쉽고 잔디도 쌓여서 뿌듯하다그런데 약간 계획표 진도에 못 미치는 부분이 있으니 더욱 시간을 투자하려고 한다  1주차 미션 Day2 미션"추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다. 일상 생활, 자연 현상, 혹은 알고 있는 개발 지식 등 어느 것이든 상관 없습니다. 추상에서 구체로, 또는 구체에서 추상으로 방향은 상관 없으나, 어떤 것이 추상이고 어떤 것이 구체 레벨인지 잘 드러나게 작성해 보아요 :) 나의 답변 : 운영 체제의 주요 기능 중 하나는 컴퓨터의 CPU , 메모리 입출력장치등의 하드웨어 기능을 추상화하여 사용자가 편하게 사용할 수 있도록 하는 것이다 예를 들어 하드 디스크에 데이터를 읽고 쓰는 데 필요한 기계적인 지식을 알 필요 없이 파일 시스템이라는 체계적이고 직관적인 개념을 통해 읽고 쓰는 개념을 추상화하여 하드웨어의 종류에 관계 없이 동일한 작업을 수행할 수 있다 추상이라는 것이 자바에서 인터페이스에만 사용하는 줄 알았는데 컴퓨터과학 전반에서 매우 중요한 개념이라는 걸 배웠다그래서 컴퓨터과학에서 대표적인 추상을 이용한 사례로 운영체제에 대한 내용이 있길레 작성해보았다추상에 대해 깊이 생각해볼 수 있어서 좋았다  Day4 미션 1. 아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다. 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 boolean validateOrder(Order order){ if(isEmpty(order){ log.info("주문 항목이 없습니다."); return false; } if(isInvalidTotalPrice(order){ log.info("올바르지 않은 총 가격입니다."); return false; } if(isInvalidUser(order)){ log.info("사용자 정보가 없습니다."); } return true; } private boolean isEmpty(Order order){ return order.getItems().size() ==0; } private boolean isInvalidTotalPrice(Order order){ return order.getTotalPrice() < 0; } private boolean isInvalidUser(Order order){ return !order.getCusterInfo(); }강의해서 메서드의 관심사를 분리하고 early-return 을 사용해 가독성을 높이고 정보량을 줄이는 방법 그리고부정어를 대체하는 방법을 배웠다코드가 딱 그런 내용을 리펙터링하는 것이라 생각해서 그에 맞게 고쳐보았다다른분들 코드와 비슷한 것 같다  SOLID에 대하여 자기만의 언어로 정리해 봅시다.나의 답변:SRP : 단일 책임의 원칙 한 클래스는 하나의 책임만 가져야 한다 변경 사유가 여러 책임이 되어선 안된다OCP: 개방 폐쇄 원칙 확장에는 열러 있지만 변경에는 닫혀 있어야 한다 클라이언트 코드가 변경에 영향받으면 안된다LSP : 리스코프 치환 원칙 객체는 하위 타입의 인스턴스로 바꿀 수 있어야 한다 구현 차원에서의 문제 - 인터페이스 규약과 다르게 구현하면 객체를 신뢰할 수 없음ISP: 인터페이스 분리 원칙 범용 인터페이스보다는 여러 개가 낫다DIP: 의존관계 역전 원칙 구체에 의존하지 말자 추상에 의존해라객체지향 프로그래밍 5원칙에 대해 생각해보는 미션이 나왔는데 평소에 내가 이해하고 있는 대로 내용을 적었다길게 작성하신 분들도 계셨는데 나의 언어로 표현하면 이정도가 끝이라 공부가 더 필요할 것 같다  

송준환

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

일주일 간 학습 내용 요약추상화 레벨을 맞추자.읽는사람이 한번 더 생각하지 않도록 항상 코드를 추상화 레벨에 맞춰서 작성을 하는것이 중요한것 같다.추상화 레벨에 맞게 구체화된 코드를 메서드로 만들어 추상화시키고 그에 맞춰서 이름을 지어주자.사실 이름짓기가 제일 어려운것 같다.읽는 사람으로 하여금 뇌의 메모리를 적게 쓰게 하자.평상시에 사용하는 if - else 문은 코드가 길어질수록 생각을 많이 해야한다.else 문에서 그 위에있던 if문의 조건들을 다 기억하고 제외해야하기 때문이다.이럴때는 Early return을 사용하여 뇌의 메모리를 비워주도록 해보자.공백라인을 사용해서 코드의 가독성을 높히자.단순히 공백라인을 사용하는것이 아니라 특정 단위로 끊어서 의미있게 사용을 해보자.객체를 설계할때 getter/setter 사용을 자제하자객체를 만들때 getter와 setter를 무조건 만들곤 했는데, 매우 폭력적이란 말씀에 어떤식으로 설계해야 되는지 확 와닿았다.객체를 객체답게 대우를 해주어야 할것 같다.SOLID:Single Responsibility Principle (SRP) - 단일 책임 원칙• 클래스는 단 하나의 책임만 가져야 한다. 즉, 하나의 클래스가 하나의 기능만 담당해야 한다.Open/Closed Principle (OCP) - 개방/폐쇄 원칙• 클래스는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다.Liskov Substitution Principle (LSP) - 리스코프 치환 원칙• 서브타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.Interface Segregation Principle (ISP) - 인터페이스 분리 원칙• 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.Dependency Inversion Principle (DIP) - 의존성 역전 원칙• 고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화된 것에 의존해야 한다.회고지난 일주일 동안 몇가지의 읽기 좋은 코드를 작성하는 방법을 학습을 했는데 일단 내가 이 스터디를 신청한 이유는아직 이 분야에 대해 배운지는 얼마 되지 않았지만 처음부터 보기 좋은 코드를 짜는 습관을 들여야 된다고 생각해서 신청하게 되었다.추상과 구체를 배우게 됐는데 원래 개념적으로 알고는 있었지만 직접 코드를 작성하면서 배우니 이렇게까지추상,구체화할수 있겠구나 라는 생각이 들었다. 코드가 작동되도록 작성하는것도 중요하겠지만 나중에 코드를 읽어볼때잘 읽히는 코드가 좋은 코드라고 생각이 되었다. 내가 저번주에 작성한 코드도 지금보면 읽기 힘들때가 많다.코드를 작성한 순간 레거시 코드가 된다는것에 크게 공감했다.• 칭찬하고 싶은 점: 일단 미션과 발자국을 기한안에 제출했고, 정해진 일정에 맞춰 스터디를 진행한점은 만족한다.• 아쉬웠던 점: 점점 갈수록 코드가 복잡해져서 완벽히 이해 안가는 부분을 넘어갔는데 하나둘씩 쌓이면서 처음과는 달리 여러번 돌려봐야 이해되는 부분이 생겼다.• 보완하고 싶은 점: 시간을 조금더 투자해서 확실히 이해하고 내것으로 만들자.다음 주 학습 목표• 다음주에는 내용이 더 딥해지겠지만 내것으로 만들고 잘 따라가는 것이 목표다.미션 해결 과정 [Day 2 미션]헬스장에서 운동을 하는 과정을 구체화시켜보았다.헬스장에서 운동을 한다를 한단계 구체화해서운동준비, 웨이트 트레이닝, 유산소운동, 마무리 로 구체화시켰고거기서 각각 한단계 더 구체화 시켜보았다.추상 : 헬스장에서 운동을 한다.구체 : [운동 준비]헬스장에 도착하면 먼저 운동복으로 갈아입는다.스트레칭을 통해 근육을 풀어준다.운동 계획을 확인하면서 오늘 할 운동을 상기시킨다.[웨이트 트레이닝]벤치 프레스를 할 경우, 먼저 벤치에 누워 발을 단단히 바닥에 고정한다.바벨을 양손으로 어깨 너비보다 조금 넓게 잡고, 안정된 자세를 잡는다.숨을 들이쉬면서 바벨을 가슴까지 천천히 내린다.가슴에 닿기 직전에 멈추고, 숨을 내쉬면서 힘을 주어 바벨을 다시 위로 밀어 올린다.팔을 완전히 펴지 않고, 긴장감을 유지한 채 반복한다.세트가 끝나면 잠시 휴식을 취하며 호흡을 정돈한다.[유산소 운동]러닝머신을 이용할 경우, 먼저 속도를 천천히 올리며 워밍업을 한다.몸이 충분히 풀리면 적당한 속도로 달리기 시작한다.시간이 지나면서 속도를 조금씩 올리며, 목표로 한 시간 혹은 거리만큼 달린다.마지막 5분은 속도를 낮춰 워밍다운을 통해 심박수를 천천히 안정시킨다.[마무리]모든 운동을 끝낸 후에는 다시 스트레칭을 통해 근육을 풀어준다.샤워를 하고, 단백질 쉐이크를 먹어준다.[Day 4 미션]아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.AS-ISpublic 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; }  AS-IS의 코드를 보면 불필요한 else문이 많고, If문의 조건식에 해당하는 코드를 보면 생각을 한번 거쳐야 이해되는 코드이다. [섹션 3. 논리, 사고의 흐름] 에서 배웠던 내용을 적용해보면 Early return으로 else문을 적지않고 다음 조건으로 넘어가기, 조건문 메서드로 뽑아내어 추상화 시키기, 그리고 부정어 사용을 지양했더니 훨씬 읽기 좋고 뇌의 메모리가 적게쓰인다는 것을 느꼈다.TO-BEvalidateOrder 메서드 public boolean validateOrder(Order order) { if (order.hasNoItems()) { log.info("주문 항목이 없습니다."); return false; } if (order.isTotalPriceInvalid()) { log.info("올바르지 않은 총 가격입니다."); return false; } if (order.hasNoCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } return true; } Order.javapackage cleancode.mission.day4.tobe; import java.util.Map; public class Order { Map<Item,Integer> items; String userid; public int calculateTotalPrice() { return items.entrySet().stream() .mapToInt(entry -> (int) (entry.getKey().getPrice() * entry.getValue())) .sum(); } public boolean hasNoItems() { return this.items.isEmpty(); } public boolean isTotalPriceInvalid() { int totalPrice = calculateTotalPrice(); return totalPrice < 0; } public boolean hasNoCustomerInfo() { return userid == null || userid.trim().isEmpty(); } } Item.javapackage cleancode.mission.day4.tobe; public class Item { String itemName; int price; public int getPrice() { return this.price; } } AS-IS의 코드를 보면 불필요한 else문이 많고 If문의 조건식에 해당하는 코드를 보면 생각을 한번 거쳐야 이해되는 코드들인데 [섹션 3. 논리, 사고의 흐름] 에서 배웠던 내용을 적용해보면 Early return으로 else문을 적지않고 다음 조건으로 넘어가기, 조건문 메서드로 뽑아내어 추상화 시키기, 그리고 부정어 사용을 지양했더니 훨씬 읽기 좋고 뇌의 메모리가 적게쓰인다는 것을 느꼈다.SOLID에 대하여 자기만의 언어로 정리해 봅시다.SOLIDSOLID는 코드의 유지보수성과 확장성을 높이는데 도움을 주기위해 만들어진 원칙이다.처음 자바공부를 할때 배우곤 당장의 코드짜기에 급급해 되짚어보지 않았지만 코드가 점점 복잡해 질수록 원칙의 필요성이 느껴진다. 단순히 개념을 배우기보다는 직접 코드를 작성하면서 깊게 생각해보고 이해도를 높여야겠다.SRP(Single Responsibility Principle) : 단일 책임 원칙하나의 객체에는 하나의 책임을 가져야 한다. → 높은 응집도와 낮은 결합도를 갖기위해 사람마다 역할과 책임의 경계가 모호하기 때문에 최대한 작성자의 의도를 알수있고, 일관성 있게 작성하여야 한다.만약 객체가 여러 역할을 담당하면 기능이 변경될 때마다 그 객체도 계속 수정되어야 할 것이다. ⇒ 객체의 수정 이유가 여러가지 이다.또한 어떤 기능을 수정하려고 하는데 그 기능이 어떤 객체에 들어가 있는지, 어느 부분에 있는지 내가 원하는 부분을 찾기 힘들 것이다. 하나의 객체에 하나의 책임을 가지게 되면 수정하고자 하는 부분을 찾기 수월해지고 객체를 수정하는 이유와 의도를 명확히 할수 있다. 이로써 유지보수성을 높일 수 있게 된다.OCP(Open-Closed Principle) : 개방-폐쇄 원칙확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다. 새로운 요구사항이 발생하더라도 기존 코드를 변경하지않고 새 기능을 추가할수 있어야 한다.만약 기존 코드를 변경해야 한다면, 그로 인해 새로운 버그가 발생할 가능성이 높아지고 다른 모듈이나 클래스에 의존성이 있는 경우 문제가 확산될 수 있다.상속이나 인터페이스 등을 활용해 기능을 확장하면서도 기존 코드를 손대지 않는 구조를 만들면 코드의 안정성이 높아진다.LSP(Liskov Substitution Principle) : 리스코프 치환 원칙하위 클래스는 상위 클래스의 역할을 대신할 수 있어야 한다. 즉, 상위 클래스의 인스턴스가 필요한 자리에 하위 클래스의 인스턴스를 대입해도 프로그램이 정상적으로 작동해야 한다.내가 이해한 바로는 부모클래스의 모든 기능을 자식클래스가 수행할수 있어야 한다는 것이다. 부모클래스의 기능에 추가적인 기능을 부여하면서 점점 구체화 시키는것이 자식클래스 인데 부모클래스의 기능을 수행할수 없다면 그것은 구체화 했다고 할 수 없고 정체성을 잃어버리기 때문이다. 이렇게되면 코드가 의도하지 않은 방식으로 동작할 수 있다.ISP(Interface Segregation Principle) : 인터페이스 분리 원칙클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다. 하나의 큰 인터페이스보다 각 클라이언트가 필요한 메서드가 가지는 작은 인터페이스로 분리하는 것이 좋다. 큰 인터페이스를 구현하게 되면, 그 인터페이스의 메서드를 모두 구현해야 하는 부담이 생기며, 사용하지 않는 기능에 대한 구현도 강요받게 된다.DIP(Dependency Inversion Principle) : 의존성 역전 원칙상위 모듈은 하위 모듈에 의존해서는 안 되며, 둘다 추상화 된 것에 의존해야 한다. ⇒ 구체적인 구현이 아닌 추상적인 인터페이스에 의존해야 한다.만약 상위 모듈이 하위 모듈에 직접 의존하면, 하위 모듈의 변화가 상위 모듈에 큰 영향을 미치게 된다. 따라서 둘 다 추상화된 인터페이스나 추상 클래스에 의존하게 하여, 결합도를 낮추는 것이다.처음에는 OCP 와 비슷한것 아닌가? 라는 생각이 들었다. 둘다 객체지향 설계의 중요한 원칙이지만, 그 초점과 목적이 다르다. OCP는 확장과 수정의 관리에 초점을 맞추고 DIP는 의존성 관리에 초점을 맞춘 원칙이다.참고강의박우빈 - Readable Code: 읽기 좋은 코드를 작성하는 사고법

클린코드스터디

이창민

인생 첫 KPT 회고

살면서 회고를 많이 해보지 않았던 것 같다. 회사에서 월마다 했던 개발자로서의 회고말고 학습에 대한 회고는 특히 처음이다. YAPP 활동을 하면서 KPT 회고 채널에 기웃거린 적이 있어, KPT 회고에 대해서는 어느정도 알고 있었고, 지식 공유자 "우빈"님께서 추천한 템플릿에 때마침 KPT 회고가 있어 적용해보려 한다. Keep (유지하고 싶은 점)객체 지향 설계 원칙 학습의 중요성강의에서 배운 SOLID 원칙과 객체 설계에 대한 이해가 프로젝트에서 큰 도움이 되었다. 특히, SRP(단일 책임 원칙)을 적용하여 클래스나 메서드를 단일 책임으로 분리하고, OCP(개방-폐쇄 원칙)에 따라 기존 코드를 수정하지 않고 확장할 수 있는 구조를 직접 설계해보며 학습.효율적인 시간 관리와 우선순위 설정졸업 프로젝트와 커뮤니티 활동을 병행하면서 효율적으로 시간을 분배한 덕분에 여러 활동을 동시에 진행할 수 있었다. 우선순위를 잘 설정하고, 중요한 작업에 집중하는 습관이 업무를 원활하게 마무리하는 데 큰 도움이 되었다.코드 가독성 향상강의에서 배운 내용을 통해 코드 가독성에 신경을 많이 쓰려고 해보았다. 메서드와 클래스의 추상화 레벨을 조정하여 복잡한 로직을 단순화하고, 이름 짓기 원칙을 준수하여 코드의 의미 전달력을 높이려고 노력했다.실제 프로젝트에 적용강의 내용을 기반으로 실제 진행 중인 프로젝트에 적용해가며 이해하려고 노력하고 있다. 보다 더 생각을 많이하고 코드를 짜게 되는 것 같다. Problem (아쉬웠던 점)프로젝트 제출 기한 관리 부족바쁜 스케줄로 인해 Day04 미션을 제출하지 못한 것이 너무 아쉽다. 여러 프로젝트와 커뮤니티 활동을 병행하는 과정에서 시간 관리가 어려웠고, 이를 통해 미션을 놓치게 된 점은 아쉬운 부분으로 남는다. 사실, 최고의 효율을 낼 수 있는 우선순위 설정을 했지만... 못한 부분이 있어 아숩다..시간 압박으로 인한 학습 부족프로젝트와 업무를 병행하다 보니, 일부 강의에서 다뤘던 디테일한 내용들을 직접 생각해보는 시간이 부족했다. Try (다음 프로젝트에서 시도할 점)시간 관리 툴 도입프로젝트 제출 기한 관리를 위해 타임 블로킹(Time Blocking)이나 프로젝트 관리 툴(예: Notion, Trello)을 적극적으로 도입해볼 예정이다. 이러한 도구를 통해 일정과 우선순위를 보다 명확하게 관리하고, 놓치는 일이 없도록 해보자.이해한 내용들을 다시 글로 작성해보기조금 더 배운 내용들을 잘 정제해서 블로그 글로 포스팅해보려고 한다. 미션도 미션이지만, 나의 학습으로 완전한 지식으로 만들고자 한다.

백엔드KPT회고

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

지난 일주일 동안 "Readable Code: 읽기 좋은 코드를 작성하는 사고법" 강의의 섹션 1부터 4까지를 수강했습니다.  주요 학습 내용1. 추상화의 개념과 중요성2. 명확한 이름 짓기의 원칙3. 메서드 추상화와 선언부 작성법4. 코드의 논리 흐름 개선하기 5. 객체 지향 패러다임의 기본 개념인상 깊었던 부분은 추상화 레벨을 일관되게 유지하는 것의 중요성이었습니다. 코드를 읽을 때 추상화 수준이 들쭉날쭉하면 이해하기 어렵다는 점을 실감했고 이전 진행했던 프로젝트의 코드를 보면서 리팩터링의 필요성을 실감하게 되었습니다. 회고:칭찬할 점: 매일 꾸준히 1-2개 강의를 들으며 학습 리듬을 잘 유지했습니다. 아쉬운 점: 시간 부족으로 배운 내용을 실제 코드에 적용해보는 연습이 부족했습니다.보완할 점: 다음 주에는 강의 내용을 토대로 기존 프로젝트 코드를 리팩토링해보려 합니다. 다음 주 목표1. 남은 섹션 완강하기2. 매일 30분씩 실습 및 리팩토링 시간 갖기3. 클린 코드 원칙을 적용한 코드 리뷰 연습하기 미션 접근 방법1. 코드의 전반적인 구조와 흐름 파악2. 가장 시급한 개선 포인트 식별 (긴 메서드, 복잡한 조건문 등)3. 작은 단위로 나누어 점진적 리팩토링 진행 해결 과정1. 긴 메서드를 의미 있는 단위로 추출2. 복잡한 조건문을 객체로 캡슐화3. 매직 넘버 제거 및 상수화4. 변수명과 메서드명 개선한 번에 큰 변화를 주기보다 작은 단위로 개선하는것이 보다 빠르고 효과적이라는것을 알게 되었습니다.

‍방승일

[워밍업 클럽 2기 BE 클린코드&테스트] 1주차 회고

한 주 동안 배웠던 내용들을 요약하고,배움의 과정에서 느꼈던 것을 회고해보려고 한다. 배운 것들1. 추상과 구체앞으로 배울 내용의 있어서 대표할 수 있는 주제이지 않을까 싶다.중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.적절한 추상화는 코드를 이해하기 쉽도록 만들어 준다.개발자들이 읽기 좋은 코드를 작성해야 하는 이유는 다음과 같다.코드가 잘 읽힌다 == 이해가 잘 된다 == 유지보수 하기가 수월하다 == 시간과 자원이 절약된다.따라서 추상화를 적절하게 적용하여 코드를 잘 읽히도록 작성하는 것이 중요하다. 2. 논리, 사고의 흐름읽기 좋은 코드는 최소의 인지적 노력으로 최대의 정보를 얻을 수 있을 것이다.인지적 경제성을 띈 코드를 작성하려면 아래와 같이 코딩을 해보자!Early return논리적 사고 depth 줄이기사용할 변수는 가까운 곳에 선언하기적절한 의미 단위를 공백 라인으로 구분하기부정어를 한 번에 이해할 수 있도록의도된 예외와 의도하지 않은 예외 구분하기NullPointerException 을 방지하도록 코딩하기3. 객체 지향 패러다임객체란 추상화된 데이터와 코드의 집합체로 볼 수 있다.객체 지향 세계에는 각 객체마다 고유한 책임이 존재하고,객체들 간의 협력이 존재한다.객체들은 서로 메시지를 주고 받으면서 협력을 하게 된다. 이때 메시지를 주고 받는 창구 역할이 공개 메서드이다.즉, 공개 메서드는 각 객체의 책임을 드러낸다.객체 지향 패러다임으로 코딩을 하면 절차 지향에서 잘 보이지 않던 개념들이 가시화된다.그리고, 관심사가 한 군데로 모이기 때문에 유지보수하기 편하다.따라서 객체 지향 언어를 사용하는 개발자들은 SOLID 원칙을 지향하면서 개발하는 것이 좋다. 회고좋았던 점평소에 흩어져있던 객체 지향 프로그래밍 지식들을 응집도 있게 모을 수 있었던 한 주였던 것 같다.특히, 이론적으로만 알던 내용들을 실제 예제 코드들에 적용해가면서 실제 적용하는 방법에 대해 알 수 있었다.평소에 신경쓰지 않고 개발하는 부분들에 대해서도 한 번 더 고민해보고 코딩하는 습관을 갖게 된 것 같다. 아쉬웠던 점SOLID 원칙은 아무래도 연습을 많이 해봐야 체내화가 될 것 같다.연습이 많이 부족한 것 같다. 평소에 코딩하면서도 5 가지 원칙을 고려하면서 확장성 있는 개발을 하도록 노력해야 될 것 같다. 흥미로운 점객체들간의 협력이 이뤄지는 방식에 대해 더욱 확고한 시야를 가질 수 있었던 시간이었다.     

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

강의 내용 중 중요하다고 생각되는 부분추상이름 짓기의 중요성 단수와 복수 구분하기이름 줄이지 않기은어/방언 사용하지 않기좋은 코드를 보고 습득하기당연하다고 생각되지만 생각보다 지키기 쉽지 않다....추상화 수준추상화 수준을 맞춰야 독자로 하여금 읽기 쉬운 코드가 된다.납득은 되지만, 실제 코드에 적용하게 되면 private method가 너무 많아지는 것은 아닌가... 뭐든 적당히...논리 사고의 흐름사고의 depth 줄이기중첩 분기문, 중첩 반목문 줄이기사용할 변수는 가깝게 선언하기무조건 적으로 depth를 줄이기 보다는, 사고의 depth를 줄이도록, 독자로 하여금 읽기 쉽게 짜야함...해피케이스와 예외처리예외가 발생할 가능성 낮추기NPE 를 방지하는 방향으로 작성, Optional 사용도 고민해봐야 함의도한 예외와 예상하지 못한 예외를 구분하기객체 지향 패러다임단일 책임 원칙 (Single Responsibility Principle): 클래스는 하나의 책임만 가져야 하며, 하나의 변화 이유만 가져야 한다.개방-폐쇄 원칙 (Open/Closed Principle): 소프트웨어 요소는 확장에는 열려 있어야 하지만, 수정에는 닫혀 있어야 한다.리스코프 치환 원칙 (Liskov Substitution Principle): 서브클래스는 언제나 자신의 기반 클래스와 호환되어야 한다.인터페이스 분리 원칙 (Interface Segregation Principle): 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.의존성 역전 원칙 (Dependency Inversion Principle): 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다.항상 인식하고 있지만, 실제 적용하기는 매우 어려운... 객체 ... 미션1. Day2 일상생활에서 쉽게 찾을 수 있는 추상과 구체에 대한 생각."출근" 이라는 추상을 구체화 하여, 아침에 일어나고 회사로 이동하고 업무 준비를 하는 과정으로 구체화2. Day 4미션의 요구사항주문 항목이 0 이상이어야 한다.총 주문 금액이 0 이상이어야 한다.주문을 하는 사용자의 정보가 있어야 한다.미션 해결 과정가독성을 위해 depth를 줄임.ealry return 을 이용하여 불필요한 else 를 줄임.추상화 수준에 맞게 메소드로 추출// before 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; }// after public boolean validateOrder(Order order) { if (hasNoItems(order)) { log.info("주문 항목이 없습니다."); return false; } if (hasInvalidTotalPrice(order)) { log.info("올바르지 않은 총 가격입니다."); return false; } if (hasNoCustomerInfo(order)) { log.info("사용자 정보가 없습니다."); return false; } return true; } 

백엔드

이충현

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

인프런 워밍업 클럽을 모집한다는 글을 보고 들으면 정말 좋겠다고 생각을 했는데하필 10월에는 시험이 있는데 내년에 기숙사에 들어가기 위해 학점을 잘 따야하는 입장이라 고민을 많이했다.근데 미리 학교 공부를 하면 따라가는데 크게 어려움이 없을거라 생각해 참가하게되었다. 공부는 강의 내용에 대해 나의 생각을 작성하면서나중에 보더라도 생각을 하기 편하게 노션에 작성하면서 공부하고 있다. Keep (프로젝트에서 만족했고, 앞으로의 업무에서 지속하고 싶은 부분)추상 파트부터 내가 생각하지 못했던 것을 생각하게 해준 것 같다.기존에는 코드를 작성할 때 생각을 많이 해보지 않고 작성을 했던 것 같다. 그래서 리팩토링을 하는 과정에서 어떻게 코드를 짜는 것이 좋은지 대강 알게된 것 같다.Problem (프로젝트에서 부정적인 요소로 작용했거나 아쉬웠던 점)일정 관리이번주에는 학교 시험 공부를 미리 좀 해서 하루 분량이 밀려있다. 2주차에서 진도를 무조건 따라가도록 할 것이다.Try (Problem에 대한 해결 방식으로 다음 프로젝트에서 시도해볼 점)코드 리팩토링 해보꾸준히 스터디를 수행하며 다른 사람들의 코드도 봐서 어떤 식으로 했는지 생각을 읽어봐야겠다.

백엔드

Yeoonnii

[인프런 워밍업 클럽 CS 2기] 1주차 발자국 - 첫째 주 미션

[ 운영체제 ]Q1.while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?A1. 주기적으로 명령의 완료여부를 체크하는 폴링방식은 CPU를 낭비하는 단점이 있으며, 이를 해결하기 위해 인터럽트 방식을 이용하는 것이 좋습니다.인터럽트 방식은 CPU가 다른 작업을 수행하고 특정 이벤트가 발생하면 해당 이벤트를 처리하기 위해 인터럽트 서비스 루틴(ISR)이 실행됩니다. 인터럽트 방식을 사용하면 CPU를 더 효율적으로 사용할 수 있게 됩니다. Q2. 프로그램과 프로세스가 어떻게 다른가요?A2. 프로그램은 저장장치에 저장된 명령문의 집합체를 말하며 실행되지 않은 정적인 상태입니다.프로세스는 저장된 프로그램이 메모리에 로드되고 CPU에서 실행중인 동적인 상태를 의미합니다.컴퓨터 관점에서 프로그램은 저장장치만 사용하는 수동적 존재이며, 프로세스는 메모리/CPU사용, 입/출력 작업을 진행하는 능동적 존재입니다. Q3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?A3. 멀티프로그래밍은 메모리에 여러가지 프로그램을 동시에 적재하여 실행하는 방식이며, 단일 CPU가 여러 프로세스를 번갈아가며 실행하는 것을 의미합니다.멀티프로세싱은 물리적으로 여러 개의 CPU를 사용하여 동시에 여러 프로세스를 실행하는 방식입니다. 여러 개의 CPU가 병렬적으로 동작하여 프로세스를 동시에 처리할 수 있으며, 단일 CPU 처리에 비해 더 높은 성능과 처리량을 기대할 수 있습니다. Q4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?A4. 운영체제는 프로세스를 관리하기 위해 프로세스의 다양한 정보를 포함한 PCB(Process Control Block)를 사용하여 프로세스를 관리합니다. Q5. 컨텍스트 스위칭이란 뭔가요?A5. 기존에 실행중인 프로세스의 상태를 저장하고 새로운 프로세스의 상태로 전환하는 작업을 의미합니다.이 과정에서 CPU는 이전 프로세스의 정보를 PCB에 저장하고 새 프로세스의 PCB를 가져와서 프로세스를 실행합니다.컨텍스트 스위칭은 CPU 점유 시간 초과, I/O 요청 발생, 인터럽트 발생 등 다양한 경우에 발생합니다.컨텍스트 스위칭 발생시 시스템의 오버헤드를 증가시킬 수 있으며 잦은 컨텍스트 스위칭으로 시스템 성능이 저하될 수 있습니다.[ 자료구조와 알고리즘 ]Q1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.A1.교실의 학생 정보를 데이터의 관점으로 바라봤을때 데이터의 추가, 삭제가 발생할 수 있습니다.데이터 추가 : 새로운 전학생이 온 경우데이터 삭제 : 기존학생이 전학을 간 경우→ 배열, 스택(Stack), 큐(Queue) , 덱(Deq)의 자료구조는 적절하지 않습니다.교실의 학생 중 동명이인이 있을 수 있습니다. → 셋(Set)의 자료구조는 적절하지 않습니다.따라서 연결리스트나 해시테이블의 자료구조를 사용하는것이 적절하다고 생각합니다.좋은 해시 함수를 사용할 수 있는 상황이라면 해시테이블을 선택하겠습니다. Q2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.고객의 주문을 순차적으로 처리해야 하기 때문에 FIFO (First In First Out) 구조를 가진 큐 (Queue) 자료구조를 선택하는것이 적절하다고 생각합니다.

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

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

운영체제 1. while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?  인터럽트를 사용 프로그램과 프로세스가 어떻게 다른가요? 프로그램은 실행 파일의 형태, 하드디스크에 존재프로세스는 실제로 실행중인 프로그램 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요? 멀티 프로그래밍은 메모리에 여러 프로그램들이 올라가 있는 것멀티 프로세싱은 시분할을 사용하여 프로세스간의 전환을 하며 동작하는 것을 의미 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB를 사용 컨텍스트 스위칭이란 뭔가요?메모리에 올려진 프로세스간의 전환을 위해 사용하는 방법  자료구조와 알고리즘 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.hashMap, 혹은 Dict 자료형 Key Value를 사용하는 자료구조를 사용한다면 빠르게 학생 정보를 열람할 수 있도록 구현할 수 있다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.Queue를 사용 First In First Out 구조가 필요하기 때문이다.

재인

[1주차] 인프런 워밍업 클럽 Backend

1주차 학습 내용 프레임워크 vs 라이브러리 vs APIAPI와 라이브러리의 차이는?구현로직의 유무이다.API는 호출을 위한 수단으로 구현 로직을 알 수 없다라이브러리는 구현 로직이 존재한다예를 들어 라이브러리를 통해 빵을 만들 수 있다면 API는 빵을 만들어 달라! 라고 요청하는 것이다라이브러리와 프레임워크의 차이는?응용프로그램의 흐름 주도권을 누가 가지고 있는지이다.라이브러리는 개발자가 흐름 주도권을 가지고 라이브러리를 호출한다.하지만 프레임워크의 경우 프레임워크가 흐름 주도권을 가지며 프레임워크의 규칙을 따라 개발해야한다. MVC 패턴소프트웨어 아키텍쳐 디자인 패턴의 한 종류이다.궁극적으로는 사용자 인터페이스로부터 비즈니스 로직을 분리함으로써 MVC 간의 결합도를 낮추며 유지보수를 용이하게 하기 위함이다.레이어드 아키텍쳐 (Controller-Service-Repository)실무에서 위와 같은 MVC 패턴으로 개발하다 보면 여러문제에 부딪힌다고 한다.따라서 좀 더 세분화된 소프트웨어 아키텍처인 레이어드 아키텍처를 주로 사용한다.  HTTP & REST API클라이언트에서 서버로 데이터를 전달하는 방법은 3가지 이다Query parameter, HTTP Request Body, Path variable왼쪽이 Query parameter, 오른쪽이 Path variable을 사용한 방법이다필수로 요구되는 값과 관련있을때는 Path variable을, 옵션일 경우엔 Query parameter 를 사용하는게 좋겠다. ORM (Object Relational Mapping)데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)라고 한다.이를 위해 Java에서 지원해주는 JDBC가 있지만, 이는 개발자가 하나하나 매핑해주어야하는 번거로움이 있다.이를 해소하고자 아래와 같은 Persistence Framework 가 존재한다.SQL MapperMyBatisJdbcTemplateORMJPA (Java Persistence API)Hibernate ORM이란, 객체(Object)와 DB의 테이블을 자동으로 연결(Mapping)시켜 RDB 테이블을 객체 지향적으로 사용하게 해주는 기술이다.개발자가 직접 쿼리를 작성하지 않아 생산성이 향상되고, 구체적인 DBMS에 대한 의존성이 줄어드는 장점이 있지만불가피하게 작성해야하는 쿼리가 존재할 수 있고, 잘못 구현된 경우 속도 저하가 있을 수 있다.  JPA의 영속성 컨텍스트JPA에서 어플리케이션과 DB 사이에서 엔티티를 관리하는 임시 메모리, 버퍼 같은 개념이다.1차 캐시 역할쓰기 지연 : insert/update 문을 모아뒀다가 트랜잭션이 종료될때 일괄 수행더티 체킹 : 영속성 컨텍스트 내의 데이터 변화를 감지하여 트랜잭션이 종료될때 자동으로 update 문을 수행 미션요리를 자주하기도 하고, 요새 흑백요리사도 재밌길래 레시피 공유로 주제를 선택했다. 레시피 공유 외에 어떤 기능이 유용할까 생각해보다, 가격별/재료별로 레시피를 추천해주는 기능이 있으면 좋겠다는 생각이 들었다.그래서 재료 테이블에 가격을 넣고, 레시피별로 들어가는 재료의 가격을 산정하기 위해 재료의 양을 저장할 수 있게 했다.레시피의 가격을 저장하는 방법도 있지만, 만약 사용자가 가지고 있는 재료라면 필요 금액에서 제외될 수 있도록 하기위해 따로 저장하지 않고 실시간으로 계산하려고 한다. 회고개인적으로 바쁜 일이 많아 커리큘럼에 따라 공부하지 못해서 아쉬웠다.미션도 발자국도 마감 임박시점에 진행하게되어서 다음주부턴 하루전을 목표로 진행해 보고자 한다 !  referencehttps://velog.io/@tjdud0123/API-vs-라이브러리-vs-프레임워크https://blog.doctornow.co.kr/tech/layered-architecturehttps://hoehen-flug.tistory.com/47#ORM(Object%20Relational%20Mapping)%EC%9D%B4%EB%9E%80%3F-1https://hyeonproject.medium.com/path-parameter%EC%99%80-query-parameter%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%83%9D%EA%B0%81%ED%95%B4%EB%B3%B4%EA%B8%B0-143660b839c9https://velog.io/@haileeyu21/Session-RESTful-API-%EB%9E%80-Path-parameters-Query-string

백엔드

김소형

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

학습 내용베리어블의 정의와 용도베리어블의 구성과 이름짓기 방법베리어블을 등록하고 효율적인 활용을 위해 노출 범위를 설정하는 법저장한 컬러 및 단위, 폰트 스타일을 바탕으로 디자인 파운데이션을 문서화 하는법입력 컴포넌트 만들기미션공개 목표 : 베리어블 등록하고 파운데이션 문서화하기1주차 개인 목표목표 1 : 가장 간단한 방식의 베리어블 등록방식 실험해보기목표 2 : 플러그인보다 보기 편한 방식으로 문서화 시도하기워밍업 클럽 전에 여러번 볼드님이 운영하시는 스터디에 참여했었고, 앞쪽 내용은 여러번 들었다. 그동안 강의는 열심히 따라했다고 생각했지만 개발까지 베리어블을 적용해볼 수가 없어 효용성을 체감하기 어려웠다.이제 그냥 강의를 따라하는 것 보다는 나름대로 여러가지 추가적인 공부를 하면서 의의를 찾아봐야겠다고 생각했다.개인 목표 1 실습 과정 새로운 프로덕트를 만든다고 생각하고, 가장 간단한 베리어블 시스템을 만들어보자회사마다 베리어블 구조가 다 달랐는데, 다 나름대로 좋은 부분이 있었다. 다만 일부 회사의 경우 너무 체계적인게 오히려 작은 회사에서 그대로 적용하기엔 문제가 있어보였다. 논리적이긴 한데, 막상 눈에는 잘 안들어오는 느낌? 베리어블 정의가 복잡하면 직관적으로 파악하기 어려워 활용도가 떨어진다고 생각해서 구분을 최소화했다. 텍스트 아이콘 컬러값이 대체로 비슷해 머터리얼 가이드에서는 둘을 따로 구분하지 않아서 베낌 > Text로 정의마찬가지로 토글, 버튼등 인터렉션 컴포넌트도 대체로 비슷해서 구분 안하기로 했다. > Interaction으로 정의상태 컬러(Hover,Pressed등)는 컴포넌트에 한번 지정하고 나면 실제 UI작업에서는 거의 쓰이지 않기 때문에 잘 안보이는게 좋겠다는 생각이 들어서 목록 최하단에 뜰 수 있도록 분리했다.   개인 목표 2 실습 과정플러그인으로 뽑았을 때 나오는 컬러차트 말고, 좀더 명료한 방식으로 문서화 해보자예전에 디자인 스타일 가이드를 나름대로 만들어서 전달했는데, 프론트분들이 냅다 개별 화면 마크업 하는데 주력하고 잘 봐주지 않아서 시무룩했던 경험이 있다. 시간도 없거니와 눈에 잘 안들어왔던 모양이다.기껏 시스템을 만들었으면 잘 읽히게 문서화를 하는것도 중요하다고 생각해서 다른 회사 파운데이션 가이드를 참조해서 만들어봤다. 참조 : 11번가 및 라인 디자인 시스템 가이드대체로 양식이 비슷한데, 라인이 특히 컬러 사용에 대한 정의가 깔끔해서 참고가 되었다.실무에서는 정의한 가이드와 다르게 컬러를 추가하거나 이미 다르게 사용된 경우가 많을것이라 생각된다. 이런 엣지케이스에 어떻게 대응할지, 문서를 어떻게 업데이트하고 유지할지도 구성원간의 합의가 필요할 것 같았다.    

UIFIGMADesignSystem

ykm8864

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

학습 내용리팩토링을 왜할까? 클린코드를 왜 작성할까?우리는 생산을 해냈다고 끝이 아니다. 이후에 조상들이 작성한 코드를 후손들이 유지보수하는 일이 생기기 마련이다. 이에 관련하여 여러가지 방법에 대하여 배워보자추상? 그게 뭔데의미를 담을 수 있는 더 작은 단위, 책임이름짓기단수와 복수의 구분관용어가 아닌 이상 줄임말 자제그 집단만 알 수 있는 은어/방언 사용하지 않기좋은 코드를 많이 보기메서드로의 분리의미를 담을 수 있는 더 작은 단위로 메서드를 분리하기기준 : 추상화되는 의미가 있는가? 이미 이해가 잘 간다면 그대로 두는게 더 나을 수 있다.추상화 레벨 구체에 가깝다 = 추상화 레벨이 낮다. (디테일한 코드 상세) 추상에 가깝다 = 추상화 레벨이 높다. (디테일한 코드를 외부세계로 감싸는 메서드)하나의 세계 안에서는, 추상화 레벨이 동등해야 한다. 내가 너무 주변 레벨에 비해서 구체화시키고 있다면 추상화를 고려해보자매직넘버와 매직스트링의미를 갖고 있으나, 상수로 추출되지 않은 숫자상수를 추출하고 이름을 짓고 의미를 부여함으로서 가독성이 향상될 수 있다.상수로 뺀다는건, 이거는 중요한 숫자야~ 유지보수할때 중요깊게 봐야할 필요가 있을거야~ 라는 의미를 줄 수 있다.  논리 사고의 흐름#최소의 인지적 노력으로 최대의 정보를 제공# 뇌는 한번에 한가지 일 밖에 하지 못한다. 멀티태스킹? 그건 저글링일 뿐이다.뇌에 메모리를 적게 쓰게 하기.Early return논리의 흐름을 빠르게 중단시켜 생각 회로를 단순화 한다.코드 흐름을 단순화하고 가독성을 향상중첩분기, 중첩반복문에 대한 최적화depth를 1로 만들 수 있는지 생각해보기때로는 stream에 대한 활용도 고려할 수 있다.2중 중첩구조 안에도 사고에도움이 된다면 중첩 안에 메서드를 분리하여 두어도 좋다.사용할 변수는 가깝게 선언하기공백라인도 의미를 가진다복잡한 로직의 의미 단위를 나누어 보여줌으로써 읽는 사람에게 추가적인 정보를 전달할 수 있다.부정어를 대하는 자세논리를 거꾸로하여 생각하는 과정을 거친다는 것은 가독 저하의 요인일 수 있다.부정어구를 쓰지 않아도 되는 상황인지 체크하기 (무조건 부정조건으로검사해야하는 상황인지)부정의 의미를 담은 다른 단어자체가 존재하는지 고민하기 or 부정어구로 메서드 명 구성해피케이스와 예외 처리예외가 발생할 가능성 낮추기검증로직은 생성자 or 별도의 분리가 필요의도한 예외와 예상하지 못한 예외를 구분하기Null을 대하는 자세equals작성시 상수를 앞에 둔다.Optional은 비싼 객체라 항상 좋은건 아니지만 값이 있을 수도 있고 없을 수도 있는 상황에는 고려할 수 있다. 이때 멤버변수에 Optional은 좋지 않다. 만들어진 목적이 메서드의 반환타입에 쓰게금 설계되어있다.[orElse() : 괄호 안에 값이 항상 실행orElseGet() : 옵셔널안에 원본값이 null인 경우 실행orElseThrow() : 값이 있으면 쓰고 없으면 예외를 던지겠다. 라는 의미라서 그냥 써도된다.StackTrace는 안티패턴이다. 추상의 관점으로 바라보는 객체 지향객체지향 패러다임객체 간의 협력과 객체가 담당하는 책임객체간의 협력과 객체가 담당하는 책임의 관점으로 추상화를 접목시켜 이해하는 것이 중요하다.관심사의 분리관심사끼리 객체를 분리한다.높은 응집도, 낮은 결합도 유지객체 설계하기객체도 추상화와 같이 객체로 나누는 순간 외부와 경계가 발생한다. 이때 외부세계와 소통을 위해서 공개메서드를 활용한다.객체는 외부로 기능을 제공해준다. (개념의 가시화 = 관심사)비공개필드(데이터), 비공개로직(기능 구현부), 공개 메서드 선언부만 외부로 노출하여 이루어진다.여러 객체를 사용하는 입장에서는 구체적인 구현에 신경쓰지 않고 보다 높은 추상화 레벨에서 도메인 로직을 다룰 수 있다.새로운 객체를 만들 때 주의할 점1개의 관심사로 명확하게 책임이 정의되었는지 확인유효성 검증setter 사용 자제(데이터의 불변성)getter가 꼭 필요한지 생각해보기 (객체에 메시지를 보내서 필요한 정보를 메서드로 가져올 수 없는지?)필드의 수는 적을 수록 좋다. 객체지향 패러다임(SOLID)SRP : ”책임을 볼 줄 아는 눈”전문가가 되어야한다. 하나 이상의 일을 책임지게 되면 업무의 효율성이 떨어지게 된다. 이를 어기면 각각의 역할에 집중할 수 없고 공통 업무의 변화가 생기면 모두 바뀌어야한다.OCP : "기존 코드의 변경 없이 , 시슽템의 기능을 확장할 수 있어야한다. (추상화와 다형성의 활용)"전기콘센트 같은것. 허용 전압 규격만 맞으면 냉장고, 가스레인지 등 모든 가전제품을 사용 가능하다. 가전제품이 늘어나도 규격이 맞으면 사용 가능하고 전기콘센트를 교체할 필요 없다.LSP : "자식클래스는 부모클래스의 책임을 준수하며, 부코클래스의 행동을 변경하지 않아야한다."엄마말을 잘 듣자. 상속의 세계에서는 자식은 부모를 이길 수 없다. 따라서, 자식은 부모의 규칙을 어기거나 변경할 수 없이 말을 잘 들어야한다.ISP : "인터페이스를 기능단위로 잘게 쪼개라"덜어냄의 미학. 흑백요리사에서처럼 인터페이스도 많은 기능(책임)을 가진다고 좋은게 아니다. 필요한 만큼만 가지는게 최고다.DIP : "상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다."수준에 맞게 놀자. 고수준(추상 : 핵심비지니스 로직) 모듈이 저수준(구체 : 구현세부사항)모듈을 직접적으로 참조하는 것은 저수준모듈의 변경에 민감하게 반응하게된다. 객체지향 적용하기상속과 조합상속보다는 조합을 사용하자상속은 시멘트처럼 굳어진 구조다. (부모와 자식의 결합도가 높다.)조합과 인터페이스를 활용하는 것이 유연한 구조다.상속을 통한 코드의 중복 제거가 주는 이점보다, 중복이 생기더라도 유연한 구조 설계가 주는 이점이 더 크다.상속 : extends → 부모 - 자식 간의 필수 오버라이딩 제약이 없고, 부모의 구현을 자식이 알고있는 관계 → 자식.부모메서드() 로 호출이 가능하여 재사용성이 향상됐다고 볼 수 있지만 객체 지향 관점에서는 캡슐화가 깨진 상태라고도 볼 수 있음조합 : 부모에는 공통 스팩 제공하는 인터페이스를 사용하고, 해당 부모의 구현체들은 부모의 스팩만 유지한 상태라면 부모에 독립적이고 변경이 많아질 수 있는 부분은 부모 클래스에 두지 않고 별도의 클래스로 분리함으로써 캡슐화와 확장성을 지킨다.주입 : 외부에서 부모 클래스나 자식 클래스가 의존하는 객체들을 주입함으로써, 객체 간의 강한 결합을 방지하고, 필요 시 구현체를 쉽게 교체할 수 있게 하여 유지보수와 테스트의 용이성을 높인다.Value Object도메인의 어떤 개념을 추상화하여 표현한 값 객체 값으로 취급하기 위해서, 불변성, 동등성, 유효성 검증 등을 보장해야 한다.엔티티와 vo의 차이(식별자 유무 차이)일급 컬렉션일급시민이란? -> 다른 요소(누군가의 파라미터, 변수, 함수의 결과로 return)에게 사용 가능한 모든 연산을 지원하는 요소일급컬렉션이란?컬렉션을 포장하면서 필드로 무조건 해당 컬렉션 하나만을 가지고 있는 객체컬렉션을 다른 객체와 동등한 레벨로 다루기 위함getter로 컬렉션을 반환할 일이 생긴다면 필드에서 가지고 있는 컬렉션과 같은 참조를 리턴하는 일이 생기지 않도록 new해서 새로운 컬렉션을 반환하자.enum의 특성과 활용상수의 집합변경이 정말 잦은 개념이면 enum보다 db로 관리하는게 좋을 수 있음.다형성 활용하기변하는 것과 변하지 않는 것을 분리하여 추상화하는 것.변하지 않는 것을 지켜야[추상] → 변경에는 닫혀있는 상태를 유지 가능변화하는 것에는 유동적으로 해결이 되어야[구체] → 확장에 열려있는 상태가 된다. 숨겨져 있는 도메인 개념 도출하기완벽한 설계는 없다. 그 당시의 최선이 있을 뿐.도메인 지식은 만드는 것이 아니라 발견하는 것설계할 때는 근시적, 거시적 관점에서 최대한 미래를 예측하려는 시도가 필요하다시간이 지나 만약 틀렸다는 것을 인지하면 언제든 돌아올 수 있도록 코드를 만들어야 한다.미션-> 주어진 코드에 대한 리팩토링얼리리턴추상화레벨 맞추기처리해야할 예외와 그렇지 않은 예외의 분리변수명, 함수명책임의 분리등.. 배운 지식을 활용하여 최적화하는 연습을 해보았다.   1주차 회고Keep (만족했고, 앞으로도 지속하고 싶은 부분)현재 코드를 작성하면서 "조상"과 "후손"이라는 표현을 사용한 점이 인상 깊었다. 이 표현은 코드의 지속성과 유지보수의 중요성을 잘 드러낸다고 생각이 들었다. 실무에서는 생산성과 클린 코드를 상반된 개념으로 보는 경우가 많은데, 이는 조직의 코드 문화에 긍정적이지 않다는 생각도 같이 들곤 했다. 이러한 문화를 개선하기 위한 방법론을 이번 학습을 통해 구체적으로 알게 되어 만족스러웠다..Problem (아쉬웠던 점)처음 보는 코드에 대한 빠른 이해가 부족하다는 점을 느꼈다. 즉, 현재 짜여진 코드를 너무 쉽게 납득해버리는 경향이 있는게 아닌가 싶다. 강사님처럼 코드를 보고 잠재적인 문제와 개선 가능성을 구조적으로 접근하는 시야가 필요하다고 생각한다. 이를 통해 "보는 눈"에 대한 중요성을 느꼈다.Try (다음에 시도해볼 점)구체적인 코드 설계에서 추상과 구체를 명확하게 분리하는 연습을 해보고 싶다. 처음부터 완벽한 설계를 할 수는 없겠지만, 도메인의 책임을 분리하고 리팩토링을 고려한 설계를 시도해봐야겠다. 우선 흐름대로 코드를 작성한 후, 리팩토링을 통해 개선하는 과정을 반복하며 사고력을 기르는 과정을 연습해보아야 할 거 같다.

백엔드워밍업클럽회고자기계발몰입하는개발자BE백엔드

yesrin

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

인프런 1주차가 끝났다. 강의 수강과 과제를 제때제 하지 못해서 100% 얻어 가지 못하는 것 같아 속상하지만..!2주차는 1주차 보다 더 열심히 해보고자 한다! (더 이해하고, 기록하고, 나만의 언어로 설명하기) 강의를 들으며 기억에 남았던 부분을 정리하며 마무리해보려고 한다. 추상 (抽象)도메인 용어 정리의 필요성새 프로젝트를 시작하기 이전에 팀원들과 코드컨벤션을 정해본 경험이 있었다. 도메인 용어같은 경우에는 눈치껏 기존 프로젝트에 따라서 사용하고 있었는데 정리하고 시작한다면 모두에게 도움이 될것 같다. 메서드 선언부메서드 시그니처 : 메서드명 + 파라미터 파라미터의 타입, 개수, 순서를 통해 의미를 전달할 수 있다는 점을 기억하자. 추상화 레벨하나의 세계 안에서는, 추상화 레벨이 동등해야 한다."서점의 책들 사이에 책 제목이 없는 문서 뭉치가 껴있다". 라는 강사님의 비유가 인상적 이였다.추상화 레벨이 맞지 않는다면 읽는 사람은 고민을 하게 될 것이다. 논리, 사고의 흐름Early returnvoid일 경우에는 early return 할 생각을 못하고 있었는데 코드를 이해하기에 return 이 있는 편이 좋겠다. Optional을 해소하는 방법분기문을 만드는 isPresent()-get() 대신 풍부한 api를 사용하자.orElseGet(), orElseThrow(), ifPresent(), ifPresentOrElse() 객체 지향 패러다임객체를 만드는 처음부터 getter, setter을 만들지 말아라. SOLID SRP 단일책임원칙 : 이 객체가 하나의 책임만을 가지고 있는지 질문을 던져야 한다.OCP: 확장에는 열려있고, 수정에는 닫혀있다. =>새로운 기능 또는 요구사항이 생겼을때 기존 코드가 과도하게 변경 된다면 OCP 를 지키지 못한것이다.LSP :상속 구조에서, 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 한다.ISP : 자신이 사용하지 않는 인터페이스에 의존하면 안된다. => 인터페이스를 잘게 쪼개라!DIP : 의존성 역전 원칙   어려운 이론이지만 코드를 통해서 설명해 주셔서 이해하기 편했다. ++ 더 듣고 추가 예정 이번 강의를 들으면서 내가 작성했던 코드를 어떻게 더 읽기 좋은 코드로 만들어어야 할지 알게 되었고, 동료들이 작성했던 코드도 더 이해 할수 있게 되었다. 2주차도 화이팅!   강의 : Readable Code: 읽기 좋은 코드를 작성하는 사고법 (박우빈)      

읽기좋은코드

김지수

[인프런 워밍업 클럽 2기] 백엔드 프로젝드 - 1주차 발자국

강의학습 내용클라이언트, 서버, 데이터베이스, DNS요청을 보내는 주체가 클라이언트이고, 요청을 받아 처리를 하는 주체가 서버이다. 그래서 어떻게 보면, 서버가 클라이언트가 되어 데이터베이스에게 요청을 보내고, 데이터 베이스가 처리를 하는 서버가 될 수도 있다. DNS는 도메인 주소와 IP 모음을 가지고 있는 주소록 같은 서버이다. 우리가 www.inflearn.com이라고 도메인을 치면 그에 맞는 ip를 dns서버에서 받아와서 보낸다. 웹 프레임워크, Spring 프레임워크, MVC 패턴, 레이어드 아키텍쳐웹 프레임워크는 라이브러리와 헷갈릴 수 있는데 가장 큰 차이는 누가 제어권을 가지고 있냐이다. 큰 틀이 프레임워크이고, 라이브러리는 도구 같은 역할을 하기 때문에, 프레임워크는 프레임워크라는 틀의 제작자가 주도권을 가지고 있다고 볼 수 있고, 라이브러리는 사용자가 주도권을 가지고 있다고 볼 수 있다. 그 중, 동적 웹을 만드는 프레임워크가 웹 프레임워크 이다. 웹을 만드는 공통적인 기능을 편리하게 개발할 수 있게 해준다. 그 중 Spring 프레임 워크는 Java기반 웹 프레임워크로 Java 또는 Kotlin으로 백엔드 개발할 때 사용한다. MVC 패턴은 소프트웨어 아키텍쳐 디자인이다. Spring에서 사용한다. Model, View, Controller로 이루어져 각각의 역할을 담당한다. Model은 데이터를 담는 역할을 하고, View는 사용자에게 보여주는, Controller는 요청을 받아 작업을 수행하는 역할을 한다. 레이어드 아키텍쳐는 가장 대중적인 소프트웨어 아키텍쳐로 Spring 개발시 많이 이용한다. 크게 Presentaion, Business, Data Access 세 레이어로 나뉘어 진다.회고 및 다짐스프링 프레임워크 등 웹개발 기초에 대해서 복습할 수 있는 시간이었다. 들으면서 헷갈렸던 개념도 정리할 수 있었다. 다음번 발자국에서는 강의 내용 외에 내가 알게 된 내용도 정리하면 좋을 것 같다는 생각을 했다. 미션테이블 설계하기과정 및 회고1대 다 연관 관계가 있어야 해서 여러가지 주제를 떠올려 보다가, 결국 음식 레시피 공유 서비스를 선택하게 되었다. 요즘 흑백 요리사를 보며 다양한 음식의 레시피를 알고 싶어하는 수요가 많을 것이라는 생각에서였다. 일단, 재료들을 다 따로 구분할 수 있도록, 재료테이블을 만들었고, 음식마다 재료를 선택할 수 있는 레시피 테이블을 만들었다. 이렇게 해두면 일단은 한 음식에 한 레시피 밖에 못 올리지만, 나중에 sn 칼럼을 추가하면 한 음식에 여러 버전의 레시피도 올릴 수 있게 발전 시킬 수 있지 않을까 생각이 든다.  

백엔드

채널톡 아이콘