🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

프론트 컨트롤러/ 싱글톤/팩토리 패턴 이해하기

서화 2025. 11. 28. 21:32

 프론트 컨트롤러 개념 복습

  • 데이터를 Request에서 가져와서 자바에서 사용할 수 있게 바꾸는 것을 파싱(parsing) 한다고 한다
  • 컨트롤러 기능이 많아지면 유지보수가 어려워지기 때문에, 이제는 연관된 기능끼리 패키지로 묶어서 관리해야 한다.
  • Controller = Servlet 이고, 그 안에 요청을 모아서 처리하는 것을 Front Controller 패턴이라고 한다.

즉, 앞으로는 JSP → Servlet 여러 개 방식이 아니라 "모든 요청을 한곳에서 받아서 Action 객체에게 넘기는 방식" 으로 발전한다.


 필터(Filter) 설정 이유

  • web.xml에서 *.do 를 매핑한다.
  • 이렇게 하면 모든 요청이 .do 확장자로 들어오고, 공통 처리(인코딩 포함)를 필터에서 처리할 수 있다.

✔ 장점

  • 코드 중복 제거 → 결합도 낮춤, 응집도 높임
  • 유지보수 쉬움

동기 vs 비동기 요청 시 컨텍스트 경로 사용 여부

요청방식 예시컨텍스트  필요  여부이유
동기 로그인, 회원가입, 글쓰기 submit ❌ 필요 없음 톰캣이 실행 주체라 현재 위치를 알고 있음
비동기(AJAX) 검색 자동완성, 중복검사 ✔ 필요함 스크립트에서 호출 → 현재 컨텍스트를 알 수 없음

서블릿 매핑 규칙

<url-pattern>/JoinServlet</url-pattern> → 전 세계적인 약속
<url-pattern>*.do</url-pattern> → `/` 안 붙임 (왜냐하면 *가 모든 행동 수행하기 때문)

프론트 컨트롤러가 필요한 진짜 이유

지금까지는 요청마다 if문으로 분기 처리했다.

if(command.equals("MAIN")) { ...
} else if(command.equals("JOIN")) { ...
} else if ...

여기에는 문제점이 여러가지가 있다

  • 가독성이 떨어짐
  • 기능이 늘어날수록 else if 지옥
  • 객체를 매번 new → 메모리 낭비

여기서 등장한 개념이 바로 싱글톤 패턴(Singleton Pattern) 과 팩토리 패턴(Factory Pattern)이다


싱글톤 개념 정리

"하나만 있어도 되는 객체는 딱 하나만 유지해야 한다."

예시로 피카츄의 백만 볼트가 필요할 때 새로운 피카츄를 데려오는 게 아니라
이미 있는 피카츄를 다시 사용해야 한다.


 

Factory Pattern 적용

요청(command)에 따라 실행할 Action 객체를 반환해주는 구조 만들기.

public class ActionFactory {
	
	private Map<String, Action> map; //멤버변수
	//스트링 = 요청
	//액션 = 행동
	//a를 주면 애플을 준다
	//b를 주면 바나나를 준다
	
	public ActionFactory() {// 초기화
		map= new HashMap<>();
		//맵 = 추상클래스이기 때문에 해쉬맵으로 초기화한다
		
		map.put("/mainPage.do", new MainPageAction());
		//메인페이지 줘-> 메인페이지 액션 실행
		map.put("/write.do", new WriteAction());
		map.put("/deleteMember.do", new DeleteMemberAction());
		//내가 누를거 = 딜리트멤버 = 회원탈퇴
		//눌렀을때 실행될 행동 = 딜리트멤버액션 실행  = 회원탈퇴 기능실행
        
        // ★겟 액션 만들기
	public Action getAction(String commend) {
		return map.get(commend);
	}

}

command를 주면 Action을 준다 → setter/getter가 아니라 팩토리의 기능이다


NullPointerException 이 흔하게 발생하는 이유

개발자가 factory 객체를 생성하지 않아서 생기는 에러다

즉, 아래 코드가 없으면 에러 난다:

ActionFactory factory = ActionFactory.getInstance();

 Factory 패턴 적용 후 변화

Before After
else-if command 분기 ❌ 사라짐
new Action() 반복 생성 ❌ Factory에서 한 번만 생성
유지보수 불편 ✔ 요청 추가 시 map.put만 추가

성능 관점

  • 단점: 초기 로딩 속도 느릴 수 있음 (처음에 객체 다 만들기 때문)
  • 장점: 이후 모든 요청은 즉시 실행 → 성능 매우 높음

👉 그래서 Spring에서도 Bean 단위로 이 구조가 적용됨.


✨ 디자인 패턴 정리

패턴 설명
MVC 협업에 유리, 병렬 개발 가능
Singleton 객체 1개로 유지
Factory 명령 → 결과 Action 반환
Template Pattern 반복 로직 공통화 → JDBCUtil 같은 구조