디자인 패턴과 아키텍처
소프트웨어 아키텍처
정의
소프트웨어 시스템의 기본 구조와 시스템을 만드는 분야
소프트웨어의 뼈대나 고수준의 기반을 담당함
소프트웨어 아키텍처 패턴 예시
- MVC 패턴
- layered 패턴
- event-bus 패턴
- p2p 패턴
- interpreter 패턴
- pipe-filter 패턴
소프트웨어 디자인 패턴
주어진 상황에서 일반적으로 발생하는 문제에 대한 재사용 가능한 솔루션
여러 상황에서 사용할 수 있는 문제 해결법이나 템플릿을 의미함
소프트웨어 디자인 패턴의 예시
- 싱글톤 패턴
- 팩토리 메서드 패턴
- 추상 팩토리
Spring의 아키텍처 패턴 : MVC
servlet
Java 웹서버에서 동적 컨텐츠를 제공하는 기술
- 특정 HTTP 메서드를 처리 가능
- 서블릿을 관리하는 서블릿 컨테이너 (톰캣, 제티 등)이 존재
- 특정 URL을 매핑하여 처리
- 생명주기 (init - service - destroy)를 갖는다
MVC
Model - View - Controller로 구분하는 아키텍처
- Model : 데이터 상태 관리 및 비즈니스 로직 처리
- @Service, @Repository, DTO
- View : 데이터 출력 및 UI 관리
- Thymeleaf, JSP (Java Server Page), HTML, React 등
- Controller : 요청 처리 및 View와 Model의 중간다리 역할
- @Controller, @RestController
MVC 종류
- mvc1 : controller와 view를 JSP로 처리
- mvc2 : controller는 servlet이 처리하고, view는 JSP가 처리자인 패턴과 아키텍처
Spring MVC 아키텍처 흐름
- DispatcherServlet이 HandlerMapping을 통해 요청을 처리하는 Handler(컨트롤러)와 interceptor 목록을 갖는 HandlerExecutorChain을 생성
- DispatcherServlet이 Handler를 실행하기 위해 HandlerExecutorChain에서 HandlerAdaptor를 가져옴
- HandlerAdaptor를 통해 Handler를 실행하고, 결과물인 ModelAndView를 가져옴
- DispatcherServlet은 ModelAndView를 통해 view name을 얻고, 이를 ViewResolver에 전달하여 view를 얻어서 view.render()를 통해 뷰를 실행'
Spring의 디자인 패턴 : 싱글톤
Java의 싱글톤 패턴
Java의 싱글톤 패턴은 객체를 하나만 생성하고, 최초 생성 이후 접근자를 통해 최초 생성된 객체를 리턴함
객체의 중복 생성을 방지하기에 메모리 낭비를 줄일 수 있음
class Practice {
Practice practice = new Practice();
private Practice(){}
public static Practice getInstance(){
return this.practice;
}
}
단점
- 내부 속성 변경과 초기화가 어려움
- 싱글톤 패턴 구현을 위한 추가 코드가 필요함
- private 생성자를 사용하기에 상속 등을 사용하기 어려움
Spring의 싱글톤 패턴
Spring의 스프링 컨테이너는 싱글턴 패턴을 수동으로 적용하지 않아도 객체를 싱글톤으로 관리한다.
따라서 싱글톤 패턴의 단점을 상쇄시킬 수 있다.
다만, Spring의 싱글톤은 모든 스레드가 동일한 객체를 공유하므로 객체 상태가 stateful하면 안된다
만약 싱글톤인 객체가 상태를 가져야 한다면, ThreadLocal 등을 통해 스레드에 종속되는 값을 갖도록 해야 한다.
'Spring' 카테고리의 다른 글
| [ Spring Boot ] JPA 연관 관계 매핑 (1) | 2025.08.26 |
|---|---|
| [ Spring Boot ] 스트리밍 서비스에서 Buffer Pool로 ByteBuffer 관리 (6) | 2025.07.29 |
| [ Spring Boot ] 웹소켓 통신에서 메모리 누수 제어 (3) | 2025.07.21 |
| [Spring Boot] Spring Boot 설정 파일 분리 : submodule (0) | 2025.03.31 |