Tag:

테스트 컨테이너로 통합 테스트 환경 구축하기

이번에 회사 조직에서 통합 테스트를 위한 환경을 구축하는 과정에서 테스트 컨테이너를 도입하게 되면서, 그 과정을 정리하고자 한다. 그 전에 왜 통합 테스트 환경으로 테스트 컨테이너를 채택하게 되었는지 배경은 다음과 같다. 왜 테스트 컨테이너를 채택했나? H2 인메모리 DB 고려 처음 통합 테스트 환경을 H2를 활용해 구축...

Spring Boot 특정 클래스만 Bean 등록하기 (feat. @SpringBootTest classes 속성)

Spring Boot 특정 클래스만 Bean 등록하기 feat. @SpringBootTest의 classes 속성 개요 회사에서 통합테스트 환경을 구축하는 과정에서 통합테스트 작성 시 선언해줘야 하는 어노테이션의 재사용성을 위해 하나의 커스텀 어노테이션을 생성하여 관리하고자 했다. 여기서 회사 프로젝트의 특성 상 테스트 환경...

옵시디언 데일리 투두리스트로 일감 관리하기

옵시디언 데일리 투두리스트로 일감 관리하기 1. 데일리 노트 (Daily notes) 설정하기 옵시디언에서 기본적으로 제공하는 코어 플러그인 (Core plugins)에 데일리 노트가 있다. 옵시디언 설정에 들어가 코어 플러그인에서 데일리 노트를 활성화한다. 그 다음 코어 플러그인 설정에서 데일리 노트 파일에 대한 설정...

데이터베이스 락 (공유락과 베타락)

데이터베이스 락 1. 공유락 공유락은 데이터를 변경하지 않는 읽기 작업을 위한 락으로, 리소스를 읽을 수는 있지만 수정할 수 없게 하기 위한 락이다. 다른 트랜잭션에서 공유락이 걸린 데이터를 읽어도 데이터의 정합성은 지켜지기 때문에 다른 트랜잭션의 공유락은 막지 않는다. 하지만 공유락이 걸린 데이터에 베타락을 걸고 접근할 ...

트랜잭션 락

트랜잭션 락 1. 비관적 락 (Pessimistic Lock) 설명 데이터 충돌 가능성이 높다고 가정하고 트랜잭션이 데이터에 접근할 때마다 락을 걸어 다른 트랜잭션의 접근을 제한하는 방식으로, 즉 비관적인 관점에서 데이터 충돌을 사전에 방지하는 방식이다. DB 락의 공유락, 베타락 기법을 사용하는 방식이다. (각 DB 락의...

항해 플러스 6기 수료 회고 (벌써 10주가 지났지만)

벌써 2024년도 12월이 오고 나에게 큰 변화가 찾아왔다. 그렇다. 길었고 동시에 짧았던 10주 간의 항해 플러스 백엔드 6기 여정에 종지부가 찍혔다. 이번 포스팅에서는 항해 플러스 백엔드 6기의 수료 회고를 작성해보려 한다. 🧑‍💻나의 배경은… 지난 중간 회고때도 소개한 것처럼 3년차 백엔드 개발자이다. 메인으로...

항해 플러스 6기 9주차를 회고하며 - 카프카요? 제가 아는 이벤트 브로커 중에 최고였어요

1. 문제 이번 9주차의 과제는 다음과 같다. * 카프카를 구축해보고, 우리의 서비스에 카프카를 연동 및 실제 Producer, Consumer를 구현하여 적용해보기 * 카프카 메시지 발행의 결과에 대한 일관성을 보장하기 위한 Transactional Outbox Pattern 전략을 실제로 구현해보기 * 카프카 메시지 ...

카프카 서버 구축부터 Spring Boot 연동, 결과적 일관성 보장까지

개요 카프카의 서버 구축부터 Spring Boot 와 카프카를 연동해보고, 더 나아가 카프카 메시지 발행의 결과적 일관성을 보장하는 방법까지 다뤄본다. (본 포스팅에서 다루는 프로젝트는 다음 이커머스 프로젝트입니다.) 카프카 톺아보기 카프카? 카프카 (Kafka)는 링크드인에서 처음 개발된 오픈소스로, 그 당시 링크드...

항해 플러스 6기 8주차를 회고하며 - 인덱스는 진짜 유명한 쿼리 튜닝임 & 사가 패턴 사가세요

1. 문제 이번 8주차의 과제는 다음과 같다. * 시나리오에서 수행하는 조회 쿼리를 수집하고 인덱스를 적용하여 성능을 개선할 쿼리가 있다면 적용하여 성능 비교 분석하기 * 시나리오에서의 트랜잭션 범위를 분석해보고, 서비스가 확장된다고 가정할 때 현재 구조의 한계와 해결 방안을 분석해보기 * 부가 기능을 현재 비즈니스 로직...

인덱스 톺아보기

인덱스 톺아보기 인덱스란? 인덱스란 테이블의 검색 속도를 향상시키기 위해 사용하는 자료구조로, 데이터와 데이터의 위치를 포함한 자료구조이다. 인덱스를 활용하면 데이터를 조회하는 SELECT 쿼리 동작 외에도 UPDATE나 DELETE 성능도 함께 향상된다. 데이터를 수정, 삭제하기 위해서는 해당 대상을 조회해야 하기 때...

항해 플러스 6기 7주차를 회고하며 - 캐쉬🪙? No. 캐시!

1. 문제 이번 7주차의 과제는 다음과 같다. * 캐싱을 적용하여 성능을 개선할 수 있는 로직을 분석하고, 이를 합리적인 이유와 함께 문서 정리하기 * 적절한 캐싱 전략을 적용한 비즈니스 로직 작성하기 이번 주차에서는 드디어 캐싱에 대해 다루게 되었다. 사실 지금까지 실무에서 캐싱에 대해 다뤄본 적이 없었기 때문에 어...

항해 플러스 6기 6주차를 회고하며 - 레디스? 카프카? 불매합니다.(불티나게 매입)

1. 문제 6주차의 과제는 다음과 같다. * 시나리오에서 발생할 수 있는 동시성 이슈 파악 후 가능한 동시성 제어 방식들을 도입 및 장단점 파악 * 파악한 내용을 보고서로 작성해보기 * 이전 주차 때 적용한 동시성 제어 방식에서, 파악 후 적합하다고 판단한 방법으로 비즈니스 로직 개선해보기 지난 4주차 때 시나...

항해 플러스 6기 솔직 중간회고

🧑‍💻 회고 시작에 앞서 자기소개 회고를 작성하는 일자를 기준으로 3년 6개월 된 백엔드 개발자이다. 메인으로 삼고 있는 기술 스택은 Java, Kotlin, Spring Boot 이며, 3년 9개월이라는 시간 동안 HR 도메인에서 나름 다양한 서비스를 개발 및 유지보수 해오며 지내왔다. 취업 준비생 지원 서비스, 대학 ...

항해 플러스 6기 5주차를 회고하며 - Filter, Interceptor 넌 못지나간다.✋

1. 문제 5주차의 과제는 다음과 같다. * 비즈니스 별 발생할 수 있는 에러 코드 정의 및 관리 체계 구축 * 시스템 성격에 적합하게 Filter, Interceptor 를 활용하여 기능의 관점을 분리하여 개선 * 시나리오 별 동시성 통합 테스트 작성 이번 시나리오를 구현하면서 발생할 수 있는 에러는 커스텀 예외를 ...

항해 플러스 6기 4주차를 회고하며 - 끝이 없네 끝이 없어!

1. 문제 4주차의 과제는 다음과 같다. * 선택한 시나리오 별 비즈니스 로직 개발 및 단위 테스트 작성 * 비즈니스 유즈케이스 개발 및 통합 테스트 작성 * 여기서의 유즈케이스는 시스템의 동작을 사용자 입장에서 표현한 시나리오로, 시스템에 관련된 요구사항을 알아내는 과정을 의미한다. 다시 한 번 우리 팀이 선택한...

인터페이스가 Even하게 익지 않았어요 (ServiceImpl 구조에 대한 사견)

사견) Service를 추상화하는 것은 좋은 구조는 아니라고 생각한다. 1. 추상화를 하는 이유가 모호하다. 우리가 추상화를 사용하는 이유는 이를 의존하는 대상을 보호하기 위해 한다고 생각한다. 이 관점에서 볼 때 Service 인터페이스를 의존하는 Controller를 보호하는 느낌이 든다. 하지만 “Controller가 ...

항해 플러스 6기 3주차를 회고하며 - 요구사항 분석이 안됐잖아! 하지만 빨랐죠?

1. 문제 3주차의 과제는 다음과 같다. * 아래 시나리오 중 한 가지를 선택한다. 1. E-커머스 서비스 2. 맛집 검색 서비스 3. 콘서트 예약 서비스 * 선택한 시나리오의 요구사항을 분석하여 분석 자료를 작성한다. > 시퀀스 다이어그램, 플로우 차트 등 * ERD 설계하여 자료를 작...

항해 플러스 6기 2주차를 회고하며 - DB Lock도 락이다.

1. 문제 2주차의 과제는 다음과 같았다. * 특강 신청 서비스를 구현해 봅니다. * 특강 신청 API * 특강 선택 API * 특강 신청 완료 목록 조회 API * 특강 신청 및 신청자 목록 관리를 RDBMS를 이용해 관리할 방법을 고민합니다. * 아키텍처 준수를 위한 애플리케이션 패키지 설계 * ...

항해 플러스 6기 1주차를 회고하며 - 나야. 동시성.

1. 문제 걱정과 기대가 함께 있었던 항해 플러스가 시작되었다. 이전 기수분들이 겁(?)을 많이 줬었던 터라 걱정을 좀 더 많이 품고 그렇게 항해 플러스 1주차가 시작되었다. 1주차의 과제는 크게 다음과 같았다. * 어떤 사용자의 포인트 조회, 포인트 충전 및 사용, 포인트 충전 및 사용에 대한 목록 내역 조회 기능...

항해 플러스 6기 사전스터디 회고

항해 플러스 6기 사전스터디 회고 항해 플러스를 신청하다 지난 달부터 항해 플러스 코스를 신청했다. 새로운 기회가 없는 회사 업무에 익숙해져서 그대로 있다간 물경력이 될 것 같았다. 그리고 스스로도 발전이 필요할 것 같다고 느꼈는데 명확히 어떤 걸 공부해야 할지도 갈피를 잡지 못했다. 그러다 팀원분의 추천으로 항해 플러스...

Spring Boot에서 Redis 실습하기

Redis를 사용하는 이유 Redis는 오픈 소스 기반의 고성능 키-값 저장소로, 메모리 내 데이터 저장 및 검색을 위한 데이터베이로 사용한다. redis는 메모리 내 데이터 저장으로 빠른 응답 속도를 제공하며 문자열, 리스트, 집합, 해시와 같은 다양한 데이터 타입을 다룰 수 있어 다양한 애플리케이션에서 활용 가능하다. ...

AOP 활용하여 로그인 여부 체크하기

AOP 활용하여 로그인 여부 체크하기 요구 사항 진행하는 프로젝트에서 거의 대부분의 API 메서드에서 로그인 정보가 없으면 401 HTTP 상태와 에러 코드를 반환해야 한다는 요구 사항이 추가되었다. 단순히 요구 사항만 충족시킨다면 각 API 메서드에 로그인 여부를 검증하는 로직을 추가하고, 로그인 정보가 없다면 401 상...

ForkJoinPool과 클래스 로더

ForkJoinPool과 클래스 로더 문제가 발생한 상황 회사에서 설치형 솔루션 프로젝트를 진행하던 중이었다. 해당 프로젝트를 jar로 패키징하여 테스트 서버에 배포하고 기능 테스트를 진행하는데, 이러한 에러를 보게 되었다. java.lang.RuntimeException: java.io.FileNotFoundExcept...

Github Actions로 브랜치에서 push하면 특정 브랜치에 자동 merge 하기

Github Actions로 브랜치에서 push하면 특정 브랜치에 자동 merge 하기 팀원들과 깃 브랜치 머지에 대해 이야기하다가 다음과 같은 주제에 대해 이야기를 한 적이 있다. 현재 깃 플로우가 1. 개별 feature 브랜치에서 커밋 하고, 2. feature 브랜치와 릴리즈 버전 브랜치에 Merge 하고, 3. 버...

Kafka vs SQS 비교하기

Kafka vs SQS 비교하기 실무에서 담당하고 있는 서비스에서의 메시지 큐 서비스로 Kafka와 NiFi로 호출하는 SQS 두 서비스를 혼합해 사용하고 있다. 물론 서비스 내에서도 파트가 나뉘어져 있어 한 파트는 Kafka, 한 파트에서는 SQS를 사용하고 있긴 하다. 하지만 한 서비스에서 서로 다른 메시지 큐 서비스를 ...

도입 사례로 살펴보는 올바른 Kafka 사용 방안

도입 사례로 살펴보는 올바른 Kafka 사용 방안 통상적으로 알려진 Kafka의 이점 Kafka는 링크드인에서 만들어져 현재는 Apache 재단에서 관리하는 오픈소스 분산 이벤트 스트리밍 플랫폼이다. 기존 링크드인의 데이터 처리 구조는 아래 이미지와 같이 굉장히 복잡했다고 한다. 이런 복잡한 구조에서 만약 이슈가 발생한다면 ...

휴가를 다녀오니 Kafka 토픽 파티션이 늘어난 건에 대하여

휴가를 다녀오니 Kafka 토픽 파티션이 늘어난 건에 대하여 제목 그대로의 일이 발생했다. 휴가 중 서비스의 다량 요청 트래픽이 몰리는 일이 발생했고, 그에 따라 늘어난 메시지 큐를 빨리 처리하기 위해서 팀에서 파티션을 늘려 조치를 했던 것이다. 하지만 문제는 파티션을 늘리게 되면서 발생했다. 기존 토픽의 파티션은 1로,...

JPA 값 타입 필드 업데이트를 원활히 하는 방법

JPA 값 타입 필드 업데이트를 원활히 하는 방법 개요 실무에서 JPA를 사용하면서 엔티티의 json 필드의 특정 값을 업데이트하려고 하는데 정상적으로 동작하지 않았던 이슈를 소개하고, 이를 어떻게 해결했는지에 대해 다뤄보려 한다. 문제 상황 예를 들어, 다음과 같은 엔티티가 있다고 가정해보겠다. @Getter @To...

Transactional 잘 적용하기

@Transactional 잘 적용하기 개요 실무 업무를 하던 중 예기치 못하게 DB에서 특정 ID 값을 가진 데이터를 찾을 수 없다는 이슈가 발생했다. 처음에는 데이터를 생성해주는 로직에서의 문제인 줄 알았지만, 동일한 로직을 사용하는 다른 곳에서는 정상적으로 동작하는 것을 확인하고 아닌 것을 확인했다. 팀원들과 모여서 문...

JPA 복합 키 사용하기

JPA 복합 키 사용하기 서론 실무에서 새로운 프로젝트를 진행하면서 새로운 DB 테이블을 생성해야 하는 경우가 있었는데, 해당 테이블을 복합 키로 설계해 만들게 되었다. 그러면서 사용하고 있는 ORM인 JPA에서 복합 키를 표현하고 사용해야 하는 상황이 발생하게 되었다. 이번 포스팅에서는 JPA에서 복합 키를 사용하는 대표...

Spring Security 6.1.0 버전 이상부터 메서드 체이닝 사용 지양 이슈

Spring Security 6.1.0 버전 이상에서의 메서드 체이닝 사용 지양 이슈 배경 설명 Spring Security 6.1.0 버전부터는 메서드 체이닝을 사용하는 방법은 지양하고 대신 람다식을 통해 함수형으로 사용하도록 변경되었다. 해결 방안과 예제 먼저 아래는 6.1.0 이전 버전에서 메서드 체이닝을 사용하여 S...

Spring Boot에 H2 database 연결하여 개발 환경 구축하기

Spring Boot에 H2 database 연결하여 개발 환경 구축하기 H2의 필요성 개인 프로젝트를 개발하면서 이전에는 클라우드 서버에 Mysql과 같은 DBMS 환경을 구성한 후, 해당 서버에 연결해서 DB 환경을 구축하여 개발했다. 하지만 이렇게 구성하다보니 개발할 때마다 서버를 실행하고, 서버에 접속해서 DBMS를 ...

Kotlin - 6.함수형 프로그래밍 다루기

Kotlin 문법 배우기 코틀린의 함수형 프로그래밍 (Functional Programming) 다루기 배열과 컬렉션 다루기 배열 이펙티브 자바에서도 나온 내용인데 프로덕션에서 배열은 잘 사용하지 않는다. 문법만 간단히 짚고 넘어가보자. fun main() { val array = arrayOf(100, 200, ...

Kotlin - 5.상속, 접근제어, object 다루기

Kotlin 문법 배우기 코틀린에서 상속, 접근제어 및 object 다루기 1. 상속 추상 클래스 Animal이라는 추상클래스를 구현한 예제를 먼저 살펴보자. 자바로 먼저 살펴보면 다음과 같은 형태일 것이다. public abstract class Animal { protected final String specie...

Kotlin - 4.클래스 다루기

Kotlin 문법 배우기 코틀린에서 클래스 다루기 1. 클래스 클래스와 프로퍼티 우선 다음과 같은 자바의 클래스가 있다고 해보자. public class Person { private final String name; // 변경 불가능한 필드 private int age; public Per...

Kotlin - 3.제어문, 반복문, 예외, 함수 다루기

Kotlin 문법 배우기 코틀린의 제어문, 반복문, 예외, 함수 다루기 1. 제어문 if 문 다음과 같은 자바 코드를 살펴보자. 아래 함수는 받는 int 인자가 0보다 작으면 예외를 던지는 함수이다. private void validIntegerNotNegative(int num) { if (num < 0) {...

Kotlin - 2.연산자 다루기

Kotlin 문법 배우기 코틀린의 연산자 다루기 1. 단항 연산자와 산술 연산자 단항 연산자, 산술 연산자, 그리고 산술대입 연산자는 자바와 코틀린 모두 동일하다. 단항 연산자 산술 연산자 산술대입 연산자 ++ – + - ...

Kotlin - 1.변수와 타입 다루기

Kotlin 문법 배우기 코틀린의 변수와 타입 다루기 1. 변수 선언 키워드 코틀린에서 변수 선언 키워드로 var과 val이 있다. var number1 = 10 val number2 = 10 두 키워드의 차이점으로는 var은 수정할 수 있는 변수, val은 수정 불가능한 변수를 의미한다. 단, val 키워드로 선언한 ...

헥사고날 아키텍처 적용해보기 - 2

헥사고날 아키텍처 적용해보기 2. 프로젝트에 아키텍처 적용하기 저번 포스팅에서는 헥사고날 아키텍처가 무엇인지 이론적인 개념에 대해 다루었다면, 이번 포스팅에서는 실제로 개인 프로젝트에 헥사고날 아키텍처를 적용해 본 실무적인 내용을 다룬다. 패키지 구조 구성 기존 3-Layer 아키텍처에서의 패키지 구조는 서비스 도메인 ...

헥사고날 아키텍처 적용해보기 - 1

헥사고날 아키텍처 적용해보기 1. 헥사고날 아키텍처란? 개인 프로젝트를 진행하면서 확장성이 좋고, 유지보수가 편한 패키지 구조에 어떤 게 있을까 알아보다가 헥사고날 아키텍처라는 구조를 알게 되었다. 그래서 이번 포스팅에서는 헥사고날 아키텍처는 어떤 구조를 가지고 있으며 기존 3-Layer 아키텍처에 비해 어떠한 이점이 있...

도커로 Kafka 실습 로컬 서버 환경 구축하기

도커를 통한 Kafka 실습 환경 구축 들어가기 전에 해당 포스팅은 로컬 환경에서 Kafka 동작을 테스트하기 위해 Kafka 서버 환경을 구축해 본 내용을 담았다. 본 구축을 하기 전에 우선 도커가 로컬 환경에 설치되어 있어야 한다. 1. docker-compose.yml 작성 및 도커 이미지 실행 해당 실습...

헤드퍼스트 디자인패턴 Chapter11 - 프록시 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 11. 객체 접근 제어하기 - 프록시 패턴 예제 프로젝트. 뽑기 기계 모니터링 코드 만들기 10장에서 만든 뽑기 기계의 상태를 파악하기 위해 모든 뽑기 기계의 재고와 현재 상태를 알려 주는 기능을 개발해야 한다. ...

헤드퍼스트 디자인패턴 Chapter10 - 상태 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 10. 객체의 상태 바꾸기 - 상태 패턴 예제 프로젝트 - 최첨단 뽑기 기계 상태 기계 기초 지식 알아보기 우선 뽑기 기계의 상태를 모아본다. 동전 없음 동전 있음 알맹이 매진 ...

Optional을 조심히 사용해야 하는 이유

Optional을 조심히 사용해야 하는 이유 어느 날, 같은 팀원분이 내가 Optional을 사용해서 작성한 코드를 보고 Optional을 사용할 때는 조심해서 사용해야 한다고 일러준 적이 있었다. 그 때 팀원분은 Optional의 개발자가 Optional은 반환 타입으로만 사용하도록 의도했다고 이야기해 주었고, 이번 게시...

QueryDsl에서 json 컬럼에 조건 적용하기

QueryDsl에서 json 컬럼에 조건 적용하기 JPA를 사용하면서 DB에 Collection이나 Object 형태로 값을 저장하는 json 컬럼을 종종 사용하곤 한다. 그러다 간혹 QueryDsl 에서 json 컬럼에 저장된 값의 내용에 따라 조건을 적용해 SQL문을 실행하고 싶은 경우가 있다. SQL문에서 jso...

헤드퍼스트 디자인패턴 Chapter9 - 반복자 패턴과 컴포지트 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 9. 컬렉션 잘 관리하기 - 반복자 패턴과 컴포지트 패턴 예제 프로젝트 - 객체마을 식당과 팬케이크 하우스 합병 객체마을 식당에서는 점심 식사를, 팬케이크 하우스에서는 아침 식사를 노리고 메뉴를 만든다고 한다. 모든 메...

헤드퍼스트 디자인패턴 Chapter8 - 템플릿 메서드 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 8. 알고리즘 캡슐화하기 - 템플릿 메서드 패턴 예제 프로젝트 - 커피와 홍차 커피와 홍차의 공통점은 카페인이 있다는 점과 만드는 방법이 매우 비슷한 방법으로 만들어진다는 점이다. Coffee 클래스와 Tea 클래스 만...

헤드퍼스트 디자인패턴 Chapter7 - 퍼사드 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 7. 적응시키기 - 퍼사드 패턴 예제 프로젝트 - 홈시어터 만들기 영화나 TV 시리즈를 몰아볼 수 있는 홈시어터를 구축해보자. 홈시어터에는 스트리밍 플레이어, 프로젝터, 자동 스크린, 자동 조명, 서라운드 음향, 팝콘 ...

헤드퍼스트 디자인패턴 Chapter7 - 어댑터 패턴

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 7. 적응시키기 - 어댑터 패턴 객체지향 어댑터 어떤 인터페이스를 클라이언트에서 요구하는 형태로 적응시키는 역할 새로운 클래스의 인터페이스가 기존 코드의 인터페이스와 다를 경우, 그냥 연결해서 사용할 수...

헤드퍼스트 디자인패턴 Chapter6

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 6. 호출 캡슐화하기 - 커맨드 패턴 예시 - IoT 리모컨 리모컨 세부 사항 프로그래밍이 가능한 7개의 슬롯 버튼 7개의 슬롯 각각에 대한 ON/OFF 버튼 누른 버튼의 명령을 취소하는 UNDO 버튼 제어해야 ...

헤드퍼스트 디자인패턴 Chapter5

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 5. 하나뿐인 특별한 객체 만들기 - 싱글턴 패턴 싱글턴 패턴의 용도 인스턴스를 하나만 만들어야 하는 객체 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체와 같이 하나만 있을...

헤드퍼스트 디자인패턴 Chapter4

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 4. 객체지향 빵 굽기 - 팩토리 패턴 new 연산자가 보이면 “구상”을 떠올려라 new 연산자를 사용하면 구상 클래스의 인스턴스가 생성된다. (인터페이스가 아닌 특정 구현을 사용해서) 앞서 구상 클래스를 바탕으로 코딩...

Bouncer 패턴과 Extract method 기법

Bouncer 패턴과 Extract method 기법 이전 포스팅에서 다룬 Early Return 기법의 단점이었던 “여러 줄의 코드에서 적용했을 때 함수의 복잡도가 높아진다.” 라는 점을 보완하기 위한 방법 중 대표적인 방법인 Bouncer 패턴과 Extract method 기법에 대해 다루어본다. Bouncer 패턴...

Early Return을 알아보자

Early Return을 알아보자 Early Return을 사용하면 좋은 경우 먼저 아래와 같은 계산을 하는 코드가 있다고 생각해보자. public class ExampleClass { public int calculateResult(int x, int y) { int z = 0; ...

자바 버전 별 특징

자바 버전 별 차이점 Java 7 Type Inference (타입 추론) // 7이전 버전 List<String> list = new ArrayList<String>(); // 7이후 버전 List<String> list2 = new ArrayList<>(); ...

헤드퍼스트 디자인패턴 Chapter3

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 3. 객체 꾸미기 - 데코레이터 패턴 OCP 살펴보기 OCP(Open-Closed Principle) 디자인 원칙 5 클래스는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다. 우리의 목...

사례로 보는 Spring Event & Kafka

Spring Event와 Kafka 예시 사례 문서 정리 작업을 수행하는 한 애플리케이션이 있다고 가정해보자. 정리할 문서들이 들어오고 정리 요청을 하게 되면 정리 작업이 수행된다. 해당 애플리케이션에서 문서를 정리하는 작업에는 문서 내용 분석, 내용 별 분리, 불필요한 문서 정리 등 특정 작업 단계가 있고, 각 단계마...

lombok @Builder의 기본값 초기화 딜레마

lombok @Builder의 기본값 초기화 딜레마 개요 lombok에서 제공해주는 @Builder 어노테이션은 생성자 인자를 메서드 체인으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성해준다. 클래스 레벨에서 @Builder를 선언하면 모든 요소를 받는 package-private 생성자가 자동으로 생성되고, ...

헤드퍼스트 디자인패턴 Chapter2

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 2. 객체들에게 연락 돌리기 - 옵저버 패턴 기상 모니터링 애플리케이션 알아보기 이 시스템은 기상 스테이션(실제 기상 정보를 수집하는 장비), WeatherData 객체(기상 스테이션으로부터 오는 정보를 추적하는 객체), ...

헤드퍼스트 디자인패턴 Chapter1

헤드퍼스트 디자인패턴 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 1. 디자인 패턴 소개와 전략 패턴 오리 시뮬레이션 게임, SimUduck 오리 시뮬레이션 게임에서는 헤엄도 치고 꽥꽥 소리도 내는 다양한 오리가 등장한다. 이 시스템을 처음 디자인한 사람은 표준 객체지향 기법을 사용하...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter9

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 9. 웹 최적화 트렌드 웹 최적화의 역사 모바일 기기의 등장과 모바일 사이트 최적화 스마트폰이 등장하면서 모바일 사용자의 경험이 중요해짐 모바일과 데스크탑 사용자의 사이트 경험을 동일하게 만들기 위...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter8

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 8. 웹 프로토콜 최적화 HTTP의 발전 HTTP/1.1 GET, POST 외에도 PUT, DELETE 메서드 추가됨 Via 헤더를 사용해 중계 서버 정보를 공유하고 Accept 헤더로 클라이언트가...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter7

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 7. CDN CDN을 사용하는 이유 CDN 서비스 이용 시 이점 성능 및 안정성 보장 CDN 업체들은 많은 수의 POP (Point Of Prese...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter6

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 6. 캐시 최적화 캐시 캐시: 컨텐츠 요청에 빠르게 응답하기 위해 서버와 클라이언트 사이에서 응답 컨텐츠 사본을 저장하는 공간 캐시는 보통 클라이언트와 서버 사이에 존재 캐시 서버의 종류 및 이...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter5

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 5. 웹에서 가속을 이끌어 내는 방법 웹 브라우저 동작 이해하기 가장 먼저 도메인 서버와 통신하여 접속하려는 호스트의 IP를 찾음 해당 IP를 가진 서버와 통신을 시도해 TCP 연결 맺음 ...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter4

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 4. 이미지 최적화 디지털 이미지의 종류와 특성 이미지를 잘 사용하려면 우선 이미지의 종류와 특성을 잘 파악하고, 사용될 기기 타입과 용도에 맞춰 적절한 이미지를 선택해야 함 PNG 파일 ...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter3

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 3. 웹 사이트 성능을 개선하는 기본적인 방법 HTTP 요청 수 줄이기 웹 페이지에서 요청하는 컨텐츠 수가 많을수록 로딩 완료 시간 증가 반대로 컨텐츠 수가 적은 페이지는 매우 빠르게 로딩 완료 ...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter2

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 2. 웹 최적화 웹 최적화란 웹 최적화란 웹 성능을 구현하기 위해 최고의 조건을 만드는 다양한 노력을 의미 프론트엔드 최적화 웹 UI/UX와 관련된 최적화 HTML, CSS...

웹에 날개를 달아주는 웹 성능 최적화 기법 Chapter1

웹에 날개를 달아주는 웹 성능 최적화 기법 본 책을 읽고 책의 내용을 간략하게 정리한 글입니다. Chapter 1. 웹 성능이란 무엇인가 웹의 대표적인 요소 URL (Uniform Resource Locator) 웹 자원이 인터넷상 어느 위치에 존재하고 있는지 알려주는 방법 ...

Kafka 도입에 대하여

Kafka 도입에 대하여 Kafka란 무엇인가? Kafka는 Apache 소프트웨어 재단이 개발한 오픈 소스 분산 메시징 시스템으로, 주로 데이터 스트리밍, 이벤트 처리, 로그 수집 등 다양한 분야에서 사용된다. Kafka는 특히 대용량 데이터를 처리하고 다양한 시스템 간에 데이터를 안전하게 전송하는 데 용이하다. 조...

DB 조회 성능 향상을 위한 방법

DB 조회 성능 향상을 위한 방법 1. 적절한 인덱스 사용 데이터베이스에서 레코드 검색 시 인덱스를 활용하면 검색 속도를 향상시킬 수 있다. 인덱스는 특정 열의 값을 저장하고 해당 열의 검색을 빠르게 만든다. 적용 예제 CREATE INDEX idx_order_number O...

Spring Boot 에서의 재시도 수행 전략

Spring Boot 에서의 재시도 수행 전략 Spring Boot 에서 예외 발생 시 메서드 재시도를 수행하는 전략은 애플리케이션에서 예외 처리를 개선하고 내결함성을 향상시키는 중요한 부분이다. Spring에서는 이를 위해 다양한 방법을 제공하고 있으며, 주로 다음에 설명하는 전략들을 주로 사용한다. RetryTe...

템플릿 콜백 패턴 이해

템플릿 콜백 패턴의 이해 템플릿 콜백 패턴은 전략 패턴의 일종으로, 전략 패턴에서는 클라이언트가 전략 객체를 선택하고 호출하는 방식이지만, 템플릿 콜백 패턴에서는 특정 알고리즘(콜백)을 포함한 템플릿 메서드를 호출하고, 클라이언트가 필요한 콜백을 구현하여 전달하는 방식입니다. 즉, 템플릿 콜백 패턴은 전략 패턴의 구현 ...

전략 패턴 패턴 이해

전략 패턴의 이해 비슷한 동작을 하지만 다르게 구현되어 있는 행위(전략)들을 공통의 인터페이스를 구현하는 각각의 클래스로 구현하고, 동적으로 바꿀 수 있도록 하는 패턴입니다. 전략 패턴으로 구현된 코드는 직접 행위에 대한 코드를 수정할 필요 없이 전략만 변경하여 유연하게 확장할 수 있습니다. 전략 패턴의 구조 전...

템플릿 메서드 패턴 이해

템플릿 메서드 패턴 이해 핵심 기능 vs 부가 기능 핵심 기능 해당 객체가 제공하는 고유의 기능 부가 기능 핵심 기능을 보조하기 위해 제공하는 기능 좋은 설계는 핵심 기능과 부가 기능을 분리하는 것이다. 템플릿 메서드 패턴(Template M...

Transactional과 AOP, 그리고 프록시 패턴

@Transactional과 AOP, 그리고 프록시 패턴 @Transactional에는 Spring AOP의 프록시 패턴을 사용하여 동작한다. @Transactional을 알아가기 앞서 프록시 패턴과 Spring AOP에 대해 알아보도록 한다. 프록시 패턴 프록시 패턴은 객체 지향 디자인 패턴 중 하나로, 다른 객체에 대...

Java 동시성 이슈와 ThreadLocal

Java 동시성 이슈와 쓰레드 로컬 (ThreadLocal) Java의 동시성 이슈 동시성 이슈 (Concurrency issues)는 다중 쓰레드 환경에서 발생하는 문제로, 여러 쓰레드가 공유된 자원에 동시에 접근할 때 예기치 않은 결과가 발생할 수 있다. 동시성 이슈는 아래 상황에서 발생할 수 있다. 경쟁 조건 ...

Spring Boot and OAuth2

Spring Boot and OAuth2 이 가이드는 OAuth 2.0과 Spring Boot을 사용하여 “소셜 로그인”으로 다양한 작업을 수행하는 샘플 앱을 구축하는 방법을 보여줍니다. 단순한 단일 공급자 싱글 사인-온 (single-provider single-sign on) 으로 시작하여 GitHub 또는 Google...

git push (non-fast-forward) error

git push origin master 후 non-fast-forward 문제 원인 파일을 올리려고 하는 깃허브 내 레파지토리와 git init한 로컬 내 저장소와 관련이 없는(unrelated) 상태에서 두 저장소를 병합(merge) 시도함 해결책 git pull 명령 시 --allow-unrelated-h...

Greedy Algorithm & 응용문제

그리디 알고리즘 현재 상태에서 가장 좋은 선택만을 취하는 알고리즘 매 순간 최적이라고 생각하는 답을 선택하는 알고리즘 방식으로 해당 그리디 알고리즘이 잘 동작하는 문제로 앞 상황에서의 선택이 뒤에 나오는 선택 상황에 영향을 주지 않는다는 속성과 문제의 전체에 대한 최적의 선택이 부분적인 문...

Strassen Algorithm

일반적인 행렬의 곱 Naive matrix multiplication 일반적인 행렬을 구하는 방식 m * n 행렬과 n * k 행렬을 곱하면 O(mnk) 가 되어 결과적으로 O(n^3)의 시간복잡도를 가진다. for(int i = 0; i < size; i++) { for(int j = 0;...

Greatest common measure depth problem

최대공약수 응용 문제 원하는 개수의 정수들의 최대공약수 3개 이상 정수의 최대공약수 구하기 예를 들어 24, 15, 48 세 수의 최대공약수를 구한다고 가정한다면 먼저 최소값을 구해준다. (예제는 15) 최소값으로 각 정수를 나눈 나머지값을 비교해서 그 수가 모두 0일 경우 최소값이 최대공약수가 된다. 만약...