본문 바로가기

전체 글167

[TIL] 코드스쿼드 2022 백엔드 34일차 회고(7주차) 오늘은 무슨 일이? 추상화, Mocking 오늘 호눅스 수업에서는 Random 을 테스트 하는법에 대해 배웠습니다. Random 처럼 결과를 예측할 수 없는 모듈을 사용하는 로직을 테스트하기 위해서 여러가지 시행착오를 일부러 보여주셨는데요. Random 을 사용한 메소드를 테스트 하려고 보니, 여러번 테스트 해보는 방법 밖에는 없었습니다. 그래서 10번 100번 10000번 테스트를 해도 그 결과가 영 찝찝했습니다. 다른 방법을 찾으며 마지막에 알게된 방법은, 추상화와 가짜 객체(Mock Object)를 이용하는 것 이었습니다. 예측할 수 없는 모듈을 인터페이스로 추상화 하고, 해당 로직에서는 Random 대신 인터페이스를 참조하여 사용합니다. 그리고 해당 클래스에서 생성자에서 인터페이스의 구현체를 주입.. 2022. 2. 25.
[TIL] 코드스쿼드 2022 백엔드 33일차 회고(7주차) 오늘은 무슨 일이? 조금씩 익숙해져가는 페어 프로그래밍 이번주는 쭉 페어프로그래밍으로 미션을 진행하고 있는데, 몇달치 말을 이번 2일에 다 한것같은 느낌이 들었습니다. 월요일에는 휴식없이 쭉 달려서 피로가 많이 누적되었고, 화요일은 빨리 구현하고싶은 마음에 페어를 배려하지 못했습니다. 그래서 오늘은 스크럼을 마치고, donggi와 그라운드 룰을 다시 정했습니다. 20분 마다 드라이버, 네비게이터 바꾸기(하던 중이라도 얄짤 없이 교체) 2시간 마다 30분 혹은 식사시간 되면 바로 휴식하기 드라이버와 네이게이터의 역할을 분명하게 정의 드라이버 : 간단한 변수명이나 짧은 로직, 커밋 메세지 등은 드라이버의 재량에 맡김 네비게이터 : 더 넓은 시야로 바라보며 조언(네이밍 컨벤션, 메소드 분리, 객체의 역할과 책.. 2022. 2. 23.
프로세스 관리 프로그램의 실행 주소 변환(Address translation) : 가상 주소를 실제 주소로 변환하는 행위 프로세스가 생성될 때는 물리 주소(Physical memory)에 생성되는데, 실제로 CPU는 가상 메모리(Virtual memory)를 통해 접근하기 때문에 주소 변환(Address translation)이 필요함 프로세스의 주소 공간(Process Address space) stack : 함수 내에서 사용되는 변수들 data : 전역 변수, 배열 등 code : 기계어 코드(main 함수, 사용자 정의 함수 등등) 커널 주소 공간의 내용 code 영역 코드 영역에는 시스템콜로 인터럽트가 발생했을 때 어떤 함수들이 실행되어야 하는지와 커널 함수들이 저장됨 ex) data 영역 PCB : 프로세스들.. 2022. 2. 23.
[TIL] 코드스쿼드 2022 백엔드 31~32일차 회고(7주차) 어제는 무슨 일이? 어제부터는 donggi와 페어프로그래밍을 하게 되었습니다! CS10때 같은 조가 된적도 있었고, 평소 디스코드에서도 종종 모각코를 하고 있어서 어색하진 않아서 좋았습니다ㅎㅎ 얘기 나누다 보니, 저와 같은 경상도 출신이란걸 알게되어 뭔가 더 반가운 느낌이 들었네요😁 CS10 과정의 마지막주에 페어프로그래밍을 잠시 연습한적이 있었는데, 이번에는 본격적으로 하게되어서 걱정반 기대반이었는데요. 다행히도 donggi와 잘 맞아서 같이 변수명 하나까지도 같이 고민하면서 열정을 불태웠습니다..!👨‍💻 이렇게 페어프로그래밍을 하다 보니, 혼자 코드를 작성할때는 무의식적으로 작성했던 것들을 모두 상대가 이해할 수 있는 말로 풀어서 설명해야했고, 자연스레 내가 아는것을 말로 설명하는 연습을 많이 하게되.. 2022. 2. 23.
[TIL] 코드스쿼드 2022 백엔드 30일차 + 주말 회고(6주차) 오늘은 무슨 일이? 코드스쿼드의 웹백엔드 Java 클래스 1 주차가 끝이 났습니다. 이번주 미션부터는 구현 내용을 PR 하면, 코드 리뷰를 받을 수 있었습니다. 본격적으로 리뷰를 받기 시작하니, 스스로 어떤 부분이 부족했었고 개선해야 하는지 명확하게 알 수 있어서 좋았는데요. 이번주 리뷰를 받았던 내용 중에서 가장 신경써서 반영하려고 했던 부분이 있었습니다. 클래스를 필요할 때 분리하기 이때까지는 저는 초반부터 클래스를 최대한 한가지 역할만 하도록, 유현한 변경이 가능하도록 쪼개면서 미션을 구현해 나갔습니다. 이러한 저의 기존 방식은 장단점이 있었는데요. 장점 클래스가 한 가지 역할만 하고 있어서, 추후 리펙토링을 하기 쉬움 변경에 유연한 구조로 만들었기 때문에, 미션 진행 중 요구사항이 변경될 경우 변.. 2022. 2. 19.
[TIL] 코드스쿼드 2022 백엔드 29일차 회고(6주차) 오늘은 무슨 일이? 이번주에는 미션 진행 보다는, 스스로의 객체지향적인 코드를 작성하기 위한 접근방식에 대해 계속 고민했었습니다. 그리고 호눅스의 미리 나누기 보다는, 나중에 필요할 때 나누는것을 선호한다는 코멘트도 계속 머리속에 멤돌았습니다. 그러다 보니 프로젝트의 구조가 이전의 제 스타일처럼 잘게 나눠져있지 않고, 오히려 응집도가 높은 코드가 만들어졌습니다. 그러다가 종종 같이 객체지향과 서로의 코드에 대해 리뷰를 나눴던 동료가 연락이 왔습니다. 제가 이번주는 유독 힘이 없어보이고, 코드도 예전과 많이 달라서 혹시 무슨일이 있는건지 걱정해서였습니다. 그런데 저는 일단 제 표정과 코드를 보고 걱정해서 연락을 해주는 동료가 있다는 사실에 기쁘기도 하고 정말 고마웠습니다. 그것도 잠시, 제가 스스로의 상황.. 2022. 2. 18.
[TIL] 코드스쿼드 2022 백엔드 28일차 회고(6주차) - 객체의 역할과 책임 오늘은 무슨 일이? - 객체의 역할과 책임 저는 지금까지 앞으로 생길 수 있는 갑작스런 변경에 유연한 구조를 미리 만들어놓아야 한다고 생각했었습니다. 그래서 순수 자바 프로젝트를 하더라도 객체의 기능과 구현을 분리하려고 노력했습니다. 하지만, 결국 기능 만으로는 코드가 동작할 수 없기에, 어디선가는 어떤 구현을 사용할 것인지 선언을 해주어야 했습니다. 그러면 결국 객체간 기능만 아는 유연한 연관관계 형성이 불가능하다는 것을 뼈저리게 느꼈습니다. 'DI 컨테이너의 대단함을 이제야 느꼈습니다...' 그래서 고민하던 차에 객체의 역할과 책임에 더 집중하여 한 가지 일만 하도록 만들고 구조적인 복잡도를 줄여서, 나중에 다른 동료가 보더라도 쉽게 이해하여 리펙토링할 수 있는 코드를 만들어야겠다고 생.. 2022. 2. 17.
컴퓨터시스템의 구조 이 글은 운영체제(2017) - (반효경 교수님) 강의를 보고 작성한 글 입니다. 운영체제란 무엇인가? 좁은 의미의 운영체제(커널) 운영체제의 핵심 부분으로, 메모리에 상주하는 부분 Readhat, What is kernal? 넓은 의미의 운영체제 커널 + 각종 주변 시스템 유틸리티를 포함한 개념 Linux system utilities Windows system utilities 운영체제의 목적 흔히 CPU를 컴퓨터의 두뇌라고 하지만, 교수님은 운영체제가 두뇌에 가까운 것 같다고 하셨습니다. - CPU 사람의 두뇌 운영체제 연산 O O O 기억 ▴ O O 판단 X O O 교수님이 뇌와 비교하시던 내용에서 운영체제는 어떤 연산을 하는지 궁금해서 어떤 내용인지 찾아봤습니다. 이중연산모드(커널모드, 사용자모.. 2022. 2. 16.
[TIL] 코드스쿼드 2022 백엔드 27일차 회고(6주차) 오늘은 무슨 일이? 처음으로, PR 승인을 받아보다 어제는 처음으로 PR을 작성해봤는데, 오늘은 처음으로 호눅스로부터 간단한 코드 리뷰를 받았습니다. 그동안 리뷰에 대한 갈증이 많았던 터라 기대가 되었습니다. 동료들과도 자주 리뷰를 했지만, 동료들 끼리 조언할 수 있는 한계가 있기도 하고 더 경험이 많고 시야가 넓은 리뷰어로 부터의 리뷰가 절실했습니다. 호눅스 혼자 40명의 소스를 리뷰해야해서, 저에게 온 피드백은 간단했습니다. 하지만 나머지 동료들은 어떤 소스를 작성했고, 어떤 피드백을 받았는지 살펴보며 많은 도움을 얻었습니다. Upstream을 Origin으로 옮기며 그렇게 코드리뷰 및 RP 승인을 받고, 이제 Upstream에 있는 merge된 내 브랜치를 Origin 으로 옮겨오고, PR 이후의 .. 2022. 2. 16.
[TIL] 코드스쿼드 2022 백엔드 26일차 회고(6주차) Weekly I Learned → Today I Learned 오늘부터 WIL이 아니라 TIL을 쓰기로 했습니다. 이유는 다음과 같은데요. 주 단위로 쓰려고 하니, 해당 날짜의 생각이 제대로 기록되지 않음. 매일 쓰지 않고, 주말에 몰아서 쓰게됨. 주말에 휴식 및 밀린 일들을 하다가 회고를 늦게 쓰게됨 회고를 하는 이유는 내가 잘한것을 지속하고, 못한것을 개선하기 위해서 라고 생각하는데 어느새 회고를 숙제처럼 하고있는 자신을 발견하게 되었습니다. 그래서 앞으로는 매일 조금씩 시간을 할당하여 회고에 투자하려고 합니다. 오늘은 무슨 일이? 코드스쿼드 마스터즈코스 백엔드 Java 클래스가 시작되는 첫날 이었습니다. 생각보다 단순한 미션이 주어졌는데, 호눅스가 학습내용을 정리할 여유를 가질 수 있게 배려해준 것.. 2022. 2. 15.
Java char과 String의 차이 (feat. Constant Pool) Java char과 String의 차이 (feat. Constant Pool) char과 String 간단 정리표 - char String 타입 Primitive Reference 저장위치 Stack Stack + Heap 초기값 타입에 따른 초기값 제공 null char char은 Primitive-type입니다. Primitive-type 변수는 Stack Frame에 저장되며, call-by-value라는 특징이 있는데요. call-by-value를 간단한 예제 코드로 알아보겠습니다. class CallByValueTest { public static void main(String[] args) { // stack의 charA변수 영역에 'A' 저장됨 char charA = '.. 2022. 2. 15.
운영체제 개요 이 글은 운영체제(2017) - (반효경 교수님) 강의를 보고 작성한 글 입니다. 혹시 잘못된 내용이 있을 경우 편하게 댓글로 알려주시면 감사하겠습니다! 운영체제(Operating System, OS) 란? 컴퓨터와 하드웨어 바로 위에 설치되어, 사용자 및 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층 운영체제의 목적 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공 - 동시 사용자/프로그램들이 각각 독자적 컴퓨터를 사용하는 것 처럼 논리적으로 자원을 분리함 - 하드웨어를 다루는 복잡한 작업을 운영체제가 처리 컴퓨터 자원을 효율적으로 관리 CPU, 메모리, I/O 장치를 효율적으로 관리함 주어진 자원으로 최대한의 성능을 내도록 → 효율성 특정 사용자/프로그램이 자원을 독점하지 않도록 관리 → .. 2022. 2. 8.
클린코드 1장, 2장 정리 1장. 깨끗한 코드 나쁜코드는 회사를 망하게할 수도 있다. 프로젝트 재설계는 꿈일 뿐이다. (차세대 프로젝트는 너무 너무 힘든 일이다.) 나쁜 코드의 원인을 밖에서 찾지 말고, 나에게서 찾자. (프로그래머는 좋은 코드를 사수해야하는 책임이 있다.) 기한을 맞추려고 어쩔수 없이 나쁜 코드를 작성한다고 합리화 하지 말자. (사실, 나쁜 코드에 발목이 잡혀 일정은 더 늦어지는 경우가 많다.) 좋은 코드를 작성하려면, 좋은 코드가 무엇인지 반드시 알아야 한다. 유명인들이 말한 깨끗한 코드란? 비야네 스트롭스트룹(C++ 창시자) 논리가 간단해야 버그가 숨어들지 못한다 의존성을 최대한 줄여야 유지보수가 쉽다 오류는 명백한 전략에 의거하여 철저히 처리한다 나쁜 코드는 나쁜 코드를 유혹 한다(깨진 유리창 이론) 깨끗한.. 2022. 2. 3.
[WIL] 코드스쿼드 2022 백엔드 4주차 회고(2022.01.24~28) 이번주엔 무슨일이? 01.24 월 - 구현에 너무 매몰되지 말자 CS과정 4주차에 돌입했는데, 그 동안 피로도 쌓이고 긴장감도 조금 풀린 느낌이 있었습니다. 그래서 집중이 잠시 안되었는데, 공부하고 빨리 구현해보자는 생각에 집중할 수 있었습니다. 이전에는 느끼지 못했는데, 미션들을 진행하면서 저는 코드를 작성하는것을 좋아한다고 느끼게 되었는데요. 그런데 문제는 코드를 빨리 작성하고 싶어서, 학습을 덜한 상태로 구현을 시작하는일들이 자주 있었습니다. 그래서 이번 미션부터는 공부화 구현의 밸런스를 맞추면서 진행하자고 다짐했습니다. 이번 미션은 운영체제의 프로세스와 스레드 관리방식이었는데, 운영체제 강의중 가장 유명한 반효경 교수님의 강의를 듣고 내용을 정리해본 다음 미션에 돌입했습니다. 01.25 화 - 학.. 2022. 1. 31.
[WIL] 코드스쿼드 2022 백엔드 3주차 회고(2022.01.17~21) 이번주엔 무슨일이? 01.17 월 : 메모리 모델..😵 이번 주는 케이,선을로,Shine,Meenzino,부카,Lucid,Dave,donggi,Hanse와 함께하게 되었습니다. 메모리 모델을 구현하는 미션이었는데, 그동안 기본적인 내용에 대한 공부에 소홀했던 제 자신을 반성하게 되었습니다. 운영체제에서 메모리를 어떻게 관리하고, CPU는 어떻게 물리적인 메모리에 접근하는지 공부하게된 유익한 시간을 보냈습니다. 01.18 화 : 과연 이해했나?🧐 스스로 메모리 모델에 대해 어느 정도 이해를 했다고 생각하고 생각하고 미션 구현에 착수했습니다. 하지만, 구현은 또 다른 문제였고 이를 어떤 구조로 해결해야할지 감이 잡히지 않았습니다. 그렇게 삽질만 하고 있다가, JK가 강의에서 메모리 관리 방식이 발전해온 과정.. 2022. 1. 24.
JVM과 Garbage Collector JVM의 구조 클래스 로더 런타임에 클래스 파일에서 바이트코드를 읽어 메모리에 저장합니다. 로딩 : 클래스를 읽어오는 과정 링크 : 참조 포인터를 연결하는 과정 초기화 : static 자원들을 초기화하고 변수에 할당합니다. 런타임 데이터 영역 Method Area, Heap, Stack, PC Register, Native Method Stack Method Area : 모든 스레드가 공유하는 영역으로, 클래스들의 정보 및 바이트 코드들을 저장합니다. Heap : 런타임에 동적으로 할당되는 영역으로, instance들이 주로 저장됩니다. Thread : 각 스레드는 아래 3개의 영역을 각자 가지게 됩니다. Stack : 스택프레임이 저장되는 공간으로, 지역변수, 메소드 매개변수, 메소드 정보 등이 저장됩.. 2022. 1. 24.
CPU와 메모리 관리 컴퓨터에서 일어나는 거의 모든 연산은 중앙처리장치(CPU)가 수행합니다. 중앙처리장치가 연산을 하기 위해서는 데이터가 필요한데, 그 데이터는 중앙처리장치의 레지스터에 저장됩니다. 하지만 레지스터는 크기가 매우 작아서, 연산에 필요한 모두 데이터를 저장할 수는 없는데요. 그래서 메모리에 연산에 필요한 대부분의 데이터를 저장해 놓고, 당장 연산할 데이터만 레지스터 불러와 연산합니다. 위 글에서 설명하지 않은, 그림의 나머지 부분은 아래에서 조금 더 상세히 알아봅시다. 가상 메모리 CPU는 실제 메모리의 물리 주소 대신, 프로세스 내부에서만 사용하는 논리 주소를 사용합니다. 그리고 모든 프로세스는 실제 물리 주소를 찾을 수 있도록 메모리를 할당 받으면서, 프로세스의 시작 물리 주소인 기본 주소(base add.. 2022. 1. 19.
[WIL] 코드스쿼드 2022 백엔드 2주차 회고(2022.01.10~14) 이번주엔 무슨일이? 01.10 월 : 새로운 사람들👋 이번 주는 Hanse, sally, 반스, 노리, 땃쥐, Jerry, donggi, Sammy, Nathan과 함께 합니다! 반갑게도 노리와 이번주도 같이하게 되었습니다.😁 스크럼 때, Jerry가 제 마스터즈코스 sokoban 코드가 인상깊었다고 칭찬을 해주셔서 쑥스럽고 정말 고마웠네요😊 그렇게 나머지 시간동안은 가볍게 인사를 나누고, 본격적으로 미션을 시작했습니다. 특정 자료구조를 구현하는 미션이었는데, JK가 정리해준 문서를 정독하고 바로 미션 구현에 돌입했는데요. 이번 미션에서는 특정 기능에 Java8의 최신 기능(stream, consumer) 를 사용해보는 연습도 했습니다. 다 작성하고 나서, 사실 스스로는 만족했지만 제가 잘못 하고있는 것.. 2022. 1. 17.
배열과 연결리스트 배열 배열은 메모리에 지정된 만큼의 연속된 저장 공간을 선점하여 사용하는 저장 방식입니다. int[] grade = new grade {85, 65, 90}; 그림 처럼, 변수는 배열의 시작 주소를 가리키고있고, int배열이기 때문에 4Byte씩 공간을 차지하고 있습니다. 순서대로 저장되어 있기 때문에, 특정 위치의 데이터를 찾는데 1번의 연산이면 됩니다. 1번째의 데이터를 찾고 싶다면 0x10번지에서 4Byte만큼 읽음 2번째의 데이터를 찾고 싶다면 0x10번지 + 1 * 4(int 크기) = 0x14번지로 이동하여, 4Byte만큼 읽음 3번째의 데이터를 찾고 싶다면 0x10번지 + 2 * 4(int 크기) = 0x18번지로 이동하여, 4Byte만큼 읽음 이 처럼 원하는 데이터로 접근 하는데 1번의 연.. 2022. 1. 16.
Big-O 표기법과 복잡도 Big-0 표기법 빅오 표기법은 수리과학 분야에서 특정 함수의 증감 추세를 비교하는 표기법으로, 아래와 같은 형식으로 복잡도를 표현합니다. O(n), O(n log n) 이 표기법은 알고르즘의 성능을 평가하는데도 자주 사용됩니다. 알고리즘의 성능은 시간복잡도와 공간복잡도를 기준으로 효율적인지 비효율적인지 평가합니다. 시간복잡도 시간복잡도는 간단히 말해서, 연산 횟수라고 볼 수 있습니다. 위는 여러 알고리즘의 시간복잡도를 빅오 표기법으로 표현하여 복잡도가 증가하는 속도를 비교한 그래프 입니다. 가로축은 확인해야할 경우의 수(Elements), 세로축은 연산 횟수(Operations)인데요. 확인해야할 경우의 수를 n이라고 가정했을때, 각 알고리즘별 복잡도 증가 횟수를 알 수 있습니다. 가장 최악의 복잡도를.. 2022. 1. 16.
Java에서의 동시성 제어 동시성 제어가 필요한 이유 서비스에 과도한 트래픽이 몰릴 경우, 서버가 예상한 대로 동작하지 않는 경우가 있습니다. 인프라에서 문제가 발생할 수도 있고, 코드에서 문제가 발생할 수도 있습니다. 인프라의 경우 AWS나 GCP같은 클라우드 서비스를 통하여 유동적으로 대처 가능하지만, 이미 서버에 배포된 코드는 유동적으로 대처하는것이 거의 불가능 하죠. 그래서 개발자는 항상 과도한 트래픽이 몰릴 경우를 미리 대비해야 합니다. 그럼, 아래에서 Java에서 동시성 제어를 위해 추가된 기능들에 대해 알아보겠습니다. 동시성 제어 public class Main { public static void main(String[] args) { CountInteger count = new CountInteger(); for .. 2022. 1. 11.
반응형