본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 49일차 (2023-07-31) 자바 프로그래밍_53. 리스너 실행에 Facade 패턴 적용하기_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 7. 31.

 

## 53. 리스너 실행에 Facade 패턴 적용하기

- GoF의 Facade 패턴의 동작원리 이해와 적용하는 방법
- ActionListener 실행에 Facade 객체를 사용

 

ㄴ HelloListener.java 파일을 복사

 

ㄴ bitcamp.report.util 패키지에 HelloListener.java 파일을 붙여넣고 Refactor 를 이용해 DispatcherListener 라는 이름으로 Rename 해주기

 

DispatcherListener.java

ㄴ 위와 같이 수정해주기

 

ServerApp.java

ㄴ DispatcherListener 를 facadeListener 라는 이름으로 인스턴스화되고 초기화해줌

 

DispatcherListener.java

ㄴ Application 공통 객체를 보관하는 저장소를 준비

ㄴ Map 에 저장하도록 함

 

ServerApp.java

ㄴ facadeListener 를 이용하도록 함

 

Menu.java

ㄴ path 라는 필드 생성 => 메뉴를 식별하는 경로를 의미함

ㄴ title 필드 => 메뉴의 제목을 의미함

 

Menu.java

ㄴ 생성자에서 path와 title 필드를 초기화하도록 함

 

Menu.java

ㄴ path와 title 필드를 전달 받아 초기화하고, 추가적으로 addActionListener() 메서드를 호출하여 listener를 액션 리스너로 등록하도록 함

 

Menu.java

ㄴ Prompt 객체(prompt)에 menuPath라는 이름의 속성을 설정하고, this.path 값을 해당 속성에 저장하고 있음

ㄴ this.path는 현재 Menu 객체의 경로를 나타내는 문자열임

 

MenuGroup.java

ㄴ MenuGroup 클래스의 생성자는 두 개의 매개변수(path와 title)를 받아 부모 클래스인 Menu의 생성자를 호출하고, 자식 메뉴들을 담을 리스트인 childs를 초기화하는 역할을 수행함

 

ServerApp.java

ㄴ path 를 넘겨주도록 함

 

ServerApp.java

ㄴ 메인은 path 를 "/" 로 설정

 

DispatcherListener.java

ㄴ menuPath 의 속성 값을 출력하도록 함

=>

ㄴ 각 메뉴별로 menuPath 의 속성 값을 출력함을 확인

 

DispatcherListener.java

ㄴ 기본 생성자 추가

 

ServerApp.java

ㄴ 해당 코드 잘라내기

 

DispatcherListener.java

ㄴ 생성자에 잘라낸 코드 붙여넣기

 

DispatcherListener.java

ㄴ ServerApp 에서 해당 코드 잘라내와서 붙여넣기

 

DispatcherListener.java

ㄴ throws Exception 구문을 사용하여 예외를 던지도록 선언

 

DispatcherListener.java

ㄴ builder 를 따로 생성하지 말고 한 줄로 선언하도록 함

 

DispatcherListener.java

ㄴ InputStream 을 따로 생성하지 말고 한 줄로 선언하도록 함

 

DispatcherListener.java

ㄴ Mybatis 와 Dao 를 준비하는 코드를 각각 정리

 

DispatcherListener.java

ㄴ beanContainer 라는 이름으로 객체 보관소 이름을 변경

 

DispatcherListener.java

ㄴ Listener 준비하도록 함

ㄴ member 와 item 은 ListListener 와 DetailListener 에 sqlSessionFactory 를 넘겨줄 필요가 없음

ㄴ board 와 notice 는 category 도 넘겨줘야 함

ㄴ board 에서 DetailListener 에서는 sqlSessionFactory 를 넘겨줘야 함

 

DispatcherListener.java

ㄴ beanContainer에서 menuPath에 해당하는 객체를 가져온 뒤, ActionListener로 캐스팅하여 listener 변수에 대입

 

DispatcherListener.java

ㄴ beanContainer 에서 menuPath 에 해당하는 객체를 가져왔을 때 해당 값이 null 이라면 "해당 요청을 처리할 수 없습니다." 라는 문구를 출력하며 예외를 던지도록 해줌

 

DispatcherListener.java

ㄴ 예외가 발생하지 않고 beanContainer 에서 menuPath 에 해당하는 객체가 null 이 아니라면 해당 ActionListener 를 실행하도록 함

=>

DispatcherListener.java

ㄴ try ~ catch 대신 IOException 을 이용하여 예외를 던지는 방법을 이용하도록 함

 

ServerApp.java

ㄴ Prompt 객체(prompt)에 "menuPath"라는 속성을 "login"이라는 문자열로 설정한 뒤, facadeListener라는 객체에 prompt를 전달하여 service 메서드를 실행하도록 함

 

DispatcherListener.java

ㄴ 로그인을 위한 Listener 준비

 

DispatcherListener.java

ㄴ 객체 보관소 beanContainer 에 sqlSessionFactory 넣기

 

DispatcherListener.java

ㄴ 객체 보관소 beanContainer 에 각각의 memberDao, itemDao, boardDao 객체를 저장하도록 함

 

DispatcherListener.java

ㄴ beanContainer 에서 특정 이름(name)에 해당하는 객체를 가져오는 메서드인 getBean()을 정의

 

ServerApp.java

 

ㄴ finally 블록에서 facadeListener 객체를 통해 SqlSessionFactoryProxy를 가져와서 clean() 메서드를 호출하도록 함

 

DispatcherListener.java

ㄴ 인스턴스 생성이 필요 없으므로 해당 선언 모두 제거

 

DispatcherListener.java

ㄴ SqlSessionFactory, MemberDao, ItemDao, BoardDao 모두 각각 선언해주기

=>

ㄴ 실행 시 결과 제대로 출력됨을 확인

 

MenuGroup.java

ㄴ add 메서드를 복사해서 바로 아래에 붙여넣기

 

MenuGroup.java

ㄴ 해당 add 메서드를 호출하면 새로운 Menu 객체가 생성되어 MenuGroup 객체의 childs 리스트에 추가되며, 해당 Menu 객체는 menuPath, title, 그리고 listener와 관련된 동작을 수행할 수 있도록 함

 

ServerApp.java

=>

ㄴ 모든 목록이 제대로 출력됨을 확인할 수 있음