단일 서비스 아키텍처
• 모든 기능(블로그, 메일, 카페 등)을 하나의 애플리케이션에 포함해 개발
• 서비스가 많아질수록 유지보수가 어려워지고 전체 배포 시간이 길어짐
마이크로서비스 아키텍처(MSA)
• 각 기능을 별도의 독립적인 서비스로 나누어 개발
• 서버 간 통신 필요 → 일반적으로 HTTP/HTTPS 사용
• 장점: 독립 배포, 확장 용이, 장애 격리
• spring-boot-starter-web 사용 시 Tomcat을 내장 WAS로 포함
• DispatcherServlet의 요청 흐름:
1. 클라이언트 요청 → DispatcherServlet 진입
2. URI 기반 핸들러 매핑 (HandlerMapping)
3. 핸들러 어댑터(HandlerAdapter)가 컨트롤러 호출
4. ModelAndView 생성 후 ViewResolver로 뷰 결정
5. View 반환
RESTController 사용 시
• 뷰를 사용하지 않고 MessageConverter를 통해 JSON 등으로 응답
• @ResponseBody에 의해 자동 적용됨
일반적인 3계층 구조
Presentation Layer (UI): Controller, 사용자 요청 처리
Business Layer (Service): 비즈니스 로직 처리
Data Access Layer (DAO/Repository): 데이터베이스 연동
▷ 생성 패턴
팩토리 메서드: 객체 생성 로직을 하위 클래스에 위임하여, 새로운 객체 생성 로직이 필요할 때 코드 변경 없이 확장 가능
예시: Spring에서 Bean 생성 시 실제 구현체를 외부 설정 파일이나 팩토리 클래스에 맡김으로써 유연성 확보
예시 코드:
interface Product { void use(); } class ConcreteProduct implements Product { public void use() { System.out.println("Product 사용"); } } abstract class Creator { abstract Product factoryMethod(); public void operate() { Product p = factoryMethod(); p.use(); } }
싱글턴: 프로그램에서 단 하나의 인스턴스만 존재하게 보장하는 패턴
사용 예: DB 커넥션 풀, 설정값 관리 객체, Logger 등 공유 자원에서 많이 사용됨
주의점: 멀티스레드 환경에서는 동기화 이슈 발생 가능 → synchronized, enum 싱글턴 방식으로 해결
예시 코드:
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
▷ 구조 패턴
프록시(Proxy): 실제 객체를 대신하여 요청을 가로채거나 기능을 부가한 대리 객체
예시: API 호출 전에 캐시된 결과를 리턴하거나, 권한 체크, 지연 로딩 등에 활용
실체 객체를 직접 사용하지 않고 필요한 시점에 로딩함으로써 효율성과 보안성 확보
예시 코드:
interface Service { void run(); } class RealService implements Service { public void run() { System.out.println("실제 서비스 동작"); } } class ProxyService implements Service { private RealService realService = new RealService(); public void run() { System.out.println("프록시 사전 처리"); realService.run(); System.out.println("프록시 후처리"); } }
▷ 행위 패턴
템플릿 메서드: 알고리즘의 기본 구조를 상위 클래스에서 정의하고, 세부 구현은 하위 클래스가 담당
공통되는 로직은 추상화하여 코드 중복 최소화, 특정 단계만 오버라이딩하여 재사용성 극대화
예시: AbstractController에서 doGet(), doPost()를 템플릿으로 제공하고 세부 로직은 상속 클래스에서 구현
예시 코드:
abstract class Template { public final void process() { step1(); step2(); } abstract void step1(); abstract void step2(); } class SubProcess extends Template { void step1() { System.out.println("1단계 실행"); } void step2() { System.out.println("2단계 실행"); } }
2.5.1 REST란?
• Representational State Transfer의 약자
• URI로 자원을 식별하고 HTTP 메서드(GET, POST, PUT, DELETE)로 상태 조작
2.5.2 REST API란?
• REST 아키텍처 스타일을 따르는 API
• 시스템/애플리케이션이 서로 통신하기 위한 인터페이스로 RESTful하게 구성
2.5.3 REST의 특징
• 유니폼 인터페이스: 일관된 HTTP 표준 사용
• 무상태성: 서버가 클라이언트 상태를 저장하지 않음
• 캐시 가능: 응답 캐시를 통해 성능 최적화 가능
• 레이어 시스템: 네트워크 상 여러 계층 구성 가능
• 클라이언트-서버 구조 : 사용자 정보와 처리 로직 분리 설계