티스토리 뷰

URL은 다르지만 URL에 해당하는 웹페이지를 보여주기 위해 실행되는 부분중에서 중복이 되는 부분이 있다면?

- 별도로 객체를 분리한다.

- 별도의 메서드로 분리한다.

ex) 쇼핑몰에서, 게시판에서도 회원정보를 보여주고, 상품목록 보기에서도 회원정보를 보여줘야하는 경우의 회원정보를 읽어오는 코드 처리 방법

 

컨트롤러와 서비스

- 컨트롤러들이 중복적으로 호출되는 부분들별도의 객체인 서비스로 구현한다.

- 서비스 객체업무와 관련된 메서드들을 가지고 있는데, 이를 비즈니스 메서드라고 부른다.

 

- 상품 Service를 컨트롤러 1, 3에 각각 구현하는 것이 아닌, 상품에 관련된 비즈니스만 처리하는 상품 Service객체를 만들어 사용하게 구현한다.

 

 

서비스(Service) 객체

- 비즈니스 로직을 수행하는 메서드들을 가지는 객체

- 일반적으로 하나의 비즈니스 로직하나의 트랜잭션으로 동작한다.

 

 

트랜잭션(Transaction)

- 하나의 논리적인 작업을 트랜잭션이라고 부른다.

- 트랜잭션의 특징은 4가지로 나뉜다.

· 원자성(Atomicity)

· 일관성(Consitenc)

· 독자성(Isolation)

· 지속성(Durability)

 

원자성(Atomicity)

- 전체가 성공하거나 전체가 실패하는 것을 의미

- 예를 들어, '출금'이라는 흐름에서 생각해보면

1. 잔액 조회

2. 출금하려는 금액이 잔액보다 큰지 작은지 확인

3. 출금하려는 금액이 잔액보다 작다면(잔액 - 출금액)으로 수정한다.

4. 언제, 어디서 출금했는지 정보를 기록한다.

5. 사용자에게 출금한다.

- 위 과정을 따로 보면 안되고 1~5번 과정을 일련의 과정으로 보는 것을 '원자성'이라고 한다.

- 위 작업에서 4번에서 오류가 발생했다면, 앞의 작업들을 모두 원래대로 복원시켜야 한다. 이를 rollback이라고 한다. 5번까지 모두 성공했을 때만 정보를 반영해야한다. 이를 commit이라고 부른다. 이렇게 rollback 하거나 commit을 하게 되면 하나의 트랜잭션 처리가 완료된다.

 

일관성(Consitenc)

- 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
- 트랜잭션이 진행되는 동안에 데이터가 변경되더라도 업데이트된 데이터로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터로 진행한다.
- 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있다.

독자성(Isolation)

- 독립성은 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우에 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산을 끼어들 수 없다.

- 하나의 특정 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.

지속성(Durability)

- 지속성은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다.

 

 

JDBC에서 트랜잭션 처리하는 방법

- DB에 연결된 후 Connection 객체AutoCommit디폴트 True이다. 그래서 우리가 수정, 삭제 등을 할 때 별도로 Commit과 같은 명령을 수행하지 않아도 바로 데이터베이스에 반영되는 것을 확인 할 수 있었다.

- 여러개의 작업들이 끝나 모두 성공했어야지만 commit을 반영하겠다고 한다면 AutoCommitfalse로 바꿔주어야 한다.

- 그러기위해서  DB에 연결된 후 Connection객체의 setAutoCommit메소드false를 파라미터로 지정하고, 입력, 수정, 삭제 SQL이 실행을 한 후 모두 성공했을 경우 Connection이 가지고 있는 commit()메소드를 호출하면 된다.

 

 

@EnableTransactionManagement

- Spring에서는 이런 트랜잭션을 처리하기 위해 java config 파일에다 이 어노테이션을 이용해 수행하면 된다.

- Java Config 파일에서 트랜잭션을 활성화 할때 사용되는 어노테이션이다.

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

- 특정 트랜잭션 매니저를 사용하고자 한다면, TransactionManagementConfigurer를 Java Config 파일에서 구현하고, 원하는 트랜잭션 매니저를 리턴하면 된다.

- 아니면, 특정 트랜잭션 매니저 객체를 생성 할 때, @Primary라는 어노테이션을 사용해 지정 할 수 있다.

 

 

서비스 객체에서 중복으로 query 처리

- 서비스 객체마다 비즈니스 메서드를 가지고 있다.

- 하나의 비즈니스 메서드는 트랜잭션 단위로 수행된다.

- 비즈니스 메서드마다 중복되는 기능을 호출하는 경우도 생긴다.

- 이런 서비스 객체에서도 중복되는 부분은 별도의 객체나 메서드로 분리해서 사용하는것이 좋다. 

- 데이터 엑세스 메소드를 별도의 Repository(Dao) 객체에서 구현하도록 하고 Service는 Repository객체를 사용하도록 한다.

 

 

레이어드 아키텍쳐

 

- "Presentation Layer    ||    Service Layer    ||    Repository Layer" 이렇게 분리해서 설정, 구현해야 재사용, 유지보수 측면에서 효율적이다.

 

설정의 분리

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

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

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

위의 경우와 같이 동시에 필요한 빈은 ContextLoaderListener를 사용함으로써 공통으로 사용하게 할 수 있습니다.

ContextLoaderListener와 DispatcherServlet은 각각 ApplicationContext를 생성하는데, ContextLoaderListener가 생성하는 ApplicationContext가 root컨텍스트가 되고 DispatcherServlet이 생성한 인스턴스는 root컨텍스트를 부모로 하는 자식 컨텍스트가 됩니다.
참고로, 자식 컨텍스트들은 root컨텍스트의 설정 빈을 사용할 수 있습니다.

 

참고 사이트 : http://www.edwith.org/



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

댓글