Spring MVC
Spring MVC 프레임워크는 웹 어플리케이션을 빌드하기 위한 프레임워크로 MVC(Model, View, Controller) 디자인 패턴을 따른다.
Spring MVC 설정
web.xml
- Web Application 설정을 위한 Deployment Descriptor로 dispatcher-servlet을 호출
- 서버가 deploy할 때 웹 정보 설정
- 브라우저가 웹에 접근하기 위해서는 WAS에게 필요한 정보를 제공
WebInitializer.java로 작성가능
applicationContext.xml
- Web Application 최상단에 위치하고 있는 context
- BeanFactory를 상속받으며 필요한 설정정보를 담은 파일
- 여러 서블릿에서 공통적으로 공유해서 사용할 수 있는 Bean 선언
- @Service, @Repository, @Configuration, @Component
WebAppConfig.java로 작성가능
dispatcher-servlet.xml
- WAS가 사용자 요청을 받으면 제일 앞에서 모든 요청을 처리함
- 공통처리 작업을 처리한 후 적절한 세부 Controller로 작업을 위임
- HandlerMapping, @Controller, ViewResolver
DispatcherServletConfig.java로 작성가능
위의 .xml파일들을 읽으면서 Spring Container 생성

실행순서
- Web Application 실행
- WAS에 의해
web.xml(WebInitializer.java) 실행
ContextLoaderListner 생성
WebAppConfig.class등록으로 applicationContext.xml(WebAppConfig.java)로딩
applicationContext.xml(WebAppConfig.java)로 Container 설정
- 사용자 요청(http request) 발생 시
dispatcher-servlet.xml(DispatcherServletConfig.java)를 로딩하여 Container 설정
- 세부 Controller 동작
- 요청에 따라 View 또는 Service 수행
Spring Web 계층
Spring Web 계층에는 Presentation Layer, Business Layer, Persistence Layer가 존재하며 관심 분리를 통해 대상 계층에 집중이 가능해지고 모듈화로 재사용성이 증가하며 계층별 테스트가 용이해진다는 장점이 있다.
Presentation Layer
- 브라우저 상의 웹 클라이언트 요청 및 응답 처리
- 사용자 요청에 맞는
@Controller 호출
- Business Layer, Persistence Layer에서 발생하는 예외처리
- 인증이나 JSON 변환이 이루어짐
Controller, View 포함
Business Layer(Service Layer)
- 실제 비지니스 로직을 수행하는 컴포넌트
- 외부 API를 사용하거나 공통적으로 사용해야하는 작업을 처리
- Controller에서 요청을 보내면
DAO를 이용해 실제 비지니스 로직을 수행
DAO에서 받은 Entity의 유효성을 확인하고 DTO로 변환
- Persistence Layer와 Presentation Layer가 직접적으로 통신하지 않게 함
- 트랜잭션 관리
Service Interface, @Service
Persistence Layer
- Repository Layer 혹은 Data Access Layer라고 불림
- DB에 데이터를 CRUD(Create, Read, Update, Drop)하는 계층
DAO Interface, @Repository
Spring Model
Spring Model에는 Entity, DAO, DTO, VO가 있어 각 계층별로 사용하는 모델이 달라 데이터베이스에 저장된 정보 변환을 예방할 수 있다.
Entity
- 실제 데이터베이스와 일대일 매칭되는 클래스
- DB Table 내 존재하는 컬럼만을 속성으로 가져야 함
- 상속받거나 구현될 수 없으며 Presentation Logic을 가질 수 없음
객체의 일관성을 보장하기 위해 setter의 무분별한 사용을 금지함
- 구현 메소드는 주로 Service Layer에서 사용함
DAO(Data Access Object
- DB에 접근하기 위한 객체로
CRUD 기능을 수행
- DB 접근을 하기 위한 로직과 비지니스 로직을 분리하기 위함
Pa, Hibernate, MyBatis 등의 Persistence Framework를 통해 접근
DTO(Date Transfer Object)
- 계층간 데이터 교환을 위한 Java Beans
- 로직을 가지지 않는 순수한 데이터 객체로 getter/setter 메서드만 가짐
- 데이터 전송 객체라는 의미를 가지며 주로
비동기 처리시 많이 사용됨
VO(Value Object)
- literal 개념으로 값 그 자체의 의미를 가진 불변 클래스
Read-Only로 getter메서드만 가짐
equals(), hashcode() 오버라이딩을 통해 모든 값들이 같아서 동일 객체인지 판단