Article 29

개인 프로젝트로 학습하는 방법

도메인 지식 학습과, 기술 학습을 동시에 하지 마라.학습은 항상 최소 단위로욕심부리면, 흐지부지된다.명확한 목표 설정의 난이도가 매우 올라간다.진도를 잡기 어려워진다.도메인 학습도메인 학습이란?쇼핑몰 도메인을 배워볼까?결제 도메인을 배워볼까?지도 도메인을 배워볼까?무조건 익숙한 기술로런칭하고 보강하고 조금씩 진화시키기무조건 인프라까지 배포하기인스턴스 2대 이상으로소프트웨어 설계정도는 해도 됨모듈링멀티모듈싱글모듈소프트웨어 아키텍처헥사고날클린레이어드코드 작성 규칙JPA 엔티티 도메인으로 사용JPA 엔티티 숨기기무조건 익숙한 기술로 시작하기.차근차근 리팩토링하는 형태로 학습기술 학습하나의 싱글 모듈 안에 다 때려박기웹플럭스카프카레디스NoSQL웹소켓배포는 굳이? git repo에 올려두는 정도만여담굳이 단위테스..

기본적인 문제 해결 방법

기본적인 문제 해결 접근 방법넘버링 되어있지만, 순서는 없다.순서대로 접근하진 않아도 되지만, 위에서 아래로 접근하는 것이 좋긴 하다.상위 단계가 충분히 되어있지 않다면, 언제든 다시 위로 올라가는 것이 좋다.하지만, 이 다섯가지가 정교하게 되어있어야, 흔들림 없고 견고한 결과물이 완성된다.그렇다고 하더라도, 외부 요구사항이 “견고한 결과물” 보다, “돌아가는 결과물”을 원한다면, 이에 맞출 수 있는 것도 능력이다.모든 것에는 트레이드오프가 있다. 현재 상황에 알아서 잘 판단하자.접근 방법문제 정의문제 분석도구 선택구현평가지금부터, 각각이 무엇을 의미하는지 설명하도록 하겠다.문제 정의현재 주어진 요구사항이 무엇인지 파악하고, 문제에 맞는 종속변수 y, 상수 c, 독립변수 x를 명확히 정의하라!다음과 같은..

책 읽는 방법

오랜만에 독서를 통해 새로운 개념을 학습하려고 하니, 어떻게 접근하고 학습하였는지 기억도 잘 안나고, 체계가 잡혀있지 않은 상태로 읽게되는 것 같다.이 문제를 해결? 하기 위해, 가볍게 "책 읽는 방법" 이라는 주제로 생각을 정리한 글을 게시한다.1. 목차 읽기알려주는 내용 파악: 목차를 먼저 읽어 책이 전달하려는 핵심 메시지와 다루는 주제를 명확히 한다.주제 분석: 각 목차 항목을 통해 책의 전반적인 내용과 범위를 이해한다.예상 결과 도출: 목차를 기반으로 책을 읽으면서 얻을 수 있는 인사이트나 배움의 방향을 미리 예측한다.2. 용어 추출핵심 단어 강조: 책을 처음 읽을 때 주요 개념이나 용어에 형광펜을 사용해 강조한다.부제 작성하기: 각 문단별 부제를 작성함으로써, 해당 문단이 설명하고자 하는 개념과..

Java 의 주요 자료구조 - ArrayList & Hash Map

ArrayList의 동작 방식ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하며, 그 작동 원리는 다음과 같다.내부 배열 관리데이터를 순차적으로 저장하는 배열을 사용한다.배열은 일정한 용량(Capacity)을 가지며, 초기 용량은 지정할 수 있다.용량 확장 방식add 연산 시 남은 공간이 없으면, 현재 용량의 50%를 추가하여 새로운 배열을 생성한다.이 과정에서 기존 배열의 내용을 arraycopy 메서드를 사용하여 새로운 배열로 복사한다.용량 확장 시 복사로 인한 성능 오버헤드가 발생하지만, 대부분의 삽입 연산은 평균적으로 O(1)의 시간 복잡도를 유지한다.참고로, C++의 vector는 용량을 두 배로 늘리는 방식으로 확장하는 점에서 차이가 있다.해시테이블의 작동 원리 및 충돌 해결 방법..

Article 2025.03.09

객체지향 기초 - SOLID 원칙

개인적으로 SOLID 는 객체지향의 "기초" 라고 하기엔 너무 어렵다고 생각하지만, SOLID를 통해 객체지향 학습을 시작하는 사례가 많으니, SOLID를 이해하기 위한 흐름을 잡아 설명하도록 하겠다.1. 객체지향 프로그래밍의 기본 특성객체지향 프로그래밍은 소프트웨어 설계와 구현에 있어 효율성과 유지보수성을 높이기 위한 패러다임이다. 대표적인 네 가지 특성은 캡슐화, 상속, 다형성, 추상화이며, 각각 다음과 같이 설명할 수 있다.1.1 캡슐화캡슐화는 데이터(필드)와 그 데이터를 처리하는 메서드를 하나의 객체로 묶어, 외부에서 불필요하거나 민감한 정보에 직접 접근하지 못하도록 제한하는 개념이다. 이를 통해 객체 내부의 상태를 보호하고, 변경의 영향을 최소화할 수 있다. 1.2 상속상속은 기존의 클래스를 기..

데이터 일관성 문제 회고

팀 프로젝트 일정 관리에서의 데이터 일관성 유지 회고프로젝트를 진행하면서 겪은 가장 큰 도전 중 하나는 팀 프로젝트 기간과 개별 일정 간의 일관성 문제였습니다. 우리 서비스는 단순 피드백을 넘어서 대학생들이 팀 내에서 자유롭게 일정과 할 일을 관리하며 능동적으로 소통할 수 있도록 설계되었는데요, 그만큼 비즈니스 로직에 따른 세밀한 제약 조건을 고려해야 했습니다.문제 발견 계기한 팀에, 같은 시작 시간을 갖는 일정은 존재하지 않아야 한다는 요구사항이 존재했습니다.프로젝트의 동시성 문제 검토 기간에, 검증 과정을 시뮬레이션하는 중, 이 검증을 WAS에서는 진행할 수 없고, 반드시 DB 레벨 검증이 필요하고, 이것이 “Unique 제약 조건”의 핵심 기능이라는 사실을 학습하였습니다.그런데, 팀 정보 수정/일정..

[네트워크] 소켓 통신의 기본

글의 목적개발자가 일반적으로 사용하는 모든 TCP 네트워크 통신의 "API"인 소켓 통신의 기본 동작 원리를 이해함으로써, 추상화되어 잊기 쉬운 전송계층의 동작 원리를 "알아야 하는 부분까지" low Level 로 이해하기 위함이다.Top-Down 으로 접근하기에, 추후 전송 계층의 TCP 와 네트워크 계층의 IP까지 다룰 예정이다.서버(Server) & 클라이언트(Client) 모델우리가 컴퓨터에서 흔히 접하는 "클라이언트 & 서버" 라는 단어는 엄청 있어보이지만, 사실 실세계에서 매우 흔히 볼 수 있는 형태의 모델을 추상화해둔 패턴이다.클라이언트(Client)클라이언트는 서비스를 요청하는 쪽이다. 마치 식당에서 음식을 주문하는 손님처럼, 클라이언트는 어떤 정보를 얻거나 작업을 처리해달라고 요청하는 역..

[Test] LocalDateTime 을 사용하는 함수의 테스팅 방법

LocalDateTime 을 사용하는 함수는 어떻게 테스팅 해야하지?테스트 코드를 작성하는 도중, LocalDateTime 에 따라 기능이 달라지는 함수를 테스팅할 필요성을 느끼게 됐다.근데 LocalDateTime.now()를 사용하게 되면, 테스트가 현재 시간에 따라 테스트 결과가 달라지는 상태가 되고, 이는 테스트는 반복가능해야 한다라는 테스트 규칙을 위반하게 된다.가장 단순한 해결책은 LocalDateTime을 Mocking 하는 것이겠지만, 이는 권장되지 않는 방법이다.@Mock 어노테이션은 매 테스트마다 새로 초기화되기 때문에, 반복가능한 테스트 문제에 대한 걱정이 없지만,LocalDateTime 은 static 메소드라 메소드 영역에 존재하고, 다음 테스트에서 여전히 그 모킹이 유지되어 있을..

[OS] Thread의 정의와 Thread Pool, 그리고 적절한 Thread의 갯수

글의 목적우리가 컴퓨터를 살때, CPU가 8코어 16스레드라고 하는 수치를 보고, 오... 16개의 스레드까지 병렬 프로그래밍이 가능하구나... 라는 생각을 하게 된다.근데 운영체제에서 마주치는 "스레드"라는 단어는 위 내용과는 사뭇 다른 느낌으로 정의된 단어라는 느낌이 강렬하게 들게 된다.또한, 스레드 풀에서의 스레드와도 비슷한 개념이면서 미묘하게 다른 점을 갖고 있고, 이게 혼동되기 쉽다고 생각한다.따라서, 이를 체계적으로 정리하고자, 해당 글을 작성한다.CPU 에 존재하는 스레드는 무엇인가?해당 스레드라는 단어는, 원래 정식 명칭이 아니다.과거에 이 "스레드"는, Simultaneous Multi-Threading 이라는 기법으로 불렸으나, 인텔(Intel) 의 상술로 "하이퍼스레딩" 이라는 상표명..