본문 바로가기

분류 전체보기

(79)
스테이트 패턴(State Pattern) 스테이트 패턴(상태 패턴) 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. ​ 스테이트 패턴을 사용하지 않았을 때 자판기가 있고 동전을 넣은 후 버튼을 누르면 물병이 나오는 시스템을 구현해본다. public class VendingMachine { final static int NO_COIN = 0; final static int HAS_COIN = 1; final static int SOLD = 2; int state = NO_COIN; public VendingMachine() { } public void insertCoin() { if (state == NO_COIN) { System.out.println("동전을 넣습니..
컴포지트 패턴(Composite Pattern) 컴포지트 패턴 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 이터레이터 패턴에서 구현한 예제에서 만약 점심, 저녁 메뉴에 디저트 메뉴들을 추가해야 한다고 가정해보자. 이럴 때 컴포지트 패턴을 구현한다면 다른 메뉴들을 추가하더라도 처음부터 구현할 필요 없이 간단하게 구현할 수 있다. Component Component는 Composite와 Leaf의 부모가 되고 해당 두 객체가 가질 수 있는 동작들을 가지고 있다. Composite Composite는 Component를 컬렉션으로 가지고 있다. 즉 자기 자신인 Composite와 Leaf를 가질 수 있는 것이다..
스프링 부트 자동설정 @SpringBootApplication @SpringBootApplicaiton SpringBootApplication Annotation의 Meta Annotation인 @ComponentScan과 @EnableAutoConfiguration에 대해 알아본다. 스프링 부트로 프로젝트를 생성하여 메인 클래스에 가면 @SpringBootApplication annotation이 있다. 이 annotation을 확인해보면 아래와 같이 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan이 존재한다. @ComponentScan ComponentScan에서는 지정된 타켓 패키지 이하를 스캔하며 @Component Annotation이 붙어 있는 대상들을 빈을 등록해준다. @Contro..
SpringBoot와 Vue.js 연동하기 Vue.js 프로젝트 빌드 시 스프링 부트 프로젝트 resouces/static 이하에 빌드되게 설정하는 게시글 SpringBoot 프로젝트 생성 스프링 부트 스타터 해당 링크를 들어가면 스프링 부트 프로젝트를 생성할 수 있다. Spring Initializr를 이용하여 위와 같이 Spring Web만 의존성 추가한 후 Generate를 클릭하여 프로젝트 파일을 다운로드한다. 다운로드한 프로젝트 파일을 인텔리 J로 실행시킨 후 서버를 띄워 프로젝트가 정상 동작하는지 확인한다. 앱이 정상적으로 구동되는 것을 확인하였다. 그럼 이제 Vue프로젝트를 다운로드한다. Vue 프로젝트 생성 Node.js 공식사이트 우선 Vue 프로젝트를 생성하기 위해선 Vue CLI가 필요하고 Vue CLI를 다운로드하기 위해 N..
스프링 AOP AOP(Aspect-Oriented Programming) OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다. 왼쪽 그림의 A, B, C Class에서 같은 색의 띠가 공통되는 로직이라고 생각해보자. 만약 노란색 띠의 로직의 문제가 생긴다면 A, B, C Class 제각각 수정을 해야 한다. 공통되는 로직들을 오른쪽 그림처럼 한 곳에 모아 모듈로 간편하게 만들어 사용하는 것을 AOP라고 한다. 보안, 로깅, 트랜잭션 등에 주로 사용하는 것으로 알고 있다. AOP의 주요 개념 Aspect Advice와 PointCut을 합친 개념이다. Advice 해야 할 일들을 담고 있는 모듈 Target 적용이 되는 대상 PointCut 어드바이스를 어디에 적용을 해야 하는지에 ..
SpEL(Spring Expression Language) SpLE(Spring Expression Language) 스프링 3.0부터 지원 객체 그래프를 조회하고 조작하는 기능을 제공한다. Unified EL과 비슷하지만, 추가적으로 메서드 호출, 문자열 템플릿 기능을 제공한다. SpLE은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다. 예제 application.properties나 빈으로 등록된 클래스의 값들을 SpLE를 통해 받아올 수 있다. 값을 사용할 수 있는 다양한 방법들이 존재한다. 빨간 박스처럼 properties값들을 받아올 수 있다. 그리고 파란 박스에서는 빈으로 등록된 데이터를 받아온 것을 알 수 있다. #{ }으로 표현식 을 사용할 수 있고, ${ }으로 property를 참고할 수 있다. 참고 #{ ${ } }이런 식으로 표현..
이터레이터 패턴(Iterator Pattern) 이터레이터 패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 준다. Clinet는 추상화된 Aggregate와 Interator만 참조하여 원하는 기능을 수행할 수 있다. 예제 가게에서 점심 메뉴는 List로 구현하고 저녁 메뉴는 HashMap으로 구현되어 있다고 하자. 두 메뉴를 한 번에 나타내고 싶다고 하였을 때 이터레이터 패턴을 사용할 수 있다. Aggregate public interface Menu { public Iterator createIterator(); } Iterator를 생성하는 인터페이스가 된다. Iterator는 자바에서 제공하는 API이다. ConcreteAggregate public class MenuIt..
템플릿 메서드 패턴(Template Method Pattern) 템플릿 메서드 패턴 상위 클래스에서는 동작상의 알고리즘의 뼈대를 정의하고 그 구현을 서브 클래스에서 하는 패턴 템플릿 메서드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브 클래스에서 특정 단계를 재정의할 수 있다. AbstractClass의 templateMethod()에는 알고리즘의 골격이 정의되어 있다. 모든 객체들이 공통으로 수행하는 작업은 AbstractClass에서 수행한다. 그 후 나머지는 abstract 메서드로 구현하여 서브 클래스에서 구현하게 만든다. ​예제 AbstractClass public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourInCup(); // hook i..