Spring - Design Pattern

문지원(JiwonMoon)·2022년 1월 14일
0

Spring

목록 보기
5/10
post-thumbnail

디자인 패턴(Design Pattern) 이란?

디자인 패턴은 과거의 SW 개발 과정에서 발견한 설계의 노하우를 일종의 패턴으로 정리해 놓은 것이다.

디자인 패턴이 왜 필요할까?

현업 종사자들의 말들을 들어보면, 혼자서 개인 프로젝트를 진행하는 것과 달리 협업과 그로 인한 코드 관리의 중요성을 뼈저리게 느끼게 된다고한다.

이 때문에 디자인 패턴을 학습하는 것이 쉽지만은 않지만,
복잡한 구조를 한 단어로 정의함으로서 개발자들이 협업을 할 때에 의사소통을 효율적으로 할 수 있다. 또한 기존 코드의 문제점에 대해서 검증된 방법으로 해결 방안을 찾을 수 있어 효율적인 개발과 코드 개선의 도움을 준다.

요리 - 객체지향 프로그래밍(OOP)
요리도구 - 객체지향 4대 특성(캡슐화,상속,추상화,다형성)
요리도구 사용법 - 객체지향 설계 원칙(SOLID)
레시피 - 디자인 패턴

1. 싱글톤 패턴(Singleton Pattern)

인스턴스 하나만 만들어 사용하기 위한 패턴
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴으로 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고,
최초 생성 이후에 호출된 생성자는 생성한 객체를 반환한다.

스프링에서는 클래스 자체에 의해서 생성하지 않고, 스프링 컨테이너에 의해 구현이 된다. 스프링에서는 컨테이너 내에서 특정 클래스에 대해 @Bean이 정의되면, 스프링 컨테이너는 그 클래스에 대해 하나의 인스턴스를 만든다. 이 공유 인스턴스는 설정 정보에 의해 관리되고, bean이 호출될 때마다 스프링은 생성된 공유 인스턴스를 반환한다. 이미 생성된 공유 인스턴스를 반환하기 때문에 싱글턴 패턴과 동일하다.
많은 트래픽 문제에 해결방안으로 제시될 수 있다.

문제발생 : 고객의 트래픽이 초당 10000이 나오면 초당 10000개의 객체가 생성되고 소멸된다.➡ 메모리 낭비
해결방안 : 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. ➡ 싱글톤 패턴

즉, 하나의 인스턴스를 통해 여러 생성자의 호출을 처리하는 패턴이다.
또한 싱글톤 패턴의 개념은 의존성 주입과도 연관되어 있다. Bean에 대한 설정은 아래 내용에서 참고하면 된다.

https://velog.io/@mon99745/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%8B%B1%EA%B8%80%ED%86%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

장점

  • 메모리 효율성
    하나의 인스턴스를 만들기 때문에 메모리측면의 이점이 존재한다.

  • 속도측면의 이점
    하나의 인스턴스를 통해 여러차례의 호출을 받기 때문에 속도측면의 이점이 존재한다

  • 데이터 공유가 쉬움
    전역으로 사용되는 인스턴스이기 때문에 데이터 공유가 쉽다
    하지만, 동시성 문제로 이어질 수 있기 때문에 유의하여 설계해야 한다

싱글톤 패턴의 문제점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.

    <기본적으로 아래의 3가지가 들어가게 된다.>

    1. static 필드로 해당 인스턴스를 미리 생성해두고,
    2. 만들어둔 인스턴스의 참조를 반환하는 메서드를 정의
    3. private 생성자
  • 의존관계상 클라이언트가 구체 클래스에 의존한다 ➡ DIP를 위반한다.

  • 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.

    • 구체 클래스가 바뀌면 클라이언트 코드도 바뀌어야하기 때문에 ➡ OCP 위반
  • 테스트하기 어렵다.

  • 내부 속성을 변경하거나 초기화 하기 어렵다.

  • private 생성자로 자식 클래스를 만들기 어렵다.

  • 결론적으로 유연성이 떨어진다.

  • 안티패턴으로 불리기도 한다

    • 안티패턴이란? 실제 많이 사용되는 패턴이지만 비효율적이거나 비생산적인 패턴을 의미한다.

2. 프록시 패턴(Proxy Pattern)

'프록시' 라는 말은 어떠한 것을 대리로 수행하는 것을 가리키는 용어로 프록시 패턴은 어떤 객체에 대한 접근을 제어하기 위한 용도로,
실제 객체의 메서드를 호출하면 그 호출을 중간에 가로채는 패턴이다.

즉, 제어 흐름을 조정하기 위해 중간에 대리자를 두는 패턴

스프링에선 AOP(관점 지향 프로그래밍)를 통해서 이런 공통적인 기능들을 별도로 분리해 필요한 곳에서 재사용이 가능하다.

AOP(Aspect Oriented Programming)란?
https://velog.io/@mon99745/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EC%9B%B9-MVC-DB%EC%A0%91%EA%B7%BC-%EA%B8%B0%EC%88%A0-AOP

3. 템플릿 메소드 패턴(Template Method Pattern)

슈퍼클래스에 기본적인 로직의 흐름을 작성하고, 일부 변경이 필요한 부분은 서브클래스에서 추상메소드로 오버라이딩하여 사용할 수 있는 형태로 서브클래스에서 필요에 맞게 이를 구현하여 사용하는 디자인 패턴으로 서로 다른 유사한 컴포넌트가 있을 때, 구성요소의 대부분을 동일하게 하고 일부만 다르게 하여 중복을 최소화할 때 사용한다.

ex) Spring JDBC를 사용하는 경우 JdbcTemplate, JmsTemplate, JpaTemplate 등 클래스는 템플릿 메소드 패턴 방식으로 구현되어 있다.

즉, 동일한 기능을 상위 클래스에서 정의하며, 확장/수정이 필요한 부분만 서브클래스에 구현하는 패턴이다.

4. 팩토리 메소드 패턴(Factory Method Pattern)

팩토리 메소드 패턴이란 객체 생성 처리를 서브 클래스로 분리하여 처리하도록 캡슐화 패턴이다.
즉, 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 대비하여 유용하게 사용할 수 있다.

즉, 객체를 생성하는 클래스를 분리 구현하는 패턴이다.
팩토리 패턴의 장점

  • 비슷한 성격의 객체를 인터페이스를 통해 하나로 관리할 수 있다.
  • 협업시 공통코드를 건드리는 일이 없이 업무를 진행할 수 있다.
  • 추수 비슷한 유형의 객체가 생성되어도 implement를 통해 쉽게 추가할 수 있다.

팩토리 메소드 패턴 사용 방법
1. 요구사항을 담을 interface 정의
2. interface를 상속받아 구현하는 Class 정의
3. 파라미터에 따라 구현한 Class 객체를 반환해주는 Factory Class 정의
4. Factory Class를 통해 객체를 받아 사용

References (참고 자료)

1개의 댓글

comment-user-thumbnail
2023년 3월 19일

스프링의 JdbcTemplate, JmsTemplate 등은 Template/Callback 패턴으로 작성되어있습니다. 이름에는 Template이 들어가지만 이는 Template Method Pattern이 아닌 Strategy 패턴을 이용합니다. Template/Callback 패턴은 전략 패턴의 특별한 방식(메소드가 하나인)을 가리키는 말입니다.

답글 달기