Article - 깊게 탐구하기 44

[모-던한 프로그래밍] 람다/스트림/Optional, 지연 평가와 flatMap

본 글은 스트림에 어느정도 익숙한 사용자를 대상으로 작성된 게시글로, IDE를 통해 어찌저찌 사용하는 수준의 개발자를 대상으로 작성된 게시글입니다.IDE가 추천해주는 기능을 넘어서, 능동적으로 스트림을 사용하기 위한 기본 동작 구조를 살펴봅시다.목차스트림(Stream)이란?람다 vs 익명 클래스스트림의 Lazy Operationmap vs flatMapOptional기본형 특화 람다/스트림그 외 주요 기능스트림(Stream)이란?스트림의 정의데이터의 흐름을 추상화해서 다루는 도구로, 컬렉션 또는 배열 등의 요소들을 연산 파이프라인을 통해 연속적인 형태로 처리할 수 있게 해줍니다. 이때, 연산들의 체이닝을 적극 활용합니다. 파이프라인 (컴퓨팅) - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과..

[객체지향 패러다임] OOD와 GRASP 패턴, 웹 개발에서의 객체지향 적용

이 게시글을 검색해서 탐색했다는 것은, 객체지향 패러다임 중에서도 OOD와, 그 중간에 사용되는 GRASP 패턴의 목적에 대해 찾아보고자 했다고 가정한다.실제로 코드를 짜면서 쉽게 알게되는 부분을 제외하고, OOD(Object Oriented Design) 관점에서의 객체지향에 대해 설명하도록 하겠다.다소 추상적이고 이론적으로 들리지만, 그만큼 의식적이고 체계적으로 적용하게 되면 일관성 있는 코드가 나온다.웹 구현에서 객체지향적인 코드는 어떻게 나오는지에 대한 고찰을 담았다.권장하는 이전 글 - SOLID 원칙목차OOP(Object-Orientied Paradigm)이란?OOP에서 이야기하는 "책임"이 무엇인가?분석 - OOA설계 - OOD설계 - Interaction Diagram적절한 책임의 할당 -..

도메인 주도 설계(DDD)

사전 지식 - GRASP 패턴도메인 주도 설계(Domain-Driven Design) 란?도메인 주도 설계(Domain-Driven Design)는 소프트웨어의 핵심 비즈니스 도메인에 집중하여 복잡한 도메인 지식을 코드의 도메인 모델로 표현하고 발전시키는 설계 철학이다.DDD는 복잡한 비즈니스 로직을 도메인 모델(객체 모델)로 추상화함으로써 비즈니스에서 발생하는 현실과 코드 간의 간극을 줄인다. 이를 위해 도메인 전문가와 개발자는 공유하는 보편 언어(Ubiquitous Language)를 구축하여 요구사항 분석부터 설계, 구현까지 동일한 언어로 소통한다. 이 과정에서 모델은 지속적으로 정제되고 리팩토링되어, 요구사항의 의도를 코드에 정확히 반영하게 된다. DDD는 왜 사용하는가?전통적인 데이터 중심 설..

[SuperBoard] 댓글 수 조회 쿼리 최적화

요약게시판 기능을 실제로 서비스한다고 가정할 때, 댓글 수 표기 로직을 최적화 수행단순 group by + 집계함수 + limit/offset의 문제점 파악실행계획 분석최종 결정 - from 절 서브쿼리 + index커밋 및 수정 내역 PR - 링크 Board/feature/41 댓글 수 조회 최적화 by GoGradually · Pull Request #51 · GoGradually/SuperBoard관련 이슈 close #41 다음 링크를 참고해주세요. 댓글 수 조회 쿼리 최적화 Summary by CodeRabbit 신규 기능 MariaDB 데이터베이스 연결을 위한 드라이버가 추가되었습니다. 게시글 및 댓글 데이터를 위한github.com 서론기존에 구현해둔 게시판 기능을 좀 더 최적화해보기 위해,..

[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..

[트랜잭션 완전정복] 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에서의 트랜잭션작업의 단위를 보장하려고 하니, 하나의 작업처럼 다루고, 이를 영속성 저장소에 저장할 필요가 있었다.하지만, 이 비즈니스 트랜잭션을 위한 인프라 로직을 매번 ..

봉쇄/비봉쇄(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를 ..