프록시 패턴 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미이다. 일종의 비서라고 생각하면 쉽다. 사장실에 바로 들어가서 사장님을 바로 만나는 게 아닌 비서를 통해 사장님을 만나는 개념이라 생각할 수 있다. 어떤 객체를 사용하고자 할 때, 객체를 직접 참조하는 것이 아니라 해당 객체를 대행하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다. 프록시가 사용되는 대표적인 3가지 가상프록시 꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을 때 사용하는 패턴이다. 프록시 클래스에서 자잘한 작업들..
의존성 주입(Dependency Injection) 이란? DI란 외부에서 두 객체 간의 관계를 결정해 주는 디자인 패턴으로, 인터페이스를 사이에 두어 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해 준다. 의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다. public class Shop { private Book book; } Shop 객체가 Book 객체를 사용하고 있는 경우에 Shop 객체가 Book 객체에 의존성이 있다고 표현한다. 그리고 두 객체 간의 관계를 맺어주는 것을 의존성 주입이라고 한다. Book book = new Book(); Shop shop = new Shop(book); 의존성..
옵저버 패턴 옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 어떤 객체의 변경 사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다. 옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고 1:N이 될 수 있다. 옵저버 패턴 사용 예시 공지사항을 알릴 때를 예제로 공지사항을 전파할 때(상태변화) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들 수 있다. public interface Observ..
빈(Bean) 등록과 조회 규칙 Spring은 기본적으로 메서드/클래스의 이름을 Bean의 이름으로 사용한다. @Bean public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } 직접 빈의 이름을 부여할 수 있다. @Bean("fixDiscountPolicy") public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } @Bean("rateDiscountPolicy") public Discou..
소프트웨어 개발 과정에서 코드의 유연성과 재사용성은 매우 중요하다. 이를 위해 객체 지향 프로그래밍에서 다양한 디자인 패턴들이 개발되었는데, 그중에서도 전략 패턴은 유연한 소프트웨어 설계를 구현하는 핵심적인 기법 중 하나이다. 전략 패턴은 알고리즘을 독립적으로 정의하고, 실행 시에 필요한 알고리즘을 동적으로 변경할 수 있는 방법을 제공한다. 전략 패턴 전략 패턴은 알고리즘을 정의하는 인터페이스를 만들고, 이를 구체적인 알고리즘 클래스들로 구현하여 실행 시에 알고리즘들을 변경할 수 있도록 한다. 이를 통해 동일한 작업을 수행하는 여러 알고리즘들을 쉽게 추가하고 변경할 수 있다. 이를 통해 코드의 유연성과 확장성을 크게 향상할 수 있다. 아래와 같은 구조를 가진다. 시나리오는 간단하다. 쇼핑카드에 여러 가지..
오늘은 6장의 내용을 정리하였다. 유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. - 헤라클레이토스 기능 설계 vs 구조 설계 기능 측면의 설계 제품이 사용자를 위해 무엇을 할 수 있는가에 초점 구조 측면의 설계 제품의 형태가 어떠해야 하는지에 초점 -> 기능과 구조 두 측면이 조화를 이루도록 만들어야 한다. 훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건 소프트웨어가 사용자에게 가치 있는 이유는 사용자가 필요로 하는 기능을 제공하기 때문이다. 객체지향 접근방법 변경에 대비하고 변경의 여지를 남겨놓는 가장 좋은 방법은 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계하는 것 안정적인 객체 구조를 바탕으로 시스템 기능을 객체간..
단위 테스트 vs 통합 테스트 차이 단위 테스트(Unit Test) 단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메서드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위테스트가 될 수 있다. 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다. 통합 테스트(Integration Test) 통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다..
개발일기(23.5.7) 나름 오랜만에 개발일기를 작성하게 되었다. 우선 저번 개발일기 이후의 삶은 살짝은 느슨해졌다는 느낌을 스스로 받았다. 저번 개발일기에는 최종 결과를 덤덤하게 받아들이고 다시 추스르고 쉽게 일어날 것처럼 작성하였지만 그 과정이 생각보다 쉽지 않았다. 살짝의 번아웃이 온 것 같았다. 그래도 다행인 것은 개발이 재미없거나 하기 싫다는 감정이 아닌 단순히 무엇을 해야 할지 모르는 막막함이었다. 합격이라는 목표를 가지고 도전하였지만 떨어지니 목표를 잃어버린 느낌이었고 무엇을 준비하고 공부해야 할지 막막하였다. 그렇게 조금은 쉬어가며 재정비하는 시간을 가진 것 같다. 이후 중간고사 기간이 다가와서 중간고사 준비를 하며 살아온 것 같다. 스스로 생각하기에 CS도 매우 중요하기에 학교 수업도 열..
Spring에서 수동으로 빈을 등록할 때 @Configuration 클래스 안에서 @Bean을 사용해야 한다. 그 이유를 알아보자. @Configuration안에서 @Bean을 사용해야 하는 이유 스프링에서는 일반적으로 컴포넌트 스캔을 사용해 자동으로 빈을 등록하는 방법을 이용한다. 하지만 @Bean 어노테이션을 사용해 수동으로 빈을 등록해야 하는 경우도 있다. 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때 다형성을 활용하여 여러 구현체를 등록해주어야 할 때 @Bean을 이용한 수동 빈 메서드는 스프링 빈 안에만 구현해 되어 있다면 모두 동작한다. 하지만 스프링은 @Bean은 반드시 @Configuration 어노테이션을 활용하도록 강조한다. ..
기존의 Spring MVC는 xml을 활용하여 bean을 등록했다. 하지만 프로젝트 규모가 커지면서 사용하는 요소들을 xml에 등록하는 것은 상당히 번거로워졌다. 따라서 어노테이션을 활용하여 Bean을 등록하는 방법이 생겨났다. Spring Bean Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. POJO(Plain Old Java Object)로써 Spring 애플리케이션을 구성하는 핵심 객체이다. Spring IoC 컨테이너(또는 DI 컨테이너)에 의해 생성 및 관리된다. class, id, scope, constructor-arg 등을 주요 속..