레이어드 아키텍처 (1) 개념

Minkyeong Kim·2021년 12월 2일
0

[boostcourse] Web-Backend

목록 보기
43/55

URL은 다르지만 URL에 해당하는 웹페이지를 보여주기 위해 실행되는 부분 중 중복이 발생할 경우

  • 별도의 객체로 분리
  • 별도의 메소드로 분리

컨트롤러와 서비스

컨트롤러들이 중복적으로 호출되는 부분들을 별도의 객체인 서비스로 구현
업무와 관련된 메서드 -> 비즈니스 메서드라고 함

서비스 객체란?

  • 비지니스 로직(Business logic)을 수행하는 메소드를 가지고 있는 객체
  • 보통 하나의 비지니스 로직은 하나의 트랜잭션으로 동작함
  • 데이터 엑세스 메소드를 별도의 Repository(Dao) 객체에서 구현하도록 하고 Service는 Repository객체를 사용하도록 함

트랜잭션(Transaction)이란?

  • 하나의 논리적인 작업을 의미

특징

1) 원자성 (Atomicity)

  • 전체가 성공하거나 전체가 실패하는 것을 의미
  • 1~5번의 순서가 있는 작업이 4번에서 오류가 발생했다면 앞의 작업을 모두 원래대로 복원 시켜야 함(rollback), 5번까지 모두 성공했을 때만 정보를 모두 반영함(commit)
  • rollback 하거나 commit을 하게 되면 하나의 트랜잭션 처리가 완료됨

2) 일관성 (Consistency)

  • 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것
  • 트랜잭션이 진행되는 동안 데이터가 변경되더라도, 업데이트된 데이터로 트랜잭션이 진행되는 것이 아닌 처음에 트랜잭션을 진행하기 위해 참조한 데이터로 진행

3) 독립성 (Isolation)

  • 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우, 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산을 끼어들 수 없음
  • 하나의 특정 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없음

4) 지속성 (Durability)

  • 트랜잭션이 성공적으로 완료될 경우, 결과는 영구적으로 반영되어야 함

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

  • DB에 연결된 후 Connection객체의 setAutoCommit 메소드에 false를 파라미터로 지정(default로는 true라서 commit을 수행하지 않아도 데이터베이스에 바로 반영됨)
  • SQL문을 실행하고 모두 성공하고 조건이 만족했을 경우에 Connection의 commit() 메소드를 호출하면 트랜잭션 처리되도록 함

@EnableTransactionManagement

  • Spring Java Config파일에서 트랜잭션을 활성화 할 때 사용하는 애노테이션
  • Java Config를 사용하게 되면 PlatformTransactionManager 구현체를 모두 찾아 그 중 하나를 매핑해 사용함
  • 특정 트랜잭션 메니저를 사용하고자 한다면 TransactionManagementConfigurer를 Java Config파일에서 구현하고 원하는 트랜잭션 메니저를 리턴
  • 특정 트랜잭션 메니저 객체를 생성시 @Primary 애노테이션을 지정

레이어드 아키텍처

  • Presentation Layer: 컨트롤러 객체 동작
  • Service Layer: 비즈니스 메서드를 가지고 있는 서비스 객체 동작t6s5
  • Repository Layer: 실제 DB 접근(DAO)

설정의 분리

  • 재사용성을 위해 presentation layer와 service/Repository layer의 설정을 따로 관리해야 분리하기 편할 것

  • Spring 설정 파일을 프리젠테이션 레이어쪽과 나머지를 분리할 수 있습니다.

  • web.xml 파일에서 프리젠테이션 레이어에 대한 스프링 설정은 DispathcerServlet이 읽도록 하고, 그 외의 설정은 ContextLoaderListener를 통해서 읽도록 함

  • DispatcherServlet을 경우에 따라서 2개 이상 설정할 수 있는데 이 경우에는 각각의 DispathcerServlet의 ApplicationContext가 각각 독립적이기 때문에 각각의 설정 파일에서 생성한 빈을 서로 사용 불가

  • 동시에 필요한 빈은 ContextLoaderListener를 사용해 공통으로 사용 가능

  • ContextLoaderListener와 DispatcherServlet은 각각 ApplicationContext를 생성하는데, ContextLoaderListener가 생성하는 ApplicationContext가 root 컨텍스트가 되고, DispatcherServlet이 생성한 인스턴스는 root컨텍스트를 부모로 하는 자식 컨텍스트가 됨

  • 자식 컨텍스트들은 root 컨텍스트의 설정 빈 사용 가능

0개의 댓글