일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- GObenchmark
- golang벤치마크
- line챠트
- GO부하테스트
- vue3 axios
- Iperf3
- vue3
- vue3-chartjs
- Golang디자인패턴
- 디자인패컨
- 챠트그리기
- Golang성능테스트
- Vue.js
- GO벤치마킹
- 대역폭측정하기
- go로드맵
- vue3 통신
- snoflake
- pprof
- Go디자인패턴
- Go성능테스트
- golang uuid
- 리플렉션성능
- Golang부하테스트
- Line차트
- 디자인패턴학습필요성
- Golang벤치마킹
- go리플렉션성능
- Golangbenchmark
- Go벤치마크
- Today
- Total
import ( "코딩", "행복", "즐거움" )
퍼사드 패턴(Facade Pattern) 본문
퍼사드 패턴(Facade Pattern)은 객체지향 프로그래밍에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 서브시스템(subsystem) 내의 인터페이스 집합을 단순화시키는 역할을 합니다.
서브시스템은 서로 다른 클래스나 모듈 등으로 구성되어 있으며, 각각의 클래스나 모듈은 서로 다른 인터페이스를 가지고 있습니다. 이 때, 서브시스템의 클라이언트(client)가 각 인터페이스를 모두 알아야 하는 문제가 발생할 수 있습니다. 이런 문제를 해결하기 위해 Facade 패턴은 서브시스템 내의 복잡한 인터페이스를 단순한 하나의 인터페이스로 제공합니다. 이렇게 제공된 단순한 인터페이스를 이용하여 클라이언트는 서브시스템 내의 기능을 사용할 수 있습니다.
예를 들어, 어떤 웹 서비스를 구현할 때, 데이터베이스, 웹 서버, 캐싱 등의 서브시스템을 사용할 수 있습니다. 이때 Facade 패턴을 이용하면, 웹 서비스의 클라이언트는 단순한 인터페이스를 사용하여 서브시스템의 기능을 사용할 수 있게 됩니다. 이는 클라이언트가 서브시스템의 구조와 복잡한 인터페이스를 몰라도 웹 서비스를 사용할 수 있게 해줍니다.
package main
import "fmt"
// 서브시스템1
type subsystem1 struct{}
func (s *subsystem1) operation1() string {
return "Subsystem 1: Ready!"
}
// 서브시스템2
type subsystem2 struct{}
func (s *subsystem2) operation2() string {
return "Subsystem 2: Go!"
}
// 퍼사드 (Facade)
type facade struct {
subsystem1 *subsystem1
subsystem2 *subsystem2
}
func newFacade() *facade {
return &facade{
subsystem1: &subsystem1{},
subsystem2: &subsystem2{},
}
}
// 퍼사드 메서드
func (f *facade) operation() string {
result := "Facade initializes subsystems:\n"
result += f.subsystem1.operation1()
result += "\n"
result += f.subsystem2.operation2()
return result
}
func main() {
f := newFacade()
fmt.Println(f.operation())
}
위 코드는 퍼사드 패턴을 구현한 간단한 예제입니다. 서브시스템1과 서브시스템2는 각각 operation1()과 operation2() 메서드를 가지고 있으며, 퍼사드는 이 두 메서드를 호출하여 결과를 반환합니다.
newFacade() 함수는 퍼사드를 생성하고, operation() 메서드는 서브시스템의 메서드를 호출하여 결과를 문자열로 반환합니다. main() 함수에서는 퍼사드를 생성하고, operation() 메서드를 호출하여 결과를 출력합니다.
위의 개념을 좀더 이해하기 위해 실제 환경과 비슷한 개념의 코드를 작성해 보겠습니다.
package main
import "fmt"
// CPU
type CPU struct{}
func (c *CPU) run() {
fmt.Println("CPU is running")
}
// Memory
type Memory struct{}
func (m *Memory) load() {
fmt.Println("Memory is loading")
}
// HardDisk
type HardDisk struct{}
func (h *HardDisk) read() {
fmt.Println("HardDisk is reading")
}
// Facade
type Computer struct {
cpu *CPU
memory *Memory
hardDisk *HardDisk
}
func NewComputer() *Computer {
return &Computer{
cpu: &CPU{},
memory: &Memory{},
hardDisk: &HardDisk{},
}
}
func (c *Computer) Run() {
fmt.Println("Computer is starting...")
c.cpu.run()
c.memory.load()
c.hardDisk.read()
fmt.Println("Computer is shutting down...")
}
func main() {
computer := NewComputer()
computer.Run()
}
위 코드는 컴퓨터 시스템을 간단한 퍼사드 패턴으로 구현한 예제입니다. CPU, Memory, HardDisk는 각각 실행, 로드, 읽기 동작을 하는 부품입니다. Computer는 이러한 부품들을 포함하는 퍼사드입니다.
NewComputer() 함수는 Computer를 생성하고, Run() 메서드는 Computer 부품들의 실행, 로드, 읽기 동작을 순차적으로 호출하여 컴퓨터를 실행시킵니다.
main() 함수에서는 NewComputer() 함수를 호출하여 Computer를 생성하고, Run() 메서드를 호출하여 컴퓨터를 실행시킵니다.

'소프트웨어 아키텍처' 카테고리의 다른 글
테스트까지 작성하고 이해하는 레이어드 아키텍처 (2) | 2023.03.13 |
---|---|
플라이웨이트 패턴 (0) | 2023.03.09 |
데코레이터 패턴(Decorator Pattern)?? (0) | 2023.02.27 |
디자인 패턴 학습의 필요성에 대해서 ... (0) | 2023.02.23 |
계층화 아키텍처 (Layered Architecture) (0) | 2023.02.08 |