분류 전체보기 150

[Gradle] build.gradle, 그리고 settings.gradle

본 글은 멀티모듈 빌드와 관련된 gradle의 핵심 기능을 다룹니다.단순 라이브러리 의존용으로 사용하는 걸 넘어, 직접 모듈을 만드는데 필요한 기본 지식을 다루니, 관심있다면 docs를 직접 읽어보시는것도 추천드립니다.주요 주제gradle의 디렉토리 구조Project Root Directory멀티 모듈의 구조Gradle의 빌드 라이프사이클settings.gradlebuild.gradleGradle의 프로젝트 루트 디렉토리gradle은 다음 두가지 디렉토리를 사용한다.Gradle User Home DirectoryProject Root DirectoryGradle User Home DirectoryGradle의 글로벌 설정, 초기화 스크립트, 캐시 및 로그 파일이 저장된 디렉토리이다.자세한 내용은 해당 문..

[Gradle] Gradle - 기본 구조 알아보기

우리는 스프링을 사용하면서 Gradle이라는 추상화 도구를 통해 간편하게 로컬에서 프로젝트를 띄워볼 수 있었다.하지만, Gradle이라는 도구에 대해서 깊게 이해하고, 응용할 수준이 되진 못했다.한번 Gradle에 대해 좀 더 깊게 이해하고, 오류 상황에서 대처할 수 있도록 기본 지식을 갖춰보자.Gradle이란?Gradle은 프로젝트 초기화 및 빌드 자동화 도구이다. 다시말해, 설정/외부 라이브러리 의존 관리를 간단하게 만들어주는 역할을 수행한다.우리가 IDE, Spring Boot initializer로 흔히 생성하는 스프링 프로젝트는 gradle과 같은 빌드 도구를 기반으로 생성되는 프로젝트이다.gradle init을 수행하면 gradle이 직접 만들어준 프로젝트를 실제로 확인해볼 수 있다.Gradl..

좋아하는 일 vs 잘하는 일 - 25년 5월 2주차 회고

“좋아하는 일”과 “잘하는 일”어렸을 때 자주 들었던 말.인터넷에도 이에 대한 다양한 이야기가 있다.워렌 버핏, 마윈, 제프 베이조스 등 다양한 사람들이 좋아하는 일을 하라, 잘하는 일을 하라라고 이야기를 남겼다.좋아하는 일을 해야 한다.좋아하는 일을 해야 오래할 수 있다.꾸준히 하다보면 언젠가는 잘할 수 있다.잘하는 일을 해야한다.자신이 패배하는 상황에 놓일 때의 불편함좋아하더라도, 자신이 지게 되는 상황에 놓일 때는자신을 원망하지 말고, 전장을 바꿔야 한다.성취에는 노력 뿐만 아니라, 재능도 필요하다.잘하는 사람은, 나보다 더 좋아한다는 의미이기도 하다.다른 사람보다 덜 노력한 것.이 상황에서, 자신의 “좋아함”이 다른사람에게 밀리는 상황을 상상해 보았는가?정말 “정량적”으로, 이 일을 내가 좋아하거..

개인적 공간 2025.05.10

[개발자를 위한 통계학 찍먹하기] 0편 - 동기

서론나는 그동안 포트폴리오에서 발견되는 성능 테스트에 대한 회의론을 갖고 있었다.정량적 데이터에 의한 동기만으로 성능 테스트가 수행된 경우, 어디서 본 듯한 이유와 어디서 본 듯한 개선, 짜맞춘 의도에 짜맞춘 개선밖에 볼 수 없었고, 정성적 데이터에 의한 동기만으로 성능 테스트를 수행한 경우, 트레이드오프를 고려하지 않은 단순한 오버엔지니어링으로밖에 보이지 않았다.따라서, 해당 성능 테스트에서 작성자들의 문제 해결 능력을 이해하기가 어려웠다.하지만, 아무것도 안하는 것보다는 낫다는 걸 나 스스로도 인정하고 있긴 했다.그래서, “할거면, 논리적으로 하자.” 라는 결론에 도달하게 되었다. 참고: 정량적 데이터 vs 정성적 데이터 정량적 VS 정성적 데이터 차이 파악하고 균형 있는 설문조사 실시하기정량적 데이..

[트랜잭션 완전정복] 2편 - 트랜잭션 고립 수준(트랜잭션 격리 수준, Transaction Isolation Level)

우리는 이전 글을 통해, 트랜잭션이 정확히 무엇인지와, 트랜잭션 과정에서 발생할 수 있는 문제들에 대해 이해할 수 있었다.이번 글에선, DB에서 정의하는 추상적인 개념인 Transaction Isolation Level에 대해 구체적으로 알아보도록 하자.이 글은 ACID에 대해 어느정도 개념이 잡혀있는 독자를 기준으로 작성되었다.주요 용어격리성직렬성스냅샷 격리충돌(Conflict)충돌 동등공유 잠금(Shared Lock)배타 잠금(Exclusive Lock)직렬화 가능(Serializable)반복가능한 읽기(Repeatable Read)커밋된 읽기(Read Committed)커밋되지 않은 읽기(Read Uncommitted)DB 트랜잭션 과정의 이해지금부터 해당 글에서 다루는 트랜잭션은 모두 DB 시스템..

[트랜잭션 완전정복] 1편 - 진정한 의미의 트랜잭션(Transaction)이란?

습관적으로 우리가 사용하는 DB 트랜잭션이라는 용어가 아닌, WAS가 작업하는 단위인 "트랜잭션" 그 자체의 정의와 동작 방식에 집중하여, 다양한 곳에 적용할 수 있는 기준을 가져보자.주요 용어비즈니스 트랜잭션시스템 트랜잭션충돌경쟁 상태락 경합데드락오프라인 트랜잭션트랜잭션(Transaction)이란?트랜잭션이란?클라이언트와 서버 간에, 요청을 주고 응답을 받는 하나의 작업의 단위를 정의한 것.주어진 요청에 대하여, 서버 내부의 상태를 변화시키거나, 적절한 응답을 반환하는 것을 목표로 한다.이를 "비즈니스 트랜잭션" 이라고 부르겠다.DB에서의 트랜잭션작업의 단위를 보장하려고 하니, 하나의 작업처럼 다루고, 이를 영속성 저장소에 저장할 필요가 있었다.하지만, 이 비즈니스 트랜잭션을 위한 인프라 로직을 매번 ..

SQL 쿼리의 동작 순서와 기본적인 동작 원리

SQL 문법의 동작 순서 외우는 법게토레이랮혼애ㅣfowghsdol각 문법의 첫글자를 딴 형태로 만든 암기 방식이다.실제 동작 순서는 다음과 같다.fromon(join)wheregroup byhavingselectdistinct, unionorder bylimit/offsetFrom쿼리의 작업 대상이 되는 기본 테이블을 결정한다.최초 쿼리가 동작할 테이블/뷰/파티션/서브쿼리가 정확히 어딘지를 결정한다.On(Join)조인 순서 최적화조인 알고리즘 선택별도의 글로 작성해야 함. 깊이가 깊음. (작성예정)WhereFROM/Join 절로 생성된 모든 행에 대해 필터링을 수행한다.인덱스를 사용 가능한 (sargable) 조건들에 대하여, 인덱스를 사용하여 탐색한다.집계함수를 사용할 수 없다.select 절에서 정의..

CS Repository/DB 2025.05.01

봉쇄/비봉쇄(Blocking/Non-Blocking), 동기/비동기(Sync/Async), 그리고 이벤트 드리븐 아키텍처

통신(파일 I/O, 네트워크I/O) 개념에서 비동기와 논블로킹 개념은 매우 혼동하기 쉬운 주제이다.네트워크를 정확히 모른다는 것은 장님이 코끼리 만지는 격이니, 이번기회에 제대로 정리하고 넘어가보자. 전제이 방식은 모두, 이 패턴을 따를 때 적용된다.호출자가 어떤 작업을 요청하고,처리자가 그 결과를 돌려준다.코드의 흐름이 동기/비동기인것은 문제에서 제외하고, 통신 개념에서의 동기/비동기에 집중해주길 바란다.코드의 흐름이 동기/비동기인 것과, 외부 서버와의 통신이 동기/비동기인 것은 문제가 발생하는 상황이 다르다.이 과정에서, 호출자의 대응 전략에 집중해보자.참고) 좌측 코드의 흐름은, 블로킹/논블로킹이 결정되지 않은 상태이다. get() 시 데이터가 준비되어 있다면 논블로킹처럼 동작할 것이고, 준비되지 ..

[Spring JdbcTemplate] JdbcTemplate을 이용한 게시글-댓글 게시판 기능 구현기

게시판 기능을 구현하며, 기술적으로 고민했던 사항들과 배웠던 것들이다.회원 정보 기능은 가장 간단하게, 랜덤 쿠키값을 부여해서 구분하면 할 수 있겠지만, 현재 프로젝트의 목적이 서비스는 아니므로 건너뛰겠다.학습을 목적으로, Comment를 독자적인 애그리거트가 아닌, Post의 Child Entity로 두었다.Child Entity vs. Value Object vs. DTO의 비교링크 참고JDBC를 사용하면서, child Entity를 생성/수정/삭제하는 방법링크 참고이벤트의 설계 방법링크 참고JPA도 아닌데, @Transactional을 굳이 필수로 붙여야 할까?단순 조회 로직에 대해선 @Transactional 없이 사용해보자.리포지토리 vs DAODAODB 접근만을 위한 객체저수준 DB API를 ..

도메인 이벤트 vs. 애플리케이션 이벤트. 그리고 이벤트의 설계 방법

이벤트는 일반적으로 비동기 작업 시 굉장히 유리함을 갖기 때문에 자주 사용하게 된다.도메인 이벤트와 애플리케이션 이벤트의 차이점에 대해 알아보자.주의) 이벤트의 정의는 발행자가 결정하는 것이고, 아래 설명은 모두 "발행자" 기준으로 된 설명이다.도메인 이벤트도메인 이벤트(Domain Event)란 비즈니스 관점의 이벤트를 의미한다.도메인 모델 내에서 “무엇이 실제로 발생했는지”를 표현하는데 집중하며, 도메인 언어를 사용하여 표현한다.주로 “주문이 생성되었다”, “새로운 손님이 입장했다”와 같은 방식으로, 비즈니스적 상황의 변화를 알리는데 집중한다.목적도메인 모델 간 결합도를 최소화하는데 사용한다.Event Sourcing 구현 시 상태를 복원할 수 있는 근거를 제공하는데 사용한다.비즈니스 규칙 변경에 따..