분류 전체보기

    10.Spring Batch의 Chunk와 ItemProcessor

    CompositeItemProcessor기본개념ItemProcessor 들을 연결(Chaining)해서 위임하면 각 ItemProcessor 를 실행시킨다예를 들자면 3개의 ItemProcessor가 있고 각 ItemProcessor에 작업중인 객체를 전달해줘야 하는 상황이라 가정해보자1번 ItemProcessor는 문자열 전체를 대문자로 바꿔준다.2번 ItemProcessor는 UUID를 문자열에 더해준다.3번 ItemProcessor는 A를 B로 바꿔주는 ItemProcessor이다.이럴 경우 각 ItemProcessore는 작업중인 문자열을 반환해줘야한다. CompositeItemProcessor는 작업중인 객체를 전달하여 동작할 ItemProcessor를 chaining 형식으로 구성한다.이전 I..

    9.Spring Batch의 Chunk와 ItemWriter

    Flat Files - FlatFileItemWriter 개념 및 API 소개기본개념2차원 데이터(표)로 표현된 유형의 파일을 처리하는 ItemWriter고정 위치로 정의된 데이터 필드나 특수 문자에 의해 구별된 데이터의 행을 기록한다Resource 와 LineAggregator 두 가지가 요소가 필요하다구조LineAggregatorItem 을 받아서 String 으로 변환하여 리턴한다item은 객체를 의미한다.FieldExtractor를 사용해서 처리할 수 있다구현체총 3개의 PassThroughLineAggregator, DelimitedLineAggregator, FormatterLineAggregator 구현체가 있다.FieldExtractor전달 받은 Item 객체의 필드를 배열로 만들고 배열을..

    8.Spring Batch의 Chunk와 ItemReader

    스프링 배치 청크 프로세스기본개념2차원 데이터(표)로 표현된 유형의 파일을 처리하는 ItemReader일반적으로 고정 위치로 정의된 데이터 필드나 특수 문자에 의해 구별된 데이터의 행을 읽는다Resource 와 LineMapper 두 가지 요소가 필요하다구조ResourceFileSystemResource – new FileSystemResource(“resource/path/config.xml”)ClassPathResource – new ClassPathResource(“classpath:path/config.xml)LineMapper파일의 라인 한줄을 Object 로 변환해서 FlatFileItemReader 로 리턴한다단순히 문자열을 받기 때문에 문자열을 토큰화해서 객체로 매핑하는 과정이 필요하다Li..

    7.Spring Batch의 Chunk와 동작원리 살펴보기

    Chunk1.기본개념Chunk 란 여러 개의 아이템을 묶은 하나의 덩어리, 블록을 의미한번에 하나씩 아이템을 입력 받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리함, 즉 Chunk 단위의 Commit 과 Rollback 이 이루어짐일반적으로 대용량 데이터를 한번에 처리하는 것이 아닌 청크 단위로 쪼개어서 더 이상 처리할 데이터가 없을 때까지 반복해서 입출력하는데 사용됨Chunk vs ChunkChunk 는 ItemReader 로 읽은 하나의 아이템을 Chunk 에서 정한 개수만큼 반복해서 저장하는 타입Chunk 는 ItemReader 로부터 전달받은 Chunk 를 참조해서 ItemProcessor 에서 적절하게 가공, 필터링한 다음 ItemWriter 에 전달하는 타입2.아키텍..

    6.Spring Batch의 Flow

    개요Flow는 이전 수업에서 배웠던 개념들이 Job과 Step보다 좀 더 유연하다.이번 단원에서 FlowJob, SimpleFlow, FlowStep에 대하여 학습해보자FlowJob 개념 및 API 소개1. 기본개념Step 을 순차적으로만 구성하는 것이 아닌 특정한 상태에 따라 흐름을 전환하도록 구성할 수 있으며 FlowJobBuilder 에 의해 생성된다Step 이 실패 하더라도 Job 은 실패로 끝나지 않도록 해야 하는 경우한 Job에서 연속적인 Step이 있을Step 이 성공 했을 때 다음에 실행해야 할 Step 을 구분해서 실행 해야 하는경우특정 Step은 전혀 실행되지 않게 구성 해야 하는 경우Flow 와 Job 의 흐름을 구성하는데만 관여하고 실제 비즈니스 로직은 Step 에서 이루어진다내부적..

    5.Spring Batch의 Step

    StepBuilderFactory1. StepBuilderFactoryStepBuilder 를 생성하는 팩토리 클래스로서 get(String name) 메서드 제공StepBuilderFactory.get(“stepName")“stepName” 으로 Step 을 생성2. StepBuilderStep을 구성하는 설정 조건에 따라 다섯 개의 하위 빌더 클래스를 생성하고 실제 Step 생성을 위임한다TaskletStepBuilderTaskletStep 을 생성하는 기본 빌더 클래스SimpleStepBuilderTaskletStep 을 생성하며 내부적으로 청크기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성한다PartitionStepBuilderPartitionStep 을 생성하며 멀티 ..

    4.Spring Batch의 Job

    목차배치 초기화 설정Job and StepJob and Flow@JobScope / @StepScope배치 초기화 설정이번 글에서는 Bean으로 등록된 Job들을 어떻게 실행할 지에 대해서 배운다.Job을 하나만 실행하는 경우도 있을것이고 2개..n개를 돌리는 경우도 있을것이다.이러한 설정을 application.properties or application.yml 파일에 설정해서 동작시켜보고 어떻게 돌아가는지 원리를 분석해보자.1.JobLauncherApplicationRunnerJobLauncherApplicationRunner는 Spring Batch 작업을 시작하는 ApplicationRunner 로서 BatchAutoConfiguration 에서 생성됨스프링 부트에서 제공하는 Applicatio..

    3.Spring Batch 도메인 이해하기

    Job1. 기본개념배치 계층 구조에서 가장 상위에 있는 개념으로서 하나의 배치작업 자체를 의미함“API 서버의 접속 로그 데이터를 통계 서버로 옮기는 배치“ 인 Job 자체를 의미한다.Job Configuration 을 통해 생성되는 객체 단위로서 배치작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체배치 Job 을 구성하기 위한 최상위 인터페이스이며 스프링 배치가 기본 구현체를 제공한다여러 Step 을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성해야 함2. 기본 구현체SimpleJob순차적으로 Step 을 실행시키는 Job모든 Job에서 유용하게 사용할 수 있는 표준 기능을 갖고 있음FlowJob특정한 조건과 흐름에 따라 Step 을 구성하여 실행시키는 Job..

    2.Spring Batch 시작하기

    프로젝트 환경 설정배치의 환경 설정을 하는 방법은 2가지가 있다.Intelij를 활용한 프로젝트 구축Intelij - new(상단 막대바 위치) - Spring Initilalizer(좌측 상태바 위치)Spring Boot 기반 프로젝트를 생성하는 방법https://start.spring.io/ 이동 - dependency에서 Spring Batch 추가💡 일반 Spring Boot 프로젝트가 있으면 아래의 코드만 dependency에 추가해주자 org.springframework.boot spring-boot-starter-batch org.springframework.batch spring-b..

    [NEXTSTEP] 세 번째, 네 번째 과제를 마무리 하면서 + 후기

    들어가며이번 글에서는 세 번째 미션인 로또 과제, 네 번째 미션인 수강신청을 구현하면서 배웠던 점에 대해 정리하고 후기를 작성하고자 합니다.Cyclic Dependency가 발생하지 않도록 하자1. Cylic Dependency란?Cyclic Dependency는 두 개 이상의 모듈 또는 클래스가 서로에게 의존할 때 발생합니다.의존성은 여러 수준에서 나타날 수 있으며 서로 다른 2개의 클래스가 서로의 import문을 추가했다면 Cyclic Dependency가 발생했다고 볼 수 있습니다.이러한 Cyclic Dependcy는 모놀리식에서 MSA로 분리할 때 애플리케이션 복잡도 증가로 인해 분리가 안 되는 어려움, 순환 참조 문제 등 많은 문제들을 야기합니다.2. Cyclic Dependency가 발생한 예..

    [NEXTSTEP] 두 번째 미션을 마무리 하면서

    들어가며 이번 글에서는 두 번째 미션인 로또 과제를 진행하면서 배웠던 점과 아쉬웠던 점에 대해서 정리하고자 합니다. 배운 점 인스턴스 필드가 3개일 때부터는 리팩터링 해라 연관성이 있는 새로운 클래스로 만드는 것을 고려하기 변수가 3개일 때부터는 별도의 도메인으로 분리해 볼 필요가 있는 객체일 수 있으니 클래스 분리를 고려해봐야 합니다. 정말 필요한 변수인지 고민하고 필요 없다면 제거하는 걸 고민해 볼 것을 추천합니다. 유효성 검사는 생성자에서 하자 개발자마다 유효성 검사를 하는 방법은 다양합니다. ValidatorUtils를 사용해서 구현을 하는 방법이라든가 아니라면 if문으로 유효성을 검사를 하는 방법이라든가.. 하지만 객체가 생성전에 객체가 생성될 수 있는 유효성 검사를 하는 것이 가장 좋은 방법일..

    [NEXTSTEP] 첫 번째 미션을 마무리 하면서

    들어가며 이번 글에서는 자동차 경주 과제를 진행하면서 배웠던점과 느낀 점들에 대해서 정리하고자 합니다. 배운 점 먼저 도메인을 설계하자 Inside-out 방식으로 구현하는 것이 중요합니다. 즉, 1:N 관계일 때 N인 객체를 먼저 테스트하는 것이 TDD 하기에 적합합니다. 테스트가 어려운 메서드는 구조 설계에서 제일 하단으로 옮기자 public class RandomNumberGenerator { private Random random; public RandomNumberGenerator() { this.random = new Random(); } public int generateRandomNumber(int min, int max) { return random.nextInt(max - min + 1..

    [NEXTSTEP] TDD, 클린코드 with Java 18기 시작 (첫 번째 후기)

    들어가며얼마 전부터 NEXT-STEP 교육 기관에서 “TDD, 클린 코드 with Java 18기” 교육 코스를 밟아 나가고 있습니다.해당 교육이 좋다는 평가가 많아 교육을 들을지 말지 고민하는 사람들에게 도움이 될 수 있을 거 같아 제 경험을 포스팅해서 올려봅니다.NEXT-STEP이란?우아한 형제들의 채용과정인 우아한 테크, 우아한 캠프 관련 교육을 주력으로 진행하는 교육 기관이었던거 같습니다.그러던 중 교육 대상을 위부 IT인력으로 확장해서 교육을 진행하고 있습니다.많은 실무자들을 위한 교육이 있는데 교육에 대한 평이 좋아 예전부터 관심이 있었는데 고민을 하다가 이번 기회에 교육을 신청하게 되었습니다.TDD, 클린 코드 with Java 18기저는 TDD 강의를 신청했습니다. 평소에 테스트 코드를 작..

    2023년 회고

    미루기올 한 해 가장 반성해야 할 일은 미루는 습관입니다.(이번 회고도 미루고 미루다 쓰는 회고이니까요 ㅋㅋㅋㅋ…)변명을 하자면 항상 하고 싶은 것이 많아 우선순위를 세우다 보니 그런 거 같습니다.항상 욕심이 많아 목표치를 크게 세우는 것 같은데, 24년도에는 내가 할 수 있는 범위 내에서 목표를 세우는 습관을 가져보려고 합니다.이를 통해 지속적인 성취감을 달성하여 성장하는 데 원동력으로 삼아 보겠습니다.취업졸업을 21년도 3월에 하고 21년도 12월부터 22년도 3월까지 인턴, 이후 22년도 6월에 취업을 했습니다.그토록 원하던 분야의 주니어 개발자가 되었지만 생각보다 해야 할 업무들이 많아 기쁨을 즐길 틈은 없었습니다.현재 E커머스 결제 도메인을 담당하고 있는데 신기하고 재밌는 일도 많았지만 그만큼 ..

    카프카 스키마 레지스트리

    개요스키마의 개념과 유용성카프카와 스키마 레지스트리스키마 레지스트리의 장점스키마 레지스트리 호환성BACKWARD 호환성FORWARD 호환성FULL 호환성정리개요스키마란 정보를 구성하고 해석하는 것을 도와주는 프레임워크나 개념을 의미합니다. 스키마란 개념을 처음 입문하게 되는 계기는 보통 DB를 학습하면서 입니다. DB를 학습하면서 스키마란 데이터베이스의 구조를 정의하고 전반적인 명세와 제약 조건을 기술하는 언어라고 학습하게 됩니다.카프카에서도 스키마란 개념을 활용하여 토픽으로 전송되는 메시지에 대해 미리 스키마를 정의하여 전송함으로서 DB에서 스키마를 활용한 방법과 동일한 효과를 얻을 수 있습니다.카프카에서는 스키마를 활용하기 위해서 스키마 레지스트리라는 개념이 필요합니다. 따라서 이번 글에서는 스키마 ..

    컨슈머의 내부 동작 원리(컨슈머 오프셋, 그룹코디네이터, 스태틱 맴버십,파티션 할당 전략)

    개요컨슈머 오프셋 관리그룹 코디네이터스태틱 멤버십컨슈머 파티션 할당 전략레인지 파티션 할당 전략라운드 로빈 파티션 할당 전략스티키 파티션 할당 전략협력적 스티키 파티션 할당 전략정확히 한 번 컨슈머 동작개요이번 글에서는 카프카의 컨슈머에 대한 동작 원리와 컨슈머 오프셋, 컨슈머들의 파티션 할당 정책과 프로듀서의 정확히 한 번 전송과 결합해 트랜잭션 컨슈머의 내부 동작에 대해서 글을 작성하도록 해보겠습니다.컨슈머 오프셋 관리컨슈머의 동작 중 가장 핵심은 오프셋 관리입니다.컨슈머의 오프셋의 역할은 메시지의 위치를 나타내는것입니다. 이러한 오프셋이 중요한 이유는 컨슈머가 일시적으로 동작을 멈추고 재시작 하는 경우에 새로운 컨슈머가 기존 컨슈머의 역할을 대신하는 경우에 기존 컨슈머의 마지막 메시지 위치부터 새로..

    프로듀서의 내부 동작 원리(파티셔너, 배치)

    파티셔너파티셔너의 라운드 로빈 전략라운드 로빈 전략의 단점을 극복하기 위한 스티키 파티셔닝 전략프로듀서의 배치메시지 전송 방식 정책적어도 한 번 전송(무슨 일이 있어도 적어도 한 번은 전송한다.)최대 한 번 전송(무슨 일이 있어도 한 번만 전송한다.)중복 없이 전송정확히 한 번 전송전송 정책 한 눈에 비교하기 파티셔너프로듀서는 데이터를 전송할 때 send() 메소드를 수행함으로써 프로듀서 → 시리얼 라이저 → 파티셔너를 거쳐 카프 카프카의 Topic으로 전송됩니다.이때 복수개의 Topic중 어떤 Topic으로 메시지 를 전송할 지를 결정해야 하는데 이때 사용하는 것이 파티셔너입니다.파티셔너는 예상치 못한 많은 양의 메시지가 카프카로 들어오는 경우 파티션을 늘릴 수 있는 기능을 제공합니다. 그러나 이러한 ..

    카프카의 내부 동작 원리(리플리케이션,리더, 팔로워, 리더에포크, 컨트롤러,로그)

    카프카 리플리케이션리플리케이션 동작 개요리더와 팔로워복제 유지와 커밋리더와 팔로워의 단계별 리플리케이션 동작리더에포크와 복구컨트롤러컨트롤러의 중요성컨트롤러의 리더 선출 과정로그(세그먼트)로그 세그먼트 삭제로그 세그먼트 컴팩션카프카 리플리케이션고가용성 분산 스트리밍 플랫폼인 카프카는 무수히 많은 데이터 파이프라인중에 정중앙에 위치하는 메인 허브 역할을 합니다.메인 허브 역할을 하는 카프카가 다운되거나 문제가 발생할 경우 정상적으로 동작하지 못한다면 심각한 문제가 발생하게 됩니다.이러한 문제점을 해결할 수 있도록 카프카는 초기 설계 때부터 일시적으로 브로커에서 장애가 발생해도 안정적으로 운영될 수 있도록 리플리케이션을 수행하게 됩니다.이번글에서는 리플리케이션에 대해 살펴보며 추가적으로 리더, 팔로워의 역할과..

    카프카 기본 개념과 구조

    개요이번 글에서는 카프카의 기본 개념과 구조에 대해 포스팅할 계획입니다.카프카의 처리량을 높이기 위해 설계된 분산 시스템, 페이지 캐시, 배치 전송 등에 대해서 살펴보겠습니다.카프카의 기초 용어와 개념용어 정리주키퍼(Zookeeper): 아파치 프로젝트 애플리케이션을 호칭하는 용어. 카프카의 메타데이터 관리 및 브로커의 헬스케어를 담당합니다.카프카(Kafka): 아파치 프로젝트 애플리케이션 이름을 의미합니다.카프카 클러스터(Kafka Cluster): 카프카가 설치된 여러 대의 브로커를 구성하면 카프카 클러스터라고 호칭합니다.브로커(Broker): 카프카 애플리케이션이 설치된 서버 또는 노드를 의미합니다.프로듀서(Producer): 카프카로 메시지를 보내는 역할을하는 클라이언트를 의미합니다.컨슈머(Con..

    카프카의 특징과 장점

    카프카의 특징높은 처리량http 기반으로 이벤트를 ㄹ전달하지만 응답시간은 한 자리수 밀리초로 처리할 만큼 빠르다.순서 보장이벤트 처리 순서가 보장되므로 엔터티 간의 유효성 검사나 동시 수정 같은 무수한 복잡성들이 제거되어 구조가 간결하다.적어도 한 번 전송 방식카프카는 멱등성을 유지한다.이로인해 프토듀서가 같은 데이터를 재손하도 데이터의 변화가 일어나지 않다.전송방식중에 ‘적어도 한 번’이라는 방식이 존재한다. 따라서 이벤트가 중복 발생할 수 있으나 누락 없는 전송이 가능하다.강력한 파티셔닝논리적으로 토픽을 여러 개로 나눌 수 있다.다른 파티션들과의 의존성 없이 처리가 가능하므로 수평적인 확장이 가능하다.자연스러운 백 프레셔 핸들링카프카는 Pull 방식으로 동작한다. Pull 방식의 장점은 자기 자신의 ..

    CHAPTER 13.실전 디자인 패턴

    이번 글에서는해당 챕터에서는 실제 디자인 패턴을 적용하는 방법에 대해서 학습합니다.패턴 카탈로그에 대해 학습한뒤 가장 훌륭한 패턴 카탈로그 저서인 GoF 디자인 패턴의 서술 방식을 살펴봅니다.디자인 패턴에서 사용되는 전문 용어를 살펴봅니다.디자인 패턴을 분류하는 방법들에 대해서 학습합니다.안티 패턴에 대해서 알아봅니다.패턴 카탈로그(GoF 템플릿) 살펴보기패턴 카탈로그는 아래와 같이 이루어져 있습니다.title(제목)Intent(용도)Motivation(동기)Applicablity(적용 대상)Strcture(구조)Participants(구성 요소)Collaboartions(협동)Consequences(결과)Implementation/SampleCode(구현 및 샘플 코드)Know Uses(사용 예)Rel..

    CHAPTER 12.복합 패턴

    복합 패턴이란?문제를 해결하기 위해 개발할 때는 효율적인 코드를 작성하기 위해 디자인 패턴을 고민하고 적용합니다.이때 하나의 디자인 패턴만을 사용하지 않고 여러 패턴을 복합적으로 사용하여 문제에 대한 해결을 시도 하는 것을 복합 패턴이라고 합니다. 복합 패턴 적용하기전략 패턴에서 사용했던 오리 예제를 다시 한 번 사용하여 예제를 진행하겠습니다.이전에는 오리 문제를 전략패턴만 사용해서 적용했지만 이번에는 새로운 문제를 예제 중간에 지속적으로 제안하고 문제 해결을 위한 디자인 패턴을 적용하도록 해보겠습니다.public interface Quackable { public void quack(); }오리가 소리를 내는 행동을 정의하는 Quackable 인터페이스입니다.public class MallardDuck..

    CHAPTER 11.프록시 패턴

    프록시 패턴이란?프록시 패턴의 특정 객체로의 접근을 제어하는 대리인을 제공하는 디자인패턴입니다.프록시 패턴을 사용하면 생성하기 힘든 객체 또는 보안이 중요한 객체와 같이 접근을 제어하는 대리인 객체를 만들 수 있습니다.프록시 패턴을 사용하게 되면 가상 프록시를 사용해서 생성하기 힘든 자원으로의 접근을 제어할 수 있으며 보호 프록시를 사용해서 접근 권한이 필요한 자원의 접근을 제어할 수 있습니다.프록시 패턴의 종류1. 원격 프록시원격 프록시는 원격 개체의 로컬 대변자 역할을 수행하는것을 의미합니다.로컬 대변자란 어떤 메소드를 호출하면 다른 원격 객체에게 그 메소드 호출을 전달해주는 객체를 로컬 대변자라고 합니다.클라이언트 객체는 원격 객체가 가지고 있는 메소드를 호출 하는것처럼 행동합니다. 하지만 실제로로..

    CHAPTER 10.상태 패턴

    상태 패턴 이해를 위한 간단한 문제 제안어릴때 문방구에서 위와 같은 뽑기 기계를 보신 경험이 있을것입니다.뽑기 기계를 만드는 CEO가 작은 컴퓨터 칩을 넣을건데 작은 칩에서 뽑기 기계가 동작할 수 있는 SW시스템을 구성하고 싶다고 의뢰가 들어왔습니다.CEO는 위의 그림과 같은 플로우로 SW를 만들어달라고 요청했습니다.상태를 확인해보면 아래 처럼 4가지의 상태로 구분할 수 있습니다.public class GumballMachine { final static int SOLD_OUT = 0; //알맹이 품절 final static int NO_QUARTER = 1; //동전미 보유 상태 final static int HAS_QUARTER = 2; //동전 보유 상태 final static int SOLD = ..

    CHAPTER 09.반복자 패턴과 컴포지트 패턴

    반복자 패턴 이해를 위한 간단한 문제 제안PancakeHouseMenu라는 식당과 DinerMenu라는 식당이 있습니다. 두 식당은 별개의 식당입니다.우연히 두 식당은 식당을 합치기로 했고 이 과정에서 서로 메뉴를 수정하기 싫어하는 신경전이 펼쳐지게 됩니다. 메뉴 수정이 다른 이유는 아래처럼 PancakeHouseMenu식당과 DinerMenu 식당의 구현 방법이 다르기 때문입니다.public class PancakeHouseMenu implements Menu { ArrayList menuItems; // DinerMenu와 달리 PancakeHouseMenu는 배열을 통해 메뉴를 구현 public PancakeHouseMenu() { menuItems = new ArrayList(); addItem(..

    CHAPTER 08.템플릿 메소드 패턴

    템플릿 메소드 패턴 이해를 위한 간단한 문제 제안우리는 개발을 하다보면 비슷한 메소드에 비슷한 로직을 작성할 때가 있습니다.특히 아래와 같은 상황은 개발자들에게 최적화에 대한 욕망과 갈증을 뿜뿜하게 됩니다.스타버즈 커피 만드는 법물을 끓인다.끓는 물에 커피를 우려낸다.커피를 컵에 따른다.설탕과 우유를 추가한다.스타버즈 홍차 만드는 법물을 끓인다.끓는 물에 찻잎를 우려낸다.홍차를 컵에 따른다.레몬을 추가한다. 두 개의 레시피를 살펴보면 재료만 다르지 행동은 비슷한다는걸 알 수 있습니다.따라서 위의 레시피를 문맥 그대로 코드로 녹여낼 경우 반복적인 코드가 탄생할 것입니다.템플릿 메소드 패턴은 예시처럼 비슷한 로직을 템플릿화 하여 코드의 퀄리티를 높여주는 디자인 패턴입니다. 템플릿 메소드 패턴을 적용해보기위 ..

    CHAPTER 07.어댑터 패턴과 퍼사드 패턴

    어댑터 패턴 이해를 위한 간단한 문제 제안해외 직구를 통해 전자 제품을 구매했다고 가정하겠습니다.각 나라별로 사용되는 어뎁터 소켓이 다르기 때문에 변환기가 필요할 것입니다.일본은 110V를 사용하고 우리나라는 220V를 사용하는것이 예시가 될 수 있습니다.객체지향 코드에서도 위와 같은 비슷한 문제가 발생할 때가 있습니다.객체 인터페이스가 달라서 사용하지 못하는 경우가 예시가 될 수 있습니다.오리 인터페이스에 비슷한 칠면조 객체를 동작하도록 하고 싶은 문제 상황이라 가정해보겠습니다.이럴 경우 어댑터 패턴을 사용해 어떻게 해결하는지 살펴보겠습니다.어댑터 패턴을 사용하여 문제 해결해보기public interface Duck { public void quack(); public void fly(); }먼저 오리..

    CHAPTER 06.커멘드 패턴

    커멘드 패턴 이해를 위한 간단한 문제 제안필자는 고객의 요구사항에 의해서 만능 IOT 리모컨을 만들려고 합니다.리모컨에는 아래와 같은 방식으로 만들려고 해요!그림을 보면 7개의 기능들이 각 슬롯마다 매핑되어야 하는것을 알 수 있습니다.문제는 각 기능들의 공통된 인터페이스가 없다라는 상황입니다.예를 들어 ON의 첫 번째 버튼은 TV의 관련 기능이고 두 번째는 선풍기 전원이라고 가정하겠습니다.TV의 기능 ON에는 TV가 켜진순간 볼륨도 켜져야하고 채널의 최초 번호수도 결정되어야 합니다.선풍기는 ON 되는 순간 방향의 세기가 결정되어야 합니다.이처럼 공통 인터페이스가 없는 경우 위의 사진처럼 여러 클래스가 난잡해지는 문제가 발생합니다.하물며 고객은 나중에 다른 제품이 추가될 수 있게 확장성 있는 개발을 원합니..

    CHAPTER 05.싱글톤 패턴

    1.싱글톤 패턴이란싱글톤 패턴은 클래스 인스턴스를 하나만 만들고, 하나만 만든 인스턴스로의 전역 접근을 제공하는 패턴입니다.싱글톤 패턴 구현public class Singleton { private static Singleton uniqueInstance; // other useful instance variables here private Singleton() {} public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // other useful methods here }코드를 살펴보겠습니다.먼저 Singleton 클래스의 ..

    CHAPTER 04.팩토리 패턴

    팩토리 패턴 이해를 위한 간단한 문제 제안피자를 만드는 아래와 같은 코드가 있다고 가정해보겠습니다.public class PizzaStore { public Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } pizza.prepare();..