[boostcourse] 3.10. Layered Architecture - BE (1)

0. 배경

URL은 다르지만 중복되는 부분이 있다면?

중복되는 부분을 별도의 객체나 메소드로 분리해서 Controller에서 처리하도록

-> Service 객체로 구현하고 컨트롤러는 Service 객체를 사용하도록 함

 

1. Service 객체란?

- 비즈니스 로직을 수행하는 메소드를 가지고 있는 객체

- 보통 하나의 비즈니스 로직은 하나의 트랜잭션으로 동작함

 

2. 트랜잭션이란?

- 하나의 논리적인 작업

- 원자성, 일관성, 독립성, 지속성

 

JDBC 프로그래밍에서 트랜잭션 처리 방법

- DB에 연결된 후, Conenction 객체의 setAutoCommit 메소드에 false를 파라미터로 지정

- 입력, 수정, 삭제 SQL을 실행한 후, 모두 성공했을 경우 Connectino이 가지고 있는 commit() 메소드를 호출함

 

@EnableTransactionManagement

- Spring Java Config 파일에서 트랜잭션을 활성화할 때 사용하는 애노테이션

- Java Config를 사용하게 되면, PlatformTransactionManager 구현체를 모두 찾아서 그 중 하나를 매핑해 사용함

- 특정 트랜잭션 매니저를 사용하려면, TransactionManagementConfigurer를 Java Config 파일에서 구현하고 원하는 트랜잭션 매니저를 리턴하도록 함

- 혹은, 특정 트랜잭션 매니저 객체 생성 시 @Primary 애노테이션을 지정함

 

3. Layered Architecture

서비스 객체에서 중복으로 호출되는 코드의 처리

- 데이터 엑세스 메소드를 별도의 Repository(DAO) 객체에서 구현하도록 하고 서비스는 Repository 객체를 사용하도록 함

 

- Presentation Layer (Controller)

- Service Layer (Business Logic)

- Repository Layer (DAO)

 

설정의 분리

- 각 레이어에 관련된 설정을 분리하는 것이 바람직함

- Spring 설정 파일을 Presentation 레이어와 나머지로 분리할 수 있음

- web.xml 파일에서 Presentation 레이어에 대한 Spring 설정은 DispatcherServlet이 읽도록 하고, 그 외의 설정은 ContextLoaderListener를 통해서 읽도록 함

- DispatcherServlet을 경우에 따라 2개 이상 설정할 수 있음

- 이 경우에는 각각의 DispatcherServlet의 ApplicationContext가 각각 독립적이기에 각각의 설정 파일에서 생성한 Bean을 서로 사용할 수 없음

- 위의 경우와 같이 동시에 필요한 Bean은 ContextLoaderListener를 사용함으로써 공통으로 사용하게 할 수 있음

- ContextLoaderListener와 DispatcherServlet은 각각 ApplicationContext를 생성함

- ContextLoaderListener가 생성하는 ApplicationContext가 Root Context가 되고, DispatcherServlet이 생성한 인스턴스는 Root Context를 부모로 하는 자식 Context가 됨

- 자식 Context들은 Root Context의 설정 Bean을 사용할 수 있음