티스토리

Go Gradually - Repository
검색하기

블로그 홈

Go Gradually - Repository

dev.go-gradually.me/m

나 자신에게, 나 스스로가 부끄럽지 않도록

구독자
0
방명록 방문하기
공지 GoGradually 의 Reposi⋯ 모두보기

주요 글 목록

  • [개발자를 위한 통계학 찍먹하기] 0편 - 동기 서론나는 그동안 포트폴리오에서 발견되는 성능 테스트에 대한 회의론을 갖고 있었다.정량적 데이터에 의한 동기만으로 성능 테스트가 수행된 경우, 어디서 본 듯한 이유와 어디서 본 듯한 개선, 짜맞춘 의도에 짜맞춘 개선밖에 볼 수 없었고, 정성적 데이터에 의한 동기만으로 성능 테스트를 수행한 경우, 트레이드오프를 고려하지 않은 단순한 오버엔지니어링으로밖에 보이지 않았다.따라서, 해당 성능 테스트에서 작성자들의 문제 해결 능력을 이해하기가 어려웠다.하지만, 아무것도 안하는 것보다는 낫다는 걸 나 스스로도 인정하고 있긴 했다.그래서, “할거면, 논리적으로 하자.” 라는 결론에 도달하게 되었다. 참고: 정량적 데이터 vs 정성적 데이터 정량적 VS 정성적 데이터 차이 파악하고 균형 있는 설문조사 실시하기정량적 데이.. 공감수 1 댓글수 0 2025. 5. 6.
  • [트랜잭션 완전정복] 2편 - 트랜잭션 고립 수준(트랜잭션 격리 수준, Transaction Isolation Level) 우리는 이전 글을 통해, 트랜잭션이 정확히 무엇인지와, 트랜잭션 과정에서 발생할 수 있는 문제들에 대해 이해할 수 있었다.이번 글에선, DB에서 정의하는 추상적인 개념인 Transaction Isolation Level에 대해 구체적으로 알아보도록 하자.이 글은 ACID에 대해 어느정도 개념이 잡혀있는 독자를 기준으로 작성되었다.(다음 편에 ACID에 대해 좀 더 자세히 다룰 예정이다.)주요 용어격리성직렬성스냅샷 격리충돌(Conflict)충돌 동등공유 잠금(Shared Lock)배타 잠금(Exclusive Lock)직렬화 가능(Serializable)반복가능한 읽기(Repeatable Read)커밋된 읽기(Read Committed)커밋되지 않은 읽기(Read Uncommitted)DB 트랜잭션 과정의 .. 공감수 0 댓글수 0 2025. 5. 4.
  • [트랜잭션 완전정복] 1편 - 진정한 의미의 트랜잭션(Transaction)이란? 습관적으로 우리가 사용하는 DB 트랜잭션이라는 용어가 아닌, WAS가 작업하는 단위인 "트랜잭션" 그 자체의 정의와 동작 방식에 집중하여, 다양한 곳에 적용할 수 있는 기준을 가져보자.주요 용어비즈니스 트랜잭션시스템 트랜잭션충돌경쟁 상태락 경합데드락오프라인 트랜잭션트랜잭션(Transaction)이란?트랜잭션이란?클라이언트와 서버 간에, 요청을 주고 응답을 받는 하나의 작업의 단위를 정의한 것.주어진 요청에 대하여, 서버 내부의 상태를 변화시키거나, 적절한 응답을 반환하는 것을 목표로 한다.이를 "비즈니스 트랜잭션" 이라고 부르겠다.DB에서의 트랜잭션작업의 단위를 보장하려고 하니, 하나의 작업처럼 다루고, 이를 영속성 저장소에 저장할 필요가 있었다.하지만, 이 비즈니스 트랜잭션을 위한 인프라 로직을 매번 .. 공감수 0 댓글수 0 2025. 5. 3.
  • 봉쇄/비봉쇄(Blocking/Non-Blocking), 동기/비동기(Sync/Async), 그리고 이벤트 드리븐 아키텍처 통신(파일 I/O, 네트워크I/O) 개념에서 비동기와 논블로킹 개념은 매우 혼동하기 쉬운 주제이다.네트워크를 정확히 모른다는 것은 장님이 코끼리 만지는 격이니, 이번기회에 제대로 정리하고 넘어가보자. 전제이 방식은 모두, 이 패턴을 따를 때 적용된다.호출자가 어떤 작업을 요청하고,처리자가 그 결과를 돌려준다.코드의 흐름이 동기/비동기인것은 문제에서 제외하고, 통신 개념에서의 동기/비동기에 집중해주길 바란다.코드의 흐름이 동기/비동기인 것과, 외부 서버와의 통신이 동기/비동기인 것은 문제가 발생하는 상황이 다르다.이 과정에서, 호출자의 대응 전략에 집중해보자.참고) 좌측 코드의 흐름은, 블로킹/논블로킹이 결정되지 않은 상태이다. get() 시 데이터가 준비되어 있다면 논블로킹처럼 동작할 것이고, 준비되지 .. 공감수 1 댓글수 0 2025. 4. 30.
  • [Spring JdbcTemplate] JdbcTemplate을 이용한 게시글-댓글 게시판 기능 구현기 회원 정보 기능은 가장 간단하게, 랜덤 쿠키값을 부여해서 구분하면 할 수 있겠지만, 현재 프로젝트의 목적이 서비스는 아니므로 건너뛰겠다.학습을 목적으로, Comment를 독자적인 애그리거트가 아닌, Post의 Child Entity로 두었다.Child Entity vs. Value Object vs. DTO의 비교링크 참고JDBC를 사용하면서, child Entity를 생성/수정/삭제하는 방법링크 참고이벤트의 설계 방법링크 참고JPA도 아닌데, @Transactional을 굳이 필수로 붙여야 할까?단순 조회 로직에 대해선 @Transactional 없이 사용해보자.리포지토리 vs DAODAODB 접근만을 위한 객체저수준 DB API를 구현한 객체.단순 DB 접근에 초점Repository애그리거트 전체를 .. 공감수 2 댓글수 0 2025. 4. 29.
  • 도메인 이벤트 vs. 애플리케이션 이벤트. 그리고 이벤트의 설계 방법 도메인 이벤트와 애플리케이션 이벤트의 차이점에 대해 알아보자.주의) 이벤트의 정의는 발행자가 결정하는 것이고, 아래 설명은 모두 "발행자" 기준으로 된 설명이다.도메인 이벤트도메인 이벤트(Domain Event)란 비즈니스 관점의 이벤트를 의미한다.도메인 모델 내에서 “무엇이 실제로 발생했는지”를 표현하는데 집중하며, 도메인 언어를 사용하여 표현한다.주로 “주문이 생성되었다”, “새로운 손님이 입장했다”와 같은 방식으로, 비즈니스적 상황의 변화를 알리는데 집중한다.목적도메인 모델 간 결합도를 최소화하는데 사용한다.Event Sourcing 구현 시 상태를 복원할 수 있는 근거를 제공하는데 사용한다.비즈니스 규칙 변경에 따른 확장성 확보가 가능하다.애플리케이션 이벤트애플리케이션 이벤트(Application.. 공감수 0 댓글수 0 2025. 4. 28.
  • 패키지 구조 선택 방법 여태까지 수많은 강의와 책을 봤지만, 이런 내용은 기본적이라고 취급하는지 뚜렷한 기준을 찾기 어려웠다.따라서 직접 정리해보았다.패키지의 구성요소 분류설명하기 전에, 다음 세가지 요소를 설명하도록 하겠다.모듈비즈니스 도메인 내에서 정의하는 하나의 기능 단위를 의미한다.예시ordermemberproduct레이어아키텍쳐에서 추구하는 계층 구조를 의미한다.예시domain: 비즈니스 로직을 담당하는 레이어. 도메인 모델과 도메인 서비스, 도메인 이벤트가 여기 속한다.application: 비즈니스 로직을 이용한 UseCase 를 담당하는 레이어. 대표적으로 application service, QueryRepository 계열이 있다.interface: Use Case를 직접 호출하는 레이어. 대표적으로 job .. 공감수 0 댓글수 0 2025. 4. 27.
  • DDD - JDBC에서 Child Entity를 생성/수정/삭제하는 방법 사전 지식Child Entity란 무엇인가?도메인 모델 완전성과 도메인 모델 순수성JDBC로 Aggregate Root의 Repository를 설계하면서 도메인 모델 순수성을 지키려고 하다 보면, JDBC로는 도메인 모델 생성/수정/삭제 로직으로 영속성 데이터를 변경할 수 없다.우리가 JPA의 Dirty Checking 에 익숙해져있기에 눈치채지 못하지만, 일반적으로 도메인 모델이 수정되었다고 해당 사항이 즉시 반영되진 않는다.JPA는 (양방향+CascadeType.PERSIST+orphanRemoval = true의 경우) 리스트에 추가/삭제하는 것만으로 객체의 생성/삭제 로직을 자동으로 SQL 문으로 만들어 쿼리해준다.하지만, JDBC의 생성/삭제는 Dirty Checking을 통한 자동 쿼리 생성이.. 공감수 1 댓글수 0 2025. 4. 27.
  • [Spring JdbcTemplate] JdbcTemplate을 이용한 상품 관리 기능 구현기 상품 관리 기능을 구현하며, 기술적으로 고민했던 사항들과 배웠던 것들이다.h2 접속 시 주의할 점기본적으로 파일 db로 동작한다.파일로 바로 연결하는게 아닌 tcp 연결로 변경 해주자.단순하게 db를 확인할때는 상관 없지만, 결국 외부 프로그램에서 동시에 접속해야 하기 때문에 TCP 접속이 가능해야 한다.또한 파일에 직접 접근할 경우에는 lock이 걸려버리니, tcp로 연결하는게 좋다.코드 작성 방식, 아키텍처 설계 관점id에 대한 관리 관점id 값은 일반적으로 외부 시스템에 의해서 주입받는 것이 분산 환경을 위하여 선택하는 적절한 선택이다.그렇기 때문에, 인프라적 특성을 띄는 해당 id 값을 도메인 레이어 내에서는 알지 못하게 하고 싶은데,테스트 시에는 해당 id값이 필요한 경우가 많다.이럴 때, 어떤.. 공감수 1 댓글수 0 2025. 4. 26.
  • [Spring JdbcTemplate] Spring JdbcTemplate 연습기 Spring Data JDBC 를 사용해보기 전에, 기본적인 JDBC 문법이 기억이 잘 나지 않아, 가볍게 토이프로젝트로 몇가지 구현을 해보며 JDBC 문법에 적응해보려고 한다.해당 게시글은 주기적으로 수정될 예정이며, 해당 프로젝트의 방향을 관리하기 위해 작성되었다.목표는 다음과 같다.Spring Data JDBC 를 사용해보기 전에, 기본적인 JDBC 문법을 복습하기 위한 토이 프로젝트이다.1. 단일 테이블 상품 재고 관리 - 구현 완료README.mdCRUDJdbcTemplate 기본 문법 학습학습, 고민 내용2. 게시글-댓글 게시판 - 현재 구현 중README.md조인페이징기본적인 트랜잭션 처리애그리거트 루트에서 모든 연관 엔티티를 한꺼번에 가져오기 위한 방식 구현Coarse-Grained Loc.. 공감수 1 댓글수 0 2025. 4. 25.
  • HTTP/2.0 Stream Blocking & 흐름제어 HTTP/2.0의 흐름제어는 뭘까?흐름 제어는 전송계층(TCP)에서 수행하는 것 아닌가?한 스트림이 커넥션을 독차지하지 않도록, 연결에 대한 전체 스트림의 리소스 배분을 수행해야 한다.이것이 HTTP/2.0의 흐름제어이다. HTTP/2.0 흐름제어와 TCP 흐름제어의 차이점항목TCP 흐름 제어HTTP/2.0 흐름 제어보호 대상- 연결 전체 (TCP 수신 버퍼)- 스트림 별- 연결 전체제어 단위- 바이트 (시퀀스 번호)- 프레임 페이로드 (바이트)주요 목적- 수신 측의 소켓 버퍼가 넘치지 않도록 전송 속도 억제- 연결 안정성 유지- 멀티플렉싱되는 여러 스트림 간 자원 경쟁 완화- 특정 스트림 일시적 쓰로틀링/우선순위 조절윈도우 크기 표기- 16-bit Window Size 필드- WINDOW_UPDATE .. 공감수 0 댓글수 0 2025. 4. 24.
  • HTTP/2.0 - HTTP 멀티플렉싱, HoL Blocking, 그리고 HTTP/3.0의 등장 배경 HTTP/2.0의 등장 배경HTTP/1.1은 그 구현의 단순성과 명료함, 접근성으로 많은 사랑을 받아왔고, 받고 있다.하지만, 하나의 커넥션으로 여러 요청/응답을 처리하기 어렵고, 응답을 받아야만 그 다음 요청을 보낼 수 있는 것은 분명한 아쉬움으로 남아있었다.그리하여, 다양한 곳에서 속도를 개선하기 위한 다양한 방법의 연구가 진행되었다.최종적으로, 구글의 "SPDY" 가 HTTP/2.0의 표준으로 결정되었다.하나의 TCP 커넥션에 여러 요청을 동시에 보내, 레이턴시를 줄이는 것 - HTTP 멀티플렉싱RTT가 20ms인 경우, 12.34% 성능 개선 효과를 보았다.RTT가 80ms인 경우, 23.85% 성능 개선 효과를 보았다.RTT가 200ms인 경우, 26.79% 성능 개선 효과를 보았다.HTTP/2.. 공감수 0 댓글수 0 2025. 4. 23.
  • 스택과 힙, 힙의 단편화 최근 즐겨보는 유튜브 채널에서 재밌는 면접 질문을 보았다.웹 백엔드 개발자를 위한 주제는 아닌것 같긴 한데, 주제가 상당히 흥미롭고 재밌어서 작성해본다. GC에 대한 이해도를 높힐 수 있어 좋은 시간이었다.스택과 힙의 차이멀티스레딩 환경에서의 스택과 힙의 차이스택해당 스레드용메모리의 수명 파악 가능코드의 깊이로지나치게 깊은 스택은, 코드의 가독성을 떨어트린다.힙멀티스레드 환경에서의 전역변수 역할고수준 언어에서, 스택과 힙은 반드시 필요하다.메모리 단편화네이티브 메모리 할당의 문제점malloc은 느리다.시스템 콜이 필요함이는 nio의 native memory 할당에도 같이 적용된다.따라서, 메모리 할당과 해제에 신중해져야 한다.할당받은 native 메모리를, 직접 쪼개가며 재사용해야 할 수도 있다!메모리를.. 공감수 0 댓글수 0 2025. 4. 15.
  • 메모리 압축(Memory Compaction), 그리고 Garbage Collector 우리는 단편화 문제에서 메모리 압축이 필요한 이유를 알 수 있었다. 지금부터 메모리 압축에 대해서 알아보자.메모리 압축 방식가장 기본적이고 간단한 메모리 압축은 두가지 방식으로 나뉘어진다.Sliding살아있는 객체들을 전부 한쪽 끝으로 몰아넣는다.장점추가 메모리의 요구가 없다.단점전체 메모리가 크게 이동해야 하기 때문에, stop-the-world 시간이 길어진다.Copying Compaction동작 방식공간을 절반으로 나눈다.1회 압축시마다, 데이터를 반대쪽으로 이동시킨다.이를 압축마다 반복한다.장점구현이 단순하다.Bump Allocator 연산을 사용할 수 있기 때문에, Stop-the-world 시간이 빠르다.sizeof(object) 연산을 이용해 다음 빈 포인터를 O(1)만에 찾는다.메모리의 이.. 공감수 0 댓글수 0 2025. 4. 15.
  • 메모리 단편화와 페이징 메모리 단편화를 해결하는 방법, 페이징에 대해 알아보자.페이징페이징이란, 가상 메모리 공간의 메모리 관리 기법을 의미한다.페이징의 설계 방식메모리를 페이지 단위로 잘라서 사용한다.물리 메모리의 크기 단위를 프레임이라고 할 때, 가상 메모리를 위한 "페이지"라는 단위를 만들어하나의 페이지를 하나의 프레임과 1:1 크기로 매핑하는 것을 의미한다.프로세스는 자신이 할당받은 가상 주소 공간 내에서, 가상 메모리를 페이지 단위로 사용하게 된다.가상 주소 공간 관리 기법이다.페이징 자체에 가상 주소 공간 개념이 포함된다. 고정된 메모리 풀 할당 방식과 혼동하지 말자.페이징의 효과물리 메모리의 외부 단편화 문제를 해결한다.프로세스가 사용하는 메모리 계층과 할당되는 물리 메모리 계층을 분리한다.페이지의 크기가 줄어들수.. 공감수 0 댓글수 0 2025. 4. 14.
  • 메모리 할당 문제, 그리고 메모리 단편화 메모리 할당 전략현재 다음과 같이 메모리가 할당되어 있다고 가정하자.만약 여기서, 어떤 프로세스가 세 칸의 메모리에 대한 할당을 요청했을 때, OS는 해당 메모리를 위한 빈 공간을 어떻게 지정할 수 있을까?우리는 이 상황에서 3가지 전략 중 하나를 선택할 수 있다.지금부터 각각 어떠한 전략인지를 알아보자.First-fitBest-fitWorst-fitFirst-fit순서대로 순회하다가, 가장 먼저 만나는 할당가능한 빈 공간을 지정한다.운이 없으면, 전체 메모리를 전부 순회해야 한다.여기서는 가장 먼저 만나는 빈 공간인 4칸을 선택한다.Best-fit모든 메모리 블록 중에서, 요청된 크기를 수용할 수 있는 블록 중 가장 작은 블록을 선택한다.항상 전체 메모리를 전부 순회해야 한다.여기서는 필요한 크기와 정.. 공감수 0 댓글수 0 2025. 4. 14.
  • Java I/O vs Java NIO - 왜 NIO는 단일 버퍼 모델을 채택했을까? 글의 목적JAVA I/O 와 Java NIO는 목적 자체가 다르고, 상황에 맞게 써야 한다는데, “그럼 대체 뭐가 달라서, 어떤 기준으로 사용해야 하는가?”에 대한 탐구를 수행한 과정을 기록한다.Java NIO 버퍼 입출력 메소드 - flip, clear, compact기본 개념 - ByteBuffer 동작 방식쓰기 모드 (Writing mode)데이터를 버퍼에 쓸 때 사용한다.position: 현재 쓸 위치limit: 쓰기 가능한 최대 범위(일반적으로 버퍼의 capacity)로 설정된다.읽기 모드 (Reading mode)버퍼에 쓰여진 데이터를 읽어올 때 사용한다.position: 현재 읽을 위치limit: 읽기 가능한 최대 범위(일반적으로 write 모드때의 마지막 position)로 설정된다.쓰기→.. 공감수 1 댓글수 0 2025. 4. 12.
  • 도메인 이벤트와 State Machine 시스템 설계 - 강아지 키우기 의인화(Anthropomorphism)란?소프트웨어 객체를 능동적이고 자율적인 존재로 설계하는 원칙.객체를 마치 사람처럼 직접 행동하는 “자아를 가진 존재”로 다루는 것을 의미한다.- Rebecca Wirfs-Brock - 도메인 이벤트, 상태 머신, 이벤트 소싱, CQRS, 그리고 DDD(도메인 주도 설계)는 서로 유기적으로 결합되어 응집도 높은 설계를 만든다. 본 글에서는 강아지 키우기 예제를 통해 이러한 개념들을 이해해보고, 실제 구현 시 고려해야 할 디테일과 도전 과제들을 이야기하도록 하겠다.예제 - 강아지 키우기우리가 설계해야 할 소프트웨어 모델은, 단순 CRUD 를 넘어 좀 더 능동적으로 스스로 행동하는 객체를 만들어야 할 수 있다. 지금부터 “강아지” 라는 객체를 만들어, 소프트웨어로서 “강.. 공감수 1 댓글수 0 2025. 4. 5.
  • 도메인 서비스 - DDD의 적용, JPA 엔티티와의 비교 도메인 서비스란?서로 다른 애그리거트간, 협력을 중재하는 객체이다.보통 싱글톤으로, Pure Fabrication 형태를 띄며 정의된다.도메인 서비스의 개념 자체는 매우 단순하다.우리가 쉽게 만들어 쓰는, 애플리케이션 서비스와 별 차이가 없어 보인다도메인 서비스, 그럼 스프링 빈으로 사용해도 되나?가능하다.스프링의 빈(Bean) 관리 메커니즘을 활용하여 싱글톤 객체로 등록해두면 편리하게 재사용할 수 있다.다만 애플리케이션 레이어(서비스 레이어)와 명확히 구분할 필요가 있다.단순히 스프링 빈으로 등록했다고 해서 인프라 계층 로직을 무조건 포함해야 하는 것은 아니다.그럼 도메인 서비스가 스프링 컨테이너에 의해 생성되는데, 인프라 로직에 종속된거 아닌가?실제 인프라 로직은, 선언한 빈을 통해 바이트 코드로 구.. 공감수 0 댓글수 0 2025. 4. 3.
  • DDD 트릴레마 - 도메인 모델 완전성 vs 도메인 모델 순수성 다음 글은 블라디미르 코리코프의 DDD 트릴레마를 번역하고, 부족한 내용을 보충하여 작성한 글입니다.기초 지식 - 기능 요구사항 vs 비기능 요구사항기능 요구사항비즈니스 로직비기능 요구사항인프라 특성인프라 수준의 구현으로 해결해야 하는 요구사항성능, 품질, etc.DDD를 왜 쓰는가? → 소프트웨어 핵심에서 복잡성을 해결하는 것 DDD에는 흥미로운 트릴레마가 하나 존재한다.지금부터 예시를 통해 알아보도록 하자.예시: 사용자 관리 시스템사용자 도메인사용자 도메인의 컨트롤러이메일 검증 기능 구현 - 이메일 중복 체크지금부터 새로운 비즈니스 로직을 추가해보겠다. 이메일은 유일해야 하며, 사용자 이메일을 변경하기 전에 시스템은 새 이메일이 이미 사용 중인지 확인해야 한다고 해보자.도메인 모델의 순수성 챙기기위 .. 공감수 1 댓글수 0 2025. 4. 1.
  • 개인 프로젝트로 학습하는 방법 도메인 지식 학습과, 기술 학습을 동시에 하지 마라.학습은 항상 최소 단위로욕심부리면, 흐지부지된다.명확한 목표 설정의 난이도가 매우 올라간다.진도를 잡기 어려워진다.도메인 학습도메인 학습이란?쇼핑몰 도메인을 배워볼까?결제 도메인을 배워볼까?지도 도메인을 배워볼까?무조건 익숙한 기술로런칭하고 보강하고 조금씩 진화시키기무조건 인프라까지 배포하기인스턴스 2대 이상으로소프트웨어 설계정도는 해도 됨모듈링멀티모듈싱글모듈소프트웨어 아키텍처헥사고날클린레이어드코드 작성 규칙JPA 엔티티 도메인으로 사용JPA 엔티티 숨기기무조건 익숙한 기술로 시작하기.차근차근 리팩토링하는 형태로 학습기술 학습하나의 싱글 모듈 안에 다 때려박기웹플럭스카프카레디스NoSQL웹소켓배포는 굳이? git repo에 올려두는 정도만여담굳이 단위테스.. 공감수 0 댓글수 0 2025. 3. 31.
  • 기본적인 문제 해결 방법 기본적인 문제 해결 접근 방법넘버링 되어있지만, 순서는 없다.순서대로 접근하진 않아도 되지만, 위에서 아래로 접근하는 것이 좋긴 하다.상위 단계가 충분히 되어있지 않다면, 언제든 다시 위로 올라가는 것이 좋다.하지만, 이 다섯가지가 정교하게 되어있어야, 흔들림 없고 견고한 결과물이 완성된다.그렇다고 하더라도, 외부 요구사항이 “견고한 결과물” 보다, “돌아가는 결과물”을 원한다면, 이에 맞출 수 있는 것도 능력이다.모든 것에는 트레이드오프가 있다. 현재 상황에 알아서 잘 판단하자.접근 방법문제 정의문제 분석도구 선택구현평가지금부터, 각각이 무엇을 의미하는지 설명하도록 하겠다.문제 정의현재 주어진 요구사항이 무엇인지 파악하고, 문제에 맞는 종속변수 y, 상수 c, 독립변수 x를 명확히 정의하라!다음과 같은.. 공감수 0 댓글수 0 2025. 3. 28.
  • 책 읽는 방법 오랜만에 독서를 통해 새로운 개념을 학습하려고 하니, 어떻게 접근하고 학습하였는지 기억도 잘 안나고, 체계가 잡혀있지 않은 상태로 읽게되는 것 같다.이 문제를 해결? 하기 위해, 가볍게 "책 읽는 방법" 이라는 주제로 생각을 정리한 글을 게시한다.1. 목차 읽기알려주는 내용 파악: 목차를 먼저 읽어 책이 전달하려는 핵심 메시지와 다루는 주제를 명확히 한다.주제 분석: 각 목차 항목을 통해 책의 전반적인 내용과 범위를 이해한다.예상 결과 도출: 목차를 기반으로 책을 읽으면서 얻을 수 있는 인사이트나 배움의 방향을 미리 예측한다.2. 용어 추출핵심 단어 강조: 책을 처음 읽을 때 주요 개념이나 용어에 형광펜을 사용해 강조한다.부제 작성하기: 각 문단별 부제를 작성함으로써, 해당 문단이 설명하고자 하는 개념과.. 공감수 0 댓글수 0 2025. 3. 24.
  • Java 의 주요 자료구조 - ArrayList & Hash Map ArrayList의 동작 방식ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하며, 그 작동 원리는 다음과 같다.내부 배열 관리데이터를 순차적으로 저장하는 배열을 사용한다.배열은 일정한 용량(Capacity)을 가지며, 초기 용량은 지정할 수 있다.용량 확장 방식add 연산 시 남은 공간이 없으면, 현재 용량의 50%를 추가하여 새로운 배열을 생성한다.이 과정에서 기존 배열의 내용을 arraycopy 메서드를 사용하여 새로운 배열로 복사한다.용량 확장 시 복사로 인한 성능 오버헤드가 발생하지만, 대부분의 삽입 연산은 평균적으로 O(1)의 시간 복잡도를 유지한다.참고로, C++의 vector는 용량을 두 배로 늘리는 방식으로 확장하는 점에서 차이가 있다.해시테이블의 작동 원리 및 충돌 해결 방법.. 공감수 0 댓글수 0 2025. 3. 9.
  • 객체지향 기초 - SOLID 원칙 개인적으로 SOLID 는 객체지향의 "기초" 라고 하기엔 너무 어렵다고 생각하지만, SOLID를 통해 객체지향 학습을 시작하는 사례가 많으니, SOLID를 이해하기 위한 흐름을 잡아 설명하도록 하겠다.1. 객체지향 프로그래밍의 기본 특성객체지향 프로그래밍은 소프트웨어 설계와 구현에 있어 효율성과 유지보수성을 높이기 위한 패러다임이다. 대표적인 네 가지 특성은 캡슐화, 상속, 다형성, 추상화이며, 각각 다음과 같이 설명할 수 있다.1.1 캡슐화캡슐화는 데이터(필드)와 그 데이터를 처리하는 메서드를 하나의 객체로 묶어, 외부에서 불필요하거나 민감한 정보에 직접 접근하지 못하도록 제한하는 개념이다. 이를 통해 객체 내부의 상태를 보호하고, 변경의 영향을 최소화할 수 있다. 1.2 상속상속은 기존의 클래스를 기.. 공감수 0 댓글수 0 2025. 3. 7.
  • 데이터 일관성 문제 회고 팀 프로젝트 일정 관리에서의 데이터 일관성 유지 회고프로젝트를 진행하면서 겪은 가장 큰 도전 중 하나는 팀 프로젝트 기간과 개별 일정 간의 일관성 문제였습니다. 우리 서비스는 단순 피드백을 넘어서 대학생들이 팀 내에서 자유롭게 일정과 할 일을 관리하며 능동적으로 소통할 수 있도록 설계되었는데요, 그만큼 비즈니스 로직에 따른 세밀한 제약 조건을 고려해야 했습니다.문제 발견 계기한 팀에, 같은 시작 시간을 갖는 일정은 존재하지 않아야 한다는 요구사항이 존재했습니다.프로젝트의 동시성 문제 검토 기간에, 검증 과정을 시뮬레이션하는 중, 이 검증을 WAS에서는 진행할 수 없고, 반드시 DB 레벨 검증이 필요하고, 이것이 “Unique 제약 조건”의 핵심 기능이라는 사실을 학습하였습니다.그런데, 팀 정보 수정/일정.. 공감수 0 댓글수 0 2025. 3. 1.
  • [네트워크] 소켓 통신의 기본 글의 목적개발자가 일반적으로 사용하는 모든 TCP 네트워크 통신의 "API"인 소켓 통신의 기본 동작 원리를 이해함으로써, 추상화되어 잊기 쉬운 전송계층의 동작 원리를 "알아야 하는 부분까지" low Level 로 이해하기 위함이다.Top-Down 으로 접근하기에, 추후 전송 계층의 TCP 와 네트워크 계층의 IP까지 다룰 예정이다.서버(Server) & 클라이언트(Client) 모델우리가 컴퓨터에서 흔히 접하는 "클라이언트 & 서버" 라는 단어는 엄청 있어보이지만, 사실 실세계에서 매우 흔히 볼 수 있는 형태의 모델을 추상화해둔 패턴이다.클라이언트(Client)클라이언트는 서비스를 요청하는 쪽이다. 마치 식당에서 음식을 주문하는 손님처럼, 클라이언트는 어떤 정보를 얻거나 작업을 처리해달라고 요청하는 역.. 공감수 15 댓글수 0 2024. 11. 13.
  • [Test] LocalDateTime 을 사용하는 함수의 테스팅 방법 LocalDateTime 을 사용하는 함수는 어떻게 테스팅 해야하지?테스트 코드를 작성하는 도중, LocalDateTime 에 따라 기능이 달라지는 함수를 테스팅할 필요성을 느끼게 됐다.근데 LocalDateTime.now()를 사용하게 되면, 테스트가 현재 시간에 따라 테스트 결과가 달라지는 상태가 되고, 이는 테스트는 반복가능해야 한다라는 테스트 규칙을 위반하게 된다.가장 단순한 해결책은 LocalDateTime을 Mocking 하는 것이겠지만, 이는 권장되지 않는 방법이다.@Mock 어노테이션은 매 테스트마다 새로 초기화되기 때문에, 반복가능한 테스트 문제에 대한 걱정이 없지만,LocalDateTime 은 static 메소드라 메소드 영역에 존재하고, 다음 테스트에서 여전히 그 모킹이 유지되어 있을.. 공감수 0 댓글수 0 2024. 10. 13.
  • [OS] Thread의 정의와 Thread Pool, 그리고 적절한 Thread의 갯수 글의 목적우리가 컴퓨터를 살때, CPU가 8코어 16스레드라고 하는 수치를 보고, 오... 16개의 스레드까지 병렬 프로그래밍이 가능하구나... 라는 생각을 하게 된다.근데 운영체제에서 마주치는 "스레드"라는 단어는 위 내용과는 사뭇 다른 느낌으로 정의된 단어라는 느낌이 강렬하게 들게 된다.또한, 스레드 풀에서의 스레드와도 비슷한 개념이면서 미묘하게 다른 점을 갖고 있고, 이게 혼동되기 쉽다고 생각한다.따라서, 이를 체계적으로 정리하고자, 해당 글을 작성한다.CPU 에 존재하는 스레드는 무엇인가?해당 스레드라는 단어는, 원래 정식 명칭이 아니다.과거에 이 "스레드"는, Simultaneous Multi-Threading 이라는 기법으로 불렸으나, 인텔(Intel) 의 상술로 "하이퍼스레딩" 이라는 상표명.. 공감수 9 댓글수 0 2024. 9. 29.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.