블로그

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주차 학습 내용 요약과 강의를 들으며 고민해봤던 내용을 정리한 발자국 포스팅을 마칩니다.

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

유진

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

강의 출처 Readable Code: 읽기 좋은 코드를 작성하는 사고법 학습 내용읽기 좋은 코드를 작성하기 위해서는 추상화가 필요하다.추상화의 방법변수와 메서드의 이름에서 무엇을 하는지 알 수 있어야 한다.메서드 시그니처(메서드명, 파라미터), 반환타입추상화 레벨을 동등하게 해주어야 한다.상수 추출early return중첩 분기문, 중첩 반복문 줄이기부정어구를 대체 할 수 있는지예외처리(개발자가 의도한 예외와 예상치 못한 예외의 처리)NullPointException, Optional객체지향SOLID미션추상과 구체의 예시 : 카페에서 커피를 주문하는 것을 단계별로 구체화했다.코드 리팩토링 : 메서드명 변경, 메서드 추출, early return, 부정어구 대체 등을 하여 코드를 리팩토링 했다.SOLID 나만의 언어로 정리 회고클린코드에 대해 어떻게 접근해야 할 지 알 수 있어서 좋았다. 막연하게 어렵다고 생각했던 것들을 코드 리팩토링을 통해 공부할 수 있어서 좋았다. 그런데 생각보다 강의를 듣는게 빠듯했다. 강의만 듣는 것이 아니라 직접 코드로 적용해 보려고 하니까 강의 시간의 두 배는 더 소요되는 것 같다. 게다가 2번째 미션은 시간 안에 제출하지 못했기 때문에 다음 주부터는 시간 분배를 잘해야겠다.  

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

김체토

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

 1주차 발자국 기록 지난 인프런 워밍업 클럽에 이어서 2번째로 참여하게 되었습니다.1기 때 양이 너무 많아서 힘들긴 했지만.. 그래도 워밍업 클럽 덕분에 완강과 실습을 모두 해낼 수 있었다고 생각합니다. 이번에는 복습 겸 BX를 담아 체계적으로 만들어보려고 합니다. 더 나아가서 개발자분들과도 협업하여 디자인 시스템을 만들 수 있으면 그 부분까지 확장시켜볼 계획입니다. - 이번 주 기록 ☑ 디자인 토큰이란?- 디자인 토큰은 전자에 해당- 디자인 시스템의 기본 구성 요소- 작고 반복 가능할 수 있는 디자인 결정들을 기본 디자인 에셋으로 저장해서 활용- 토큰은 디자인 시스템 관리와 수정에 용이하고 일관성 및 멀티 브랜드 관리에 도움 ☑ 디자인 시스템이란?재사용 가능한 컴포넌트, 패턴 그리고 가이드 🪄 추천 플러그인 : Styles to variable- 스타일을 배리어블로 만들어줌- collection 이름을 정할 수 있음https://www.figma.com/community/plugin/1253669344925342575 🪄 홈페이지 : batch styler- 스타일 일괄 수정할 수 있음https://www.figma.com/community/plugin/739825414752646970  - 회고 이번 주는 회사에 적응하느라 하루 이틀씩 밀렸습니다.주말까지 채워서 작업을 진행했는데 다음 주는 매일 조금씩 해 보도록 하겠습니다.

UX/UIuxuifigma피그마프로덕트디자인볼드배리어블

윤재헌

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

학습 내용추상화생략할 정보와 의미를 부여하고 드러낼 정보를 구분잘 쓰여진 글이라면, 한 문단의 주제는 반드시 하나다.잘 쓰여진 코드라면, 한 메소드의 주제는 반드시 하나다.하나의 세계 안에서는, 추상화 레벨이 동등해야한다.매직 넘버, 매직 스트링의미를 가지고 있으나, 상수로 추출되지 않은 숫자, 문자열상수 추출로 이름을 짓고 의미를 부여함으로 가독성과, 유지 보수성 상승읽기 좋은 코드코드를 읽을 때, 불필요한 정보를 기억하며 읽지 않아도 되는 코드Early Return조건이 되는 경우를 먼저 return 하여 이후 조건문을 더 간결하게 파악 가능중첩문 줄이기3중 for-loop보다 함수로 나누어 표현하는 것이 가독성이 좋아짐무조건 메소드로 나누는 것이 가독성이 좋아지는 길은 아님변수는 사용하는 위치에 가깝게공백 라인을 사용하여 문맥을 나누어 주기부정어(!)대신 메소드 자체가 부정어를 포함하여 작성예외처리의도한, 의도치 않은 예외를 구분NullPointerException을 항상 방지OptionalorElse와 orElseGet의 차이orElse: 호출할 필요가 없는 경우에도 실행orElseGet: null일 경우만 실행객체 지향캡슐화, 추상화,상속,다형성관심사의 분리높은 응집도, 낮은 결합도객체의 책임1객체는 1개의 관심사로 명확하게 정의가 되었는가setter 사용 자제getter는 필요한 경우에만 SOLIDSRP: 단일 책임 원칙 (Single responsibility principle)한 클래스는 하나의 책임만 가져야 한다.OCP: 개방-폐쇄 원칙 (Open/closed principle)소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.LSP: 리스코프 치환 원칙 (Liskov substitution principle)프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.ISP: 인터페이스 분리 원칙 (Interface segregation principle)특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.DIP: 의존관계 역전 원칙 (Dependency inversion principle)프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.개인적인 정리 (Day 4 Mission)https://www.notion.so/hunyoon/Day-4-Mission-Readable-Code-114f5e6cf89780238071c834a0ce502a?pvs=4  상속과 조합상속보다는 조합(인터패이스)를 사용하는 것이 유연한 대처가 가능VO기본 타입을 객체로 감싸 의미를 부여하여 추상화하는 기법도메인의 어떤 개념을 추상화하여 표현한 값 객체값으로 취급하기 위해, 불변셩, 동등성, 유효성 검증등을 보장해야 한다.불변셩: final 필드, setter 금지동등성: 서로 다른 인스턴스더라도, 내부의 값이 같으면 같은 객체로 취급 (equals(), hashCode() 재정의 필요) (≠ 동일성)유효성 검증: 객체가 생성되는 시점에 값에 대한 유효성을 보장하기VO vs EntityEntity식별자가 존재식별자가 아닌 필드의 값이 달라도, 식별자가 같으면 같은 객체로 취급VO내부의 모든 값이 같아야 동등한 객체로 취급개념적으로 모든 필드가 식별자 역할을 한다고 봐도 됨 회고정말 오랜만에 스스로 앉아 일 이외의 코드를 만지는 시간이었다. 귀찮고 피곤하기만 해 멀리하기만 했던 공부지만 붙잡고 하다보니 흥미도 다시 생기고 더 잘 해내고 싶은 오기도 생기기도 했다. 연휴도 겹치고 회사 일도 있다보니 일정이 미뤄진게 많이 안타까웠다. 진도만 채우는 학습보다는 다시 곱씹어 보는 학습을 하고 싶어졌다.미션을 진행하며 그동안 정말 애매했던 추상화를 다른 방식으로 풀어보게 되었는데 매번 일상에 적용되는 일을 적용시키니 더 의미가 와닿는 느낌이었다. 두번째 미션은 직접 코드를 리팩토링 해보는 것이 었는데 학습한 내용중 가장 먼저 떠오르는 작업부터 적용시킨 후, 내가 정리해둔 문서를 보며 더 진행하니 학습한 내용이 더 내것이 되는 느낌이었다. SOLID에 대해 "내 언어"로 표현하는 부분은 여러번의 말보다 한번의 예시가 나중의 나를 위해서라도 좋다고 생각하여 각 항목의 예시를 하나씩 작성하였고 주위 지인에게도 전달하였는데 호평을 받았다.ㅎ 이 글을 작성하면서도 아직 진도가 끝나지 않아 계속 듣고 있는데 매일 시간을 내서 공부를 하시는 분들 진짜 대단하신거같다

백엔드

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

1주차 강의새로 안 부분 정리부정어를 대하는 자세부정어구를 쓰지 않아도 되는 상황인지 체크부정의 의미를 담은 또 다른 단어가 존재하는지 확인정 없으면 doesNot 사용하지만 최대한 고민해보도록.. 해피케이스와 예외처리예외를 발생할 가능성 낮추기equals 등 비교 할 때 미리 선언 된 상수를 먼저 비교하여 Null Point Error 방지하기Optional에 대하여 따로 빼서 다시 공부해보기SOLID 정리SRP: 단일 책임 원칙클래스는 하나의 책임만 가져야 하며, 해당 책임을 완수하는데만 집중해야한다.→ 클래스의 역할이 명확이 구분되어 있어햐 하며, 클래스를 변경할 이유가 하나여야 한다.이메일 전송 시스템이라면, 사용자의 정보를 저장하는 로직과, 이메일 전송 로직은 구분되어야 한다.OCP: 개방-폐쇄 원칙확장에는 열려있지만, 수정에는 닫혀있어야 한다.→ 새로운 요구사항이 생기면, 기존의 코드를 수정하지 않고도 기능을 추가할 수 있어야 한다.예시로 자주 나오는 전기자동차와 기름자동차…LSP: 리스코프 치환 원칙서브타입은 그 부모타입으로 대체할 수 있어야 하며, 프로그램의 정확성을 해치지 않아야 한다.부모 클래스의 인스턴스를 자식클래스의 인스턴스로 치환할 수 있어야한다.→ 자식 클래스는 부모 클래스가 정의한 행동을 해치지 않아야 한다.추상 : 새는 난다. 새는 소리를 낸다.구현: 참새는 난다. 참새는 짹짹 소리를 낸다비둘기는 난다. 비둘기는 구구 소리를 낸다…ISP: 인터페이스 분리 원칙클라이언트는 사용하지 않는 메서드에 의존해서는 안된다.→ 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스로 구현하는데 대부분 좋다.DIP: 의존 역전 원칙고수준 모듈은 저수준 모듈에 의존해서는 안되며, 둘 다 추상화에 의존해야 한다.→ 구체적인 클래스 보다는 인터페이스나 추상 클래스에 의존해야 한다.  인프런 워밍업 클럽 2기(백엔드 클린코드, 테스트코드) -https://www.inflearn.com/course/offline/warmup-club-2-be-wb강의 출처 -https://www.inflearn.com/course/readable-code-읽기좋은코드-작성사고법

예은

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

볼드UX 튜터님의 <피그마 배리어블을 활용한 디자인 시스템 구축하기>를 수강하며 인프런 워밍업 클럽에 참여하게 되었다.프로젝트들을 진행하며 디자인 시스템을 구축하는 능력이 필요하다는 것을 느끼고 있었다.... 특히 원활한 소통을 위해서 꼭 공부하고 싶다고 생각했다.그리고 사실, 전부터 눈독 들이던 강의였기에 더욱 열의가 넘쳤다!매일매일 학습하는 커리큘럼이라 진도를 잘 따라갈 수 있을지 살짝은 걱정됐지만... 하고 싶은 일이니 열심히 할 수밖에 없다!일단 시작하고 될때까지 하면 된다. 레츠고 배움디자인 토큰과 디자인 시스템에 대한 이해배리어블과 스타일 학습다양한 배리어블 등록 미션컬러, 타이포그래피, 간격, 효과 등 배리어블 등록그리드와 반응형 기준점, 아이콘 등록작업한 스타일 가이드 문서화 (수줍은 탓에 과제물은 모자이크처리해 올립니다...) 이건 꼭 알아두자배리어블 vs 스타일저장 가능한 변수값의 개수: 하나 / 하나 이상참조 여부: 참조 가능 / 참조 불가능모드 여부: 모드 활용 가능 / 직접적인 활용 불가능배리어블 => 다양한 모드에서 달라지는, 재사용 가능한 색상을 등록하는 경우스타일 => 여러 디자인 요소 결합해 사용하는 경우 회고스스로 칭찬하고 싶은 점개인적으로 학습 분량이 벅차게 느껴졌지만 포기하지 않고 어떻게든 해냈다.다른 분들의 작업물을 둘러보며 스스로의 개선점을 찾아보았다. 아쉬웠던 점아직까지 학습이 습관화되지 않은 것 같다. 개선 필요보완하고 싶은 점계획을 세워 여유롭게 학습할 수 있는 환경을 조성하고 싶다.다음주에는나만의 규칙을 만들어 일정한 시간에 학습할 것이다.단순히 멘토님을 따라 학습하는 것에서 더 나아가, 스스로 고민해보고 디자인 시스템을 구축할 것이다. 

UX/UIUXUI피그마프로덕트디자인볼드UX

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

섹션2. 추상클린 코드를 왜 지켜야 할까?가독성이 좋다 = 코드가 잘 읽힌다 = 이해가 잘 된다 = 유지보수 하기가 수월하다결국 나와 팀 전체가 유지보수 하기가 수월하기 때문에 클린 코드를 지향해야 한다.추상적 사고란?표현하고자 하는 구체에서 핵심 개념만을 추출하여 잘 드러내는 표현도메인의 문맥 안에서 이해되는 용어변수, 메서드 이름, 매직 넘버, 매직 스트, 추상화 레벨을 맞춰 읽기 좋게 만듦 섹션3. 논리, 사고의 흐름void 대신 반환 타입 주기 -> 반환값이 있으면 테스트 용이early return을 통한 else 사용 지양사용 변수는 가깝게공백을 통한 의미 나누기부정연산자 사용 대신 의미를 변경해피 케이스와 예외 처리 섹션4. 객체 지향 패러다임객제 지향의 장점절차 지향에서 잘 보이지 않았던 개념을 가시화관심사가 한 군데로 모여 유지 보수성을 높임보다 높은 추상화 레벨에서 도메인 로직 다룸 주의! Setter 사용 자제: 데이터는 불변이 최고Getter 사용 자제: 객체에 메시지를 보내라!1개의 관심사로 명확하게 책임이 정의되었는지 확인하기  SOLIDSRP: 하나의 클래스는 단 한 가지의 변경 이유만을 가져야 한다. OCP: 확장에는 열려 있고, 수정에는 닫혀 있어야 한다. LSP: 상속 구조에서, 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 한다. ISP: 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다. DIP: 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 모두 추상화에 의존해야 한다.  1주차 미션Day2 미션흑백 요리사를 보던 중 백종원 선생님이 음식을 맛있게 먹는 평가하는 모습을 보고 이를 구체적으로 표현해 보았다.음식을 먹는다.음식 속 맛을 내는 물질이 입안으로 들어온다.침에 녹아 맛 구멍을 통해 들어간다.맛을 감지하는 세포가 자극을 받는다.자극이 신경을 통해 뇌로 전달된다.맛을 느낀다.맛을 평가한다.  Day4 미션주어진 코드를 클린 코드 방식으로 리팩토링 하였다.SOLID에 대해 복기하며 다시 정의해 보았다. 1주차 회고병행하는 게 많아서 강의 진도를 따라가기 힘들었다.클린 코드에 대해 막연히 생각했었는데, 이번 기회에 잘 배워서 내 것으로 만들 수 있도록 해야겠다.   

백엔드

채널톡 아이콘